From 226bc855052920dd929294d9f91dd916ad412c7e Mon Sep 17 00:00:00 2001 From: ldez Date: Tue, 21 Oct 2025 23:59:39 +0000 Subject: [PATCH] deploy: d64a8e21a7fcfe721c0bd0e4107ff9a12a465915 --- .nojekyll | 0 404.html | 68 + CNAME | 1 + android-chrome-192x192.png | Bin 0 -> 12142 bytes android-chrome-512x512.png | Bin 0 -> 46869 bytes apple-touch-icon.png | Bin 0 -> 11292 bytes casts/demo.cast | 19 + categories/index.html | 65 + categories/index.xml | 1 + contributing/architecture/index.html | 1 + contributing/debug/index.html | 1 + contributing/faq/index.html | 1 + contributing/new-linters/index.html | 1 + contributing/quick-start/index.html | 1 + contributing/website/index.html | 1 + contributing/workflow/index.html | 1 + ...124d13d69054b69976dcf1b5d377c9ebfc0b79.css | 1 + docs/configuration/cli/index.html | 424 + docs/configuration/file/index.html | 693 + docs/configuration/index.html | 109 + docs/configuration/index.xml | 1137 ++ docs/contributing/architecture/index.html | 234 + docs/contributing/debug/index.html | 118 + docs/contributing/faq/index.html | 125 + docs/contributing/index.html | 106 + docs/contributing/index.xml | 683 + docs/contributing/new-linters/index.html | 176 + docs/contributing/website/index.html | 147 + docs/contributing/workflow/index.html | 145 + docs/donate/index.html | 110 + docs/donate/index.xml | 1 + docs/formatters/configuration/index.html | 204 + docs/formatters/index.html | 111 + docs/formatters/index.xml | 231 + docs/index.html | 105 + docs/index.xml | 16915 ++++++++++++++++ docs/linters/configuration/index.html | 4139 ++++ docs/linters/false-positives/index.html | 195 + docs/linters/index.html | 114 + docs/linters/index.xml | 6749 ++++++ docs/plugins/go-plugins/index.html | 138 + docs/plugins/index.html | 101 + docs/plugins/index.xml | 230 + docs/plugins/module-plugins/index.html | 195 + docs/product/changelog/index.html | 455 + docs/product/index.html | 104 + docs/product/index.xml | 7214 +++++++ docs/product/migration-guide/index.html | 634 + docs/product/roadmap/index.html | 135 + docs/product/thanks/index.html | 362 + docs/welcome/faq/index.html | 134 + docs/welcome/index.html | 106 + docs/welcome/index.xml | 677 + docs/welcome/install/index.html | 172 + docs/welcome/integrations/index.html | 186 + docs/welcome/quick-start/index.html | 141 + donate/index.html | 1 + en.search-data.json | 1 + ...e82e1500343a7126260a0203f3a45bbe0876093.js | 8 + favicon-16x16.png | Bin 0 -> 691 bytes favicon-32x32.png | Bin 0 -> 1561 bytes favicon-dark.svg | 563 + favicon.ico | Bin 0 -> 372526 bytes favicon.svg | 563 + favicons.zip | Bin 0 -> 168123 bytes images/annotations.png | Bin 0 -> 92599 bytes images/colored-line-number.png | Bin 0 -> 60400 bytes images/demo.gif | Bin 0 -> 317958 bytes images/github-sponsors.svg | 1 + images/golangci-lint-logo-anim.gif | Bin 0 -> 3370633 bytes images/logo-circle.svg | 563 + images/logo-dark.svg | 3 + images/logo-nocircle.svg | 563 + images/logo.svg | 3 + images/open-collective.svg | 1 + images/thanks-dev.svg | 32 + index.html | 71 + ...c75266ab6b93f569ac2fb4f3dc66882e0416f4c.js | 96 + ...dc28562f494db314fb9c0a3e3ddab8bcca7d31b.js | 6 + ...eddf99b9706f09db3b59b260d0333b23b343c4b.js | 2811 +++ jsonschema/custom-gcl.jsonschema.json | 76 + jsonschema/golangci.jsonschema.json | 5081 +++++ jsonschema/golangci.next.jsonschema.json | 5136 +++++ jsonschema/golangci.v1.57.jsonschema.json | 3480 ++++ jsonschema/golangci.v1.58.jsonschema.json | 3638 ++++ jsonschema/golangci.v1.59.jsonschema.json | 3766 ++++ jsonschema/golangci.v1.60.jsonschema.json | 3792 ++++ jsonschema/golangci.v1.61.jsonschema.json | 3797 ++++ jsonschema/golangci.v1.62.jsonschema.json | 3860 ++++ jsonschema/golangci.v1.63.jsonschema.json | 4082 ++++ jsonschema/golangci.v1.64.jsonschema.json | 4224 ++++ jsonschema/golangci.v1.jsonschema.json | 4224 ++++ jsonschema/golangci.v2.0.jsonschema.json | 4738 +++++ jsonschema/golangci.v2.1.jsonschema.json | 4790 +++++ jsonschema/golangci.v2.2.jsonschema.json | 4901 +++++ jsonschema/golangci.v2.3.jsonschema.json | 4907 +++++ jsonschema/golangci.v2.4.jsonschema.json | 4929 +++++ jsonschema/golangci.v2.5.jsonschema.json | 5081 +++++ jsonschema/golangci.v2.jsonschema.json | 5081 +++++ plugins/go-plugins/index.html | 1 + plugins/module-plugins/index.html | 1 + product/changelog/index.html | 1 + product/migration-guide/index.html | 1 + product/roadmap/index.html | 1 + product/thanks/index.html | 1 + robots.txt | 1 + site.webmanifest | 20 + sitemap.xml | 1 + tags/index.html | 65 + tags/index.xml | 1 + usage/configuration/index.html | 1 + usage/false-positives/index.html | 1 + usage/formatters/index.html | 1 + usage/linters/index.html | 1 + welcome/faq/index.html | 1 + welcome/install/index.html | 1 + welcome/integrations/index.html | 1 + welcome/quick-start/index.html | 1 + 118 files changed, 129088 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 android-chrome-192x192.png create mode 100644 android-chrome-512x512.png create mode 100644 apple-touch-icon.png create mode 100644 casts/demo.cast create mode 100644 categories/index.html create mode 100644 categories/index.xml create mode 100644 contributing/architecture/index.html create mode 100644 contributing/debug/index.html create mode 100644 contributing/faq/index.html create mode 100644 contributing/new-linters/index.html create mode 100644 contributing/quick-start/index.html create mode 100644 contributing/website/index.html create mode 100644 contributing/workflow/index.html create mode 100644 css/compiled/main.min.c99eb1436102388d2cebf5474f124d13d69054b69976dcf1b5d377c9ebfc0b79.css create mode 100644 docs/configuration/cli/index.html create mode 100644 docs/configuration/file/index.html create mode 100644 docs/configuration/index.html create mode 100644 docs/configuration/index.xml create mode 100644 docs/contributing/architecture/index.html create mode 100644 docs/contributing/debug/index.html create mode 100644 docs/contributing/faq/index.html create mode 100644 docs/contributing/index.html create mode 100644 docs/contributing/index.xml create mode 100644 docs/contributing/new-linters/index.html create mode 100644 docs/contributing/website/index.html create mode 100644 docs/contributing/workflow/index.html create mode 100644 docs/donate/index.html create mode 100644 docs/donate/index.xml create mode 100644 docs/formatters/configuration/index.html create mode 100644 docs/formatters/index.html create mode 100644 docs/formatters/index.xml create mode 100644 docs/index.html create mode 100644 docs/index.xml create mode 100644 docs/linters/configuration/index.html create mode 100644 docs/linters/false-positives/index.html create mode 100644 docs/linters/index.html create mode 100644 docs/linters/index.xml create mode 100644 docs/plugins/go-plugins/index.html create mode 100644 docs/plugins/index.html create mode 100644 docs/plugins/index.xml create mode 100644 docs/plugins/module-plugins/index.html create mode 100644 docs/product/changelog/index.html create mode 100644 docs/product/index.html create mode 100644 docs/product/index.xml create mode 100644 docs/product/migration-guide/index.html create mode 100644 docs/product/roadmap/index.html create mode 100644 docs/product/thanks/index.html create mode 100644 docs/welcome/faq/index.html create mode 100644 docs/welcome/index.html create mode 100644 docs/welcome/index.xml create mode 100644 docs/welcome/install/index.html create mode 100644 docs/welcome/integrations/index.html create mode 100644 docs/welcome/quick-start/index.html create mode 100644 donate/index.html create mode 100644 en.search-data.json create mode 100644 en.search.min.097e3a24da0aba2ac82ef0f53e82e1500343a7126260a0203f3a45bbe0876093.js create mode 100644 favicon-16x16.png create mode 100644 favicon-32x32.png create mode 100644 favicon-dark.svg create mode 100644 favicon.ico create mode 100644 favicon.svg create mode 100644 favicons.zip create mode 100644 images/annotations.png create mode 100644 images/colored-line-number.png create mode 100644 images/demo.gif create mode 100644 images/github-sponsors.svg create mode 100644 images/golangci-lint-logo-anim.gif create mode 100644 images/logo-circle.svg create mode 100644 images/logo-dark.svg create mode 100644 images/logo-nocircle.svg create mode 100644 images/logo.svg create mode 100644 images/open-collective.svg create mode 100644 images/thanks-dev.svg create mode 100644 index.html create mode 100644 js/flexsearch.433e941a8a573ebb9931fc16fc75266ab6b93f569ac2fb4f3dc66882e0416f4c.js create mode 100644 js/main.min.ff7e61ddbaed1d0c971f6cc60dc28562f494db314fb9c0a3e3ddab8bcca7d31b.js create mode 100644 js/mermaid.min.07e37dfa97b337ccc85365d57eddf99b9706f09db3b59b260d0333b23b343c4b.js create mode 100644 jsonschema/custom-gcl.jsonschema.json create mode 100644 jsonschema/golangci.jsonschema.json create mode 100644 jsonschema/golangci.next.jsonschema.json create mode 100644 jsonschema/golangci.v1.57.jsonschema.json create mode 100644 jsonschema/golangci.v1.58.jsonschema.json create mode 100644 jsonschema/golangci.v1.59.jsonschema.json create mode 100644 jsonschema/golangci.v1.60.jsonschema.json create mode 100644 jsonschema/golangci.v1.61.jsonschema.json create mode 100644 jsonschema/golangci.v1.62.jsonschema.json create mode 100644 jsonschema/golangci.v1.63.jsonschema.json create mode 100644 jsonschema/golangci.v1.64.jsonschema.json create mode 100644 jsonschema/golangci.v1.jsonschema.json create mode 100644 jsonschema/golangci.v2.0.jsonschema.json create mode 100644 jsonschema/golangci.v2.1.jsonschema.json create mode 100644 jsonschema/golangci.v2.2.jsonschema.json create mode 100644 jsonschema/golangci.v2.3.jsonschema.json create mode 100644 jsonschema/golangci.v2.4.jsonschema.json create mode 100644 jsonschema/golangci.v2.5.jsonschema.json create mode 100644 jsonschema/golangci.v2.jsonschema.json create mode 100644 plugins/go-plugins/index.html create mode 100644 plugins/module-plugins/index.html create mode 100644 product/changelog/index.html create mode 100644 product/migration-guide/index.html create mode 100644 product/roadmap/index.html create mode 100644 product/thanks/index.html create mode 100644 robots.txt create mode 100644 site.webmanifest create mode 100644 sitemap.xml create mode 100644 tags/index.html create mode 100644 tags/index.xml create mode 100644 usage/configuration/index.html create mode 100644 usage/false-positives/index.html create mode 100644 usage/formatters/index.html create mode 100644 usage/linters/index.html create mode 100644 welcome/faq/index.html create mode 100644 welcome/install/index.html create mode 100644 welcome/integrations/index.html create mode 100644 welcome/quick-start/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/404.html b/404.html new file mode 100644 index 000000000000..eb0bc96270e5 --- /dev/null +++ b/404.html @@ -0,0 +1,68 @@ +404 Page not found – Golangci-lint
New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
\ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000000..6c92bff7c490 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +golangci-lint.run diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..89bf1582a2a3b8785ddeca66efbb51064178c6d0 GIT binary patch literal 12142 zcmW-nRa70z5{3tNhXBEKV6?jGFT*+`J!5?q5j1P=}g5+Jy{ySrb`edy_zUNzG- zwYs|g`l3{nq)`w*BLV<`A}b@I_A&STH{fAEo@y)ha32$bvy84A06>fWHy}791@{1e z6p)n=)$q<0zUs9K>3wlT5zo3Xz2!p0oJ zqf25Q!BftlOUkfEQ%YEIHehz%lP5q&Qcoi@wDvrY-+Nkd>RUFoXD;H)x{bF*{Nyhz zy+6BO>%3nzW5X|kXGOwoHrrb|`=YbS8II+fsVlTJdWnxb;%2FZKFZKNHj4N>$`I7o z+ov0j1&H5)dOPqLFQg1YvhD>b&MxTmYXMb523GUN-U=X! zck3U%>(*%G9SVa+dhvMi3tvPfkz9AV-BPQJJxnz$(A}g|r|Bq7A#9wufDtmf{>qWgfeP=B z3W?T~T1qXMXur5>skC4UZ+s2pXY95#wWPd@+O^qYS~RD0_B!{`R^yJDh%WM)Jd#i_ z_VMeDqy^FnzqfFlChRif_suIn3|*y-X0yQBRX4RBeoIIQ{*66`J7j_>#XQNWHvqaph3g{?v;RZa}KB7$>VH-{zijsK(t}9}iv$rO(h6qrQga(=m_J}37ua@8d0bAlJfN-|~8DBx=;r&VkJ z(WITlYxTs>lpp&JMFQ}P=8sX$XM;jGU;wmu77-Y`b$92QjsGNkjdZFSkw1@|XV zD}`rJF*tbILhY036cPfvTjJgI0PUFnH(94*`Nll#@174UY7sr+R0t}7QwB?hfPlv* zpFm55$HA2^JB7uSL)!Gs3Bg(SiId+WWVaGYWNmX+nFomkBnQs;<+|4O6rXCACA(MMWcyz3c;{i-hun;w3~BO=t|Kw9e(JuI$nndJE+ zU^5zG2RW4mX08MU&?@Vftem@YvgN{A&gVBTCCMVE7w}U0OUgXTL?!reYq3+KmxL)L z`fOWzc|4Lm zILkhv`C7jjLxDJOji`8c7kH zYz}b|0SO1K>iGl%n0=IrXe+zX=Tv*>)IqY|^IZ14e;OGR>m;!t2F{XfT=1M0T$~}o zmeo$=T4~2~Qp#7fTHgOmW zIuTZS%hcU)Gg^+9{c$~Kck5X@&2~A2KNVz7_4s_EHq|@r5i?EUPx>IHxhZYcQ}^^z zzb$?t{tH9V`OM_@-D~+b$CTSF*BFfAc($4qXcf2GxdFwINI1hc3DPIfz=Oz#Jj=rv zsZ7F@B{fkpJg%Su0;rbhr+%51N5DEgOCCH6G29#3%{ts2Pw$kL(bzR*bDlQxUH-N@ zGSa@eGuVKbm7_hV?)+UVYDwPnTDW)&Ue55vd(rk@-?pr5lLv;!v?KE{cC&mx^a3hs z39>iHNz_LKGDanoe|u#$s}`Gya#(uYmZ?bYqDZ_{W?XZ5m|z7H(bmA-126d`6BK5; zlANxXJ4{bb!ek^1YhOVrOZIjaFn{jZN$_GVB_zw|O1-h~VtN1x!9`v6^C%C}Q*((u zLsy8Gp)X!G3H}|5b{a}3FgY&Qg+I{c^Gm6}`A{Eh&t^)m4ZF2GPA4)FWt=n$aq~4G z_-fMOm+QzKuSgvflO=bCcg~-WT0!FYb@K`NZXb0)=MXj|ZJz=8=y85Q^2`)(GfE?; zsO-NO_du2xt?XkfjbCInMN|5R^sw+1@#3Y*$Fc8y9Y;Szj{%-fDHG(zH~diX0pI|d#-yMWEz_NdnD?Ig}TStg$MTITK-qlNe>hU>`*@0P4^c0+QpU&SzV zAe9e&%Y-81Zz`R-mZgsXb8A3APlLakR==0;2 zFhG>;NKF7oC!;Jc-R|r3EBLMIOO6Yh7J)GrWMdA4xBZ19v>o3p$ zVbREj8kF=h#veJ=cq@~G)QSdMUo_SruPvm6xTf_TIUY#F7K~k|2ff zK9(^@kDn@x`Du0C=E3Yfe$8vt4s!F4kMEN~Ekc@6hY4Ib*@+VdoI^Ev3$GUieDBm> zTgkAav}jz}YzI!8bAhN|sY_y*fjiiMg!lN1p#J?Y480py##|NTBam9ZWedsC2n+cdcT)-fagps^%e~^NMu2F{sF!{PSOKl*4hwp+QG^tGCPOOU9?mw8brQN0Dl)~>79ZTEMb)o$Z-}0gfCPf?# z%TaR#Bf_!*ySx(xQdnZ&UPP237Le~{*hYHVmfT*Gr!<`#Q{XyB~)WLs$go8 zh}zll@a0i_F(_Yjv`j-E>v?Kieme>Ib5w;i{n#TVqUZ}J_%_>n7InTAB9A0zRR6CQ z<2bsV*+{kf8F$EU{i40yF#J)jRW(f+MpJ%h6mhkmPb3QEVslDU2!v4zK>ief0Hc2u zxj7<+x#qxN$mV-^L|KH~a@6yClGbg90kz)tJ`0 z^Tomq(uaby9WUV{&^b)H>^1;+uP;_9WG+e*g@=!U@vBzX-=NlBdt0-6y~sqmhTg83 zEe7jJhPt*v;=kamBh|9`?b66APw>jW!Rb>A^&k5f40Q_kZ^68P)ZAouFO$E;H8os2 zn)oYjv|+X?U=4;XNq23Ps{o^%cQ)BvfQb(m>1KCogAwkVlxK%N3h_hVE;XTt_wREu zx}OEn1PiF}6c4lgl_C0*=eQ|}`ah1LI*DaRDN`NVv2iLGr3qmL5Wft^x;-#ORD`t> z(VG5-?@wq5c*|x{Oe8Q%be8+OXzGewfIE0SdPB~9i`Cs?H;Pqa-T17|zwz>4)#iW> z#7I7*QHM%&w7UHumKnbF$&RZKI6*|~ne`Q4!(pK8dY(KnBQMSieEr^$xSI$^Z|W_X zLJpvj_J1{$gMz)#UV&_}a>3Xee}*CMtP-oQ5A4p5>0+PYp;H}Nrg(MH5NM<2%Lo_T zcy|GXdbr2p;O59E&cXxO&{Y$Hz^ydRqy;zcXh4R$>TCr$MLlYljHAY>4Pz~ zZx~vSI2EXcShBllAZ#p#GJ5Y?gSvEY*_m34@?|$;SESF-z|5y&>nabQ9wT~M3T9D4 z<=T%N`;0`t(%)UvPo{M7B8L#qY^Sew9T>zwn<;%S&9L_c9Wl@{OpVAl}++iD_j)D<_twE4Ry3ZA?2*!*tFFfv)u*%+WY0+ZFE)?+JJrjcLiT&3c_6%C~SzyOm z<(RMXjb1r<_3QPwYom#}d?~x&pujGggZ{XOl79p>X6E!tAQ|&Q6h4o^!T)2rqf?+4 zRD-(Jj0TB>??5m3oWSMvF{8xmH2RVF@Hz0Qe*3k^~GrW zMq@vpnl?ZUNYQ!Nns%{z*UXmw!|rQ^{zBApzn_;j2YELoUJTXPcMt2oDCiP zdrqd4J`eYwm;OnOPc|+f#n9X)G$=WJqPUEMQPm*)svw@V*@Q^xrDa{Wy3MqjhMx)%VO?8?p`lLd0(s0kxpZcnP96WqA>gxn=HVE7MKGTm4wQoZ73@F1;J3pZ+j*s>+eOC2GVo0RKabJ(#yYM8nbCRQ7!+RN!uRH=I zby82tC|hE$&tNWIX7G0=;%{wb%n?Gq-NPnPQSVVb^9AJpVyvv9M)EpWclRf4^)L9e zCcwl=c{`{cTNpzLs@|1~(>49U{2COy2bFB@Zs(%J;J??)fS9CqvGUG<6a^xByJQ&K z>N|rI&1vw7Fr$Mx7|LjvDTHofOvsel`m@?uuWoIx)OygbD;fLO4C|5BW`Gzm%Z8Er z=V+}nR$x)=ht$(>2bFAUP{0r3TFA_mS!=biN4(9Wc%;at{Dq_HDL8RSUWz|X8hQ4@ z++8L#pi4lM=A5%NMbPvds;V{s17t7hjl?2n@xFmpd}MEe-c*SSXJ^#9n@vA}>5<&=6Io*nSi@%^?l|w;^JzG=DC) zD8Usa9GA~`)2v%o`FqOdU-RPH<&xSW`hM$;#J$JfV$lLyO(Y2<++}WR#zT1|S6lg+ z5dJGFUpF#TqtRcZ>h@HSJ!zH8c$MBxMuWhL2`#3T#Gio(Q#(7oiv@ za30AuxR5(HC}6yD2>aPU5w;j=B(t)aT0l;z|7ON;fuUg*wwM(<*4SHeI2ZdCuU7C`FiM6~YRMenbdU9hvn& zJZOWW8evY&1*ADi5(t%R(2}JZ4hEPK8tu6|gh8kK1dI{rrfx+;*gL+{ zKQ)^BU}lKj-EOMp!mrNnLGyln&b6%m^|9gh`CajZWQ)=ZEqSSu5@%qI@AhS33bv6k z)Sqv2Nev~ye=iH3UW`xSD8^eg-IZt@J-_Qv;`y7&N>GlF&eok(30n8Adp5=)CsEGk zJD^X!`@br1OxY~Ea2psEjLKYLMPAch<0$_15ekHgS=l67aHVyni*`>^bM5Y`7c+0 zZ#iHG8@OmR;PDEPJWq@H8q<%F!X1KL<6J$sy2}=J`1PjHD54A$m@X|+><4ATS3jM} zw|Tk8C>3*0lx1McJa|_?zBmO2EM%F5{ryj1qyA7xYi>neein^kAd45{BI{a4_Fp#f z_iME>YjvFog<*Rlba1(zORppuV3ddROkAB^xb}uS-?EkoROw!Kcd2QY{WA~wkO4>F zgAdC8Z^;JQyhv(6I`ExHP8cNww0`zJ-%BtoBl35cH(O%nI!<(|(G ztW%WZe~x?WDfpSOJ)#2pC1MWha)dbQVqw)!XTH_*b^VrD!7G5n+^@JbrV*d;ln;ei zK2I_ncG9+-l|joB=%25-d7fN2i^GeMMh>#w-IYZF|A__vTua(22238SfgXrzILsl0 z30g}!pLT27C_J_}L>@fes?eNvvcJ?_=P6SC7aJBy`~IL*z;bV5SFNsN_~;=OO&CxacIVL0COWXbb5GLx|*+~>AR5fkU40!O%t^Ay>Yr?u9oS=&rcD8tE?A7W`~> zGI|<5m=K}nI&=(!G=$rXB3elk4D=)$XMqyB_nbd8L;EQ*x?lr#Qo0S+P=4i%&8J5v z99_dRy|x)KgM@%KfA-i-(H5T;q}nKTYZ4=kj@07?`0r>C4i9gy!@QYDzP3Ot`%U&| zghg!>pxfb{BPC-ec-UvBtH|Ef%7E{670|idmp2YQ18t^MwWu9txKMAR?8A8fF-dR_Tc`mjpq2h15V~lO%ty;fKJR zv~r2BN9u!l1TjglzEGZt5vQb{`HQ_9>)cu;BFcF4% z4m!%3SW3ftI;l*_6#gOyXn*5s2r&Ufr~n18FlmNbp#!Ro%jVg@<(9RmwSht`PTaj2 z^wxDgX-&t!2N2ckSUuk=oUj1}9_EfVd+AbZ~;0S7SN}|w5$`fYoEE7e~_x&xOT0DTD zQc4JHY)Dp z)9&%b)^vaUb$T*iF2EXc@(WNlVs65xQ^^qn$^;D1z^yi!NPeLXYB}K-bc_(-j*aC( zs%a~uY*otVPFzdu$#d@tVR9OQ_W&=kk}8vTR^GHgI8qT&#(vm3dPrc0Z61nL+%5Rt zOsnkT2z$IvEISp*=O4_~o2poc_r(;czI-A4BBLU@^-V}T2Zu<sM?t&Zn zvpliFC?yHAu4wXP?HPAW*U0=?T#=W*r%zt*&g>61ahM8qB^a?za$Lad77kzs#oR-R z6iIqZ+W}zJBE<26gHx!ejGY`a`p3W#Aw5j!S*nXg!6;oL$mMlu6qOVO-0payx7{CK zb_#C%5i{v?nj%%CCNCftalW(!_Oc#6K>;J(hcMtsf4d@L01yo#r^q`xSNpz~`9@K; z6l(Y!``8QySbWD#ea*nNXZ$Ob7oTh|J4nKg%v(iIA*#s;F_{2`8GJzJ4O3mm^bQg{ zjk-{P%T0s4WJEtSIMoLLXxRU;04-C7FLwtPM@zq-m*O*b)M)}BfSA74A3f5@Su)Wk zg2~2mYlgp;TH(snBQ}Sp9R|Hq*LTz(zBfaqbiqCNtr9|EXz4!!Q7g$l%^ZlBE^X~`+s6#TrHeU0KtZG+71-w5IlP_TRw(_A6^sJTLy534k zN%F6ry!Gi0wK4#No`7)`HxN@UAh!PXjM+7W77k!xn!oU8Ni&26PGa@gwTUz+fkTl8 z+6IAr?T7Nu7WDx|+`x@tLr&N6p35*9#Kz?C^x^gR-Z(daPR)7nsh*c-O6b-NvSXbT zSW2m}ci0QN_Jsug7H=DR4Je@?0LoUlQ~P;Cc061|JP;?}s&q?R-S0>0b_Dt?urV#~ z%pAhOfRD+Z(YBf2#~_JCvkWb!nZS00Kp{=^|M3Y((50i;Ixt2ybCxj79zvBn#z zcz{Zqx&{CE&kN^R%eu`|(x}fO!ATh(eK$!4bUo5XI~kWCTSpndJK6ByzB9+HbgGAE z8@i4j77VB6Y6uxWr+(n`GJ7?)Q-0`XBMLk%hS7!%=iq(+n;b!v%`cQLOYcYZGOzWRsxIHbBw zy+Di&5a;rZz<^z5&k)`|4xcINt(v&2Bd-M{ZBDR@dUC?9Ue|B)7s&lZfl?$dM3 zpNDjOupbmT0*?TU?>gT+4wjDJ`l5<@%%gmk7w&$0cHt220l=M;AmG(88dA^_q3b?g$m@-w6*-O6TA854;?6Sa>Ocd{eI6 zAm2HGym7Gue5>u#{XGT_KxN(=i2NGd8~R#>^0#}1nEkti6xGLn!PErMd%p`?BYqvt zu45vko2YYm{^<0wU*(-ID6fAZ=3@OYSiqHgk9&tqKsr%pO#xb1+sNz^DD4^<<39F+ zn^QKqV&L?ApCv;Oh5_jPKcNB~zh$NWO=KCY9E3vx7LjClHI*K*o3JQYUK#D9FyP$E zX5a6MJ}e%54)@qW4;H>9ZR=Lijd7@)|E0fW4O2HsCkDVJv)&}14L=kz z<Td`&85qv9Z{OW*%0yr8xy}f@7zm`vzzpd$L4%I=Npwz75 z?h>prbvv`p4N7MocURdFtq(J4={!8Toi6_2PER5I08;u80Plc}_io30uYJ!Vwyp*X z4-r5FCQ56)XZ)O|fSm0l%CnF1`_fdsBl#IAJ5sQc~rSgf9!z%;zy0M!n90~S0}oSe!FIkJoJ|Iv>WN(1UL z6rfeii8x0jPaGDnW}-One!XtlMPI;#<8gnAGY}%d`GF%!Vk|E=wCwNJ*_DAfaW-3W zpyz4Nq-d%1XS#&W%~<=b+XkM>S#mJ(FiK;dMECqXT zdYuqmfd>A=0chWeYmWG{E10JyU}=G_Mu+@!G1$dQs*Wn>cXLyiw!ipDHv=!O+t6j| zsDKNca@!)X2?dZis73RoF4S;0h~?-_=1<&`b)W>?Pk*VT1xR<$igqXU4FG^n1J{ui z$KU@=hY2@x_9R(|^W`bUtERb%k2MzGT(Cn8bL{)gru)7#H|229H2?m-HLkj%aw z`Saasga+l}P=KfATq)L3$do!M1R25+BzTuwgliTK5D@#ceC-Q>8<7Vu4B%?-60AN7Vk0)&1IdloiC^@2Jvm91Eh6X+%cc>I7QylI4TKz%ODe_H3z7+5LC5ww38^d%i1{>3^A`Xkw%}4kMRvv}RtL$m^syo~Mgzh`xb+^sCS$l&d!^qfSjsOFpc0LtH0@-{ z>TL<^h%oKqSNJdoP`e;O-qh&=BW%!e#(H&`-tfLdzv11Oy28%~%X!umqv1}noivI_nqO5}r@l9zZ*+6`_V;Mu9|KT5qgQqtCaj#2VllA& zm*0hg>LKadY=2W~tDg)U&BwxuEb{4bNg`K<=a|8_8rB~<7o-TXHuMS2P7(A=CVtu^ zW*;O;W3?aRte?idtmA+MSUmZq_yshz?+K*37}l-fgABKoc~V5sZixX=$5X^AuZ&En z0>0YrK&W}@andx-sX<~oAOSa~3*rYKm-V%f_`|UVAfkj00!H%U8dHSrZI!TlFXLIW zou$swy2$Km=mQVdWDgsiz)OILUy;^&oW=?%_kz;?#%>7AEdXDKg-jPOq4xk%97~*t zTs97_ZuUVkV3jxxSG-wd5U2gfqief#Z5Ala)4bk}QnDX~>K-@4OSUudVtC1(f{fv{ z7pBChu3QZv-{c~b4fbJ+XT(o{Mt`5?+pK)2Ja6c!=suLm{vfQ4EdqA$QZ6`mUmA|G z`Ui-=5A=jwjFbBv=n+nLkhg*=IvXWOLf7J>U!cip^aI}@3 ziE9v?QHd@1kWy+wn#Xrt1HF#Ifs1$;7EdCOe3q#BuvgaI=RV`oGaHZpTEMcGmZ`$M zI${4lV7(d1zlfS|BF?V|lvnLW>+P5-DiGv4K!-tNOd~NmPVgv_vV4XH=#b*SfiNhxh7=2_+ceTY%BYVLZhGNs0g_aUcmDzk z$;6=c`^Fmn+UkIL=-Kk}i4EQ(O8=#*QNawtt?$mq(-YO1Lf?8r;f={`}3JgKl^elQ`hAnz{74$%PV`C8$oH+ zE*?puGt^5CU1}Co)j1B|^O<661nl9Lf~d*=>>lI7z!Kk%)1t0_z4B)gW! z4~1-J=`HT}v;H9UWQzQxei&2O0BZFr?XB6HKOA6Ia_XS2x1?w1WBb$MAKl@<7{#v0 z;gjaFKD!^%r{x~E=&;>vez~S6Mz(3%G1>c%E)d zO}12Ar}UUv}V1z9HJX3)jOA?2WG$3^*LA<~(WFZ!xNAB5d^bwOeh@@;k3G{O&wc zwvpewF-XEI?t5NlIO%blnx)sVaTvR1tnY#Q33Pd&D=w_9bMb*GQPp++s$ROypF6f! zfw~!f>Wsfx^ssJlA*X5BzF!QmHg6f@M8gl6{|!ILaWiw-R2s+`v%3K;yf<+e{l4sy zfAV^}%xBXX2g{ix)U0KAzc_bvf-yTd{#oRL`GKM$KJRrr^;MUoYQ-UpnM3-htA5X8 z0pY?7&!kShAfDfU5A)_3ZBDzZ_Vx)6o7y+X!C{#=%N7$>i@4e$N{T&jAHpwg=5E1& z=>F{L)d9KJuJ`6F{FTVpeld@)?&_f6fx;^DbQrvj0zR)VralZkojq;L^$K;DQP$Kn zd>nqNsLiL2tr7~XDUUFaAQ5U2NeLOgWPc|D;AHtXwEH;q@xQSp1yezA|) zydHy_64o`IMKNbjT_#n852qAR$a7rbK8db=wz^;P$^UVF*3VzyhE`s|kE7|f1v!(r z&@XHhBY3k-RbCz3z5RZH--XrmzT+bhYV~|7)B$z=WcK`~>wOPLP+`moy;_9#Doj%w Wd6k5UIr;(61G17z5;bBbA^!us2p<~& literal 0 HcmV?d00001 diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..b804be5b140456e7525401795ae35cd4ad61e761 GIT binary patch literal 46869 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

?Wa9;$eGwTWM8*k-O&?OchU0BijA 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 S4gRYD0000Categories – Golangci-lint

New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
\ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 000000000000..641585b7ef09 --- /dev/null +++ b/categories/index.xml @@ -0,0 +1 @@ +Golangci-lint – Categorieshttps://golangci-lint.run/categories/Recent content in Categories on Golangci-lintHugo -- gohugo.ioen-us \ No newline at end of file diff --git a/contributing/architecture/index.html b/contributing/architecture/index.html new file mode 100644 index 000000000000..d1cf69973658 --- /dev/null +++ b/contributing/architecture/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/architecture/ \ No newline at end of file diff --git a/contributing/debug/index.html b/contributing/debug/index.html new file mode 100644 index 000000000000..40848e7d198c --- /dev/null +++ b/contributing/debug/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/debug/ \ No newline at end of file diff --git a/contributing/faq/index.html b/contributing/faq/index.html new file mode 100644 index 000000000000..0676d79499c8 --- /dev/null +++ b/contributing/faq/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/faq/ \ No newline at end of file diff --git a/contributing/new-linters/index.html b/contributing/new-linters/index.html new file mode 100644 index 000000000000..efabfd441d06 --- /dev/null +++ b/contributing/new-linters/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/new-linters/ \ No newline at end of file diff --git a/contributing/quick-start/index.html b/contributing/quick-start/index.html new file mode 100644 index 000000000000..a28245028547 --- /dev/null +++ b/contributing/quick-start/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/ \ No newline at end of file diff --git a/contributing/website/index.html b/contributing/website/index.html new file mode 100644 index 000000000000..edcf135ad3c0 --- /dev/null +++ b/contributing/website/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/website/ \ No newline at end of file diff --git a/contributing/workflow/index.html b/contributing/workflow/index.html new file mode 100644 index 000000000000..d4ce86ae9d16 --- /dev/null +++ b/contributing/workflow/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/contributing/workflow/ \ No newline at end of file diff --git a/css/compiled/main.min.c99eb1436102388d2cebf5474f124d13d69054b69976dcf1b5d377c9ebfc0b79.css b/css/compiled/main.min.c99eb1436102388d2cebf5474f124d13d69054b69976dcf1b5d377c9ebfc0b79.css new file mode 100644 index 000000000000..b1713a7fd7b8 --- /dev/null +++ b/css/compiled/main.min.c99eb1436102388d2cebf5474f124d13d69054b69976dcf1b5d377c9ebfc0b79.css @@ -0,0 +1 @@ +:root{--hextra-max-page-width:100%;--hextra-max-navbar-width:90rem;--hextra-max-footer-width:90rem}.hextra-max-page-width{max-width:var(--hextra-max-page-width)}.hextra-max-navbar-width{max-width:var(--hextra-max-navbar-width)}.hextra-max-footer-width{max-width:var(--hextra-max-footer-width)}/*!tailwindcss v4.1.11 | MIT License | https://tailwindcss.com*/@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--hx-font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--hx-font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--hx-color-red-100:oklch(93.6% .032 17.717);--hx-color-red-200:oklch(88.5% .062 18.334);--hx-color-red-900:oklch(39.6% .141 25.723);--hx-color-orange-50:oklch(98% .016 73.684);--hx-color-orange-100:oklch(95.4% .038 75.164);--hx-color-orange-300:oklch(83.7% .128 66.29);--hx-color-orange-400:oklch(75% .183 55.934);--hx-color-orange-800:oklch(47% .157 37.304);--hx-color-amber-100:oklch(96.2% .059 95.617);--hx-color-amber-200:oklch(92.4% .12 95.746);--hx-color-amber-900:oklch(41.4% .112 45.904);--hx-color-yellow-50:oklch(98.7% .026 102.212);--hx-color-yellow-100:oklch(97.3% .071 103.193);--hx-color-yellow-200:oklch(94.5% .129 101.54);--hx-color-yellow-700:oklch(55.4% .135 66.442);--hx-color-yellow-900:oklch(42.1% .095 57.708);--hx-color-green-100:oklch(96.2% .044 156.743);--hx-color-green-200:oklch(92.5% .084 155.995);--hx-color-green-900:oklch(39.3% .095 152.535);--hx-color-blue-100:oklch(93.2% .032 255.585);--hx-color-blue-200:oklch(88.2% .059 254.128);--hx-color-blue-900:oklch(37.9% .146 265.522);--hx-color-indigo-100:oklch(93% .034 272.788);--hx-color-indigo-200:oklch(87% .065 274.039);--hx-color-indigo-900:oklch(35.9% .144 278.697);--hx-color-purple-100:oklch(94.6% .033 307.174);--hx-color-purple-200:oklch(90.2% .063 306.703);--hx-color-purple-900:oklch(38.1% .176 304.987);--hx-color-slate-50:oklch(98.4% .003 247.858);--hx-color-slate-100:oklch(96.8% .007 247.896);--hx-color-slate-900:oklch(20.8% .042 265.755);--hx-color-gray-50:oklch(98.5% .002 247.839);--hx-color-gray-100:oklch(96.7% .003 264.542);--hx-color-gray-200:oklch(92.8% .006 264.531);--hx-color-gray-300:oklch(87.2% .01 258.338);--hx-color-gray-400:oklch(70.7% .022 261.325);--hx-color-gray-500:oklch(55.1% .027 264.364);--hx-color-gray-600:oklch(44.6% .03 256.802);--hx-color-gray-700:oklch(37.3% .034 259.733);--hx-color-gray-800:oklch(27.8% .033 256.848);--hx-color-gray-900:oklch(21% .034 264.665);--hx-color-neutral-50:oklch(98.5% 0 0);--hx-color-neutral-200:oklch(92.2% 0 0);--hx-color-neutral-300:oklch(87% 0 0);--hx-color-neutral-400:oklch(70.8% 0 0);--hx-color-neutral-500:oklch(55.6% 0 0);--hx-color-neutral-600:oklch(43.9% 0 0);--hx-color-neutral-700:oklch(37.1% 0 0);--hx-color-neutral-800:oklch(26.9% 0 0);--hx-color-neutral-900:oklch(20.5% 0 0);--hx-color-black:#000;--hx-color-white:#fff;--hx-spacing:.25rem;--hx-breakpoint-xl:80rem;--hx-container-6xl:72rem;--hx-text-xs:.75rem;--hx-text-xs--line-height:calc(1/.75);--hx-text-sm:.875rem;--hx-text-sm--line-height:calc(1.25/.875);--hx-text-base:1rem;--hx-text-base--line-height:calc(1.5/1);--hx-text-lg:1.125rem;--hx-text-lg--line-height:calc(1.75/1.125);--hx-text-xl:1.25rem;--hx-text-xl--line-height:calc(1.75/1.25);--hx-text-2xl:1.5rem;--hx-text-2xl--line-height:calc(2/1.5);--hx-text-3xl:1.875rem;--hx-text-3xl--line-height:calc(2.25/1.875);--hx-text-4xl:2.25rem;--hx-text-4xl--line-height:calc(2.5/2.25);--hx-text-5xl:3rem;--hx-text-5xl--line-height:1;--hx-font-weight-normal:400;--hx-font-weight-medium:500;--hx-font-weight-semibold:600;--hx-font-weight-bold:700;--hx-font-weight-extrabold:800;--hx-tracking-tighter:-.05em;--hx-tracking-tight:-.025em;--hx-leading-tight:1.25;--hx-radius-xs:.125rem;--hx-radius-sm:.25rem;--hx-radius-md:.375rem;--hx-radius-lg:.5rem;--hx-radius-xl:.75rem;--hx-radius-3xl:1.5rem;--hx-ease-in:cubic-bezier(.4,0,1,1);--hx-ease-out:cubic-bezier(0,0,.2,1);--hx-ease-in-out:cubic-bezier(.4,0,.2,1);--hx-blur-md:12px;--hx-default-transition-duration:.15s;--hx-default-transition-timing-function:cubic-bezier(.4,0,.2,1);--hx-default-font-family:var(--hx-font-sans);--hx-default-mono-font-family:var(--hx-font-mono);--hx-color-primary-50:hsl(var(--primary-hue)var(--primary-saturation)calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness))/50)*47));--hx-color-primary-100:hsl(var(--primary-hue)var(--primary-saturation)calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness))/50)*44));--hx-color-primary-200:hsl(var(--primary-hue)var(--primary-saturation)calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness))/50)*36));--hx-color-primary-300:hsl(var(--primary-hue)var(--primary-saturation)calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness))/50)*27));--hx-color-primary-400:hsl(var(--primary-hue)var(--primary-saturation)calc(var(--primary-lightness) + calc(calc(100% - var(--primary-lightness))/50)*16));--hx-color-primary-500:hsl(var(--primary-hue)var(--primary-saturation)var(--primary-lightness));--hx-color-primary-600:hsl(var(--primary-hue)var(--primary-saturation)calc(calc(var(--primary-lightness)/50)*45));--hx-color-primary-700:hsl(var(--primary-hue)var(--primary-saturation)calc(calc(var(--primary-lightness)/50)*39));--hx-color-primary-800:hsl(var(--primary-hue)var(--primary-saturation)calc(calc(var(--primary-lightness)/50)*32));--hx-color-primary-900:hsl(var(--primary-hue)var(--primary-saturation)calc(calc(var(--primary-lightness)/50)*24));--hx-color-dark:#111}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--hx-default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--hx-default-font-feature-settings,normal);font-variation-settings:var(--hx-default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--hx-default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--hx-default-mono-font-feature-settings,normal);font-variation-settings:var(--hx-default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.hx\:pointer-events-none{pointer-events:none}.hx\:sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.hx\:absolute{position:absolute}.hx\:relative{position:relative}.hx\:sticky{position:sticky}.hx\:inset-x-0{inset-inline:calc(var(--hx-spacing)*0)}.hx\:inset-y-0{inset-block:calc(var(--hx-spacing)*0)}.hx\:top-0{top:calc(var(--hx-spacing)*0)}.hx\:top-8{top:calc(var(--hx-spacing)*8)}.hx\:top-16{top:calc(var(--hx-spacing)*16)}.hx\:top-\[40\%\]{top:40%}.hx\:top-full{top:100%}.hx\:right-0{right:calc(var(--hx-spacing)*0)}.hx\:bottom-0{bottom:calc(var(--hx-spacing)*0)}.hx\:left-\[24px\]{left:24px}.hx\:left-\[36px\]{left:36px}.hx\:z-20{z-index:20}.hx\:z-\[-1\]{z-index:-1}.hx\:order-last{order:9999}.hx\:m-\[11px\]{margin:11px}.hx\:mx-1{margin-inline:calc(var(--hx-spacing)*1)}.hx\:mx-4{margin-inline:calc(var(--hx-spacing)*4)}.hx\:mx-auto{margin-inline:auto}.hx\:my-1\.5{margin-block:calc(var(--hx-spacing)*1.5)}.hx\:my-2{margin-block:calc(var(--hx-spacing)*2)}.hx\:-mt-20{margin-top:calc(var(--hx-spacing)*-20)}.hx\:mt-1{margin-top:calc(var(--hx-spacing)*1)}.hx\:mt-1\.5{margin-top:calc(var(--hx-spacing)*1.5)}.hx\:mt-2{margin-top:calc(var(--hx-spacing)*2)}.hx\:mt-4{margin-top:calc(var(--hx-spacing)*4)}.hx\:mt-5{margin-top:calc(var(--hx-spacing)*5)}.hx\:mt-6{margin-top:calc(var(--hx-spacing)*6)}.hx\:mt-8{margin-top:calc(var(--hx-spacing)*8)}.hx\:mt-12{margin-top:calc(var(--hx-spacing)*12)}.hx\:mt-16{margin-top:calc(var(--hx-spacing)*16)}.hx\:-mr-2{margin-right:calc(var(--hx-spacing)*-2)}.hx\:mr-1{margin-right:calc(var(--hx-spacing)*1)}.hx\:mr-2{margin-right:calc(var(--hx-spacing)*2)}.hx\:-mb-0\.5{margin-bottom:calc(var(--hx-spacing)*-.5)}.hx\:mb-2{margin-bottom:calc(var(--hx-spacing)*2)}.hx\:mb-4{margin-bottom:calc(var(--hx-spacing)*4)}.hx\:mb-6{margin-bottom:calc(var(--hx-spacing)*6)}.hx\:mb-8{margin-bottom:calc(var(--hx-spacing)*8)}.hx\:mb-10{margin-bottom:calc(var(--hx-spacing)*10)}.hx\:mb-12{margin-bottom:calc(var(--hx-spacing)*12)}.hx\:mb-16{margin-bottom:calc(var(--hx-spacing)*16)}.hx\:-ml-2{margin-left:calc(var(--hx-spacing)*-2)}.hx\:ml-4{margin-left:calc(var(--hx-spacing)*4)}.hx\:line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.hx\:block{display:block}.hx\:flex{display:flex}.hx\:grid{display:grid}.hx\:hidden{display:none}.hx\:inline{display:inline}.hx\:inline-block{display:inline-block}.hx\:inline-flex{display:inline-flex}.hx\:aspect-auto{aspect-ratio:auto}.hx\:h-0{height:calc(var(--hx-spacing)*0)}.hx\:h-2{height:calc(var(--hx-spacing)*2)}.hx\:h-3\.5{height:calc(var(--hx-spacing)*3.5)}.hx\:h-4{height:calc(var(--hx-spacing)*4)}.hx\:h-5{height:calc(var(--hx-spacing)*5)}.hx\:h-7{height:calc(var(--hx-spacing)*7)}.hx\:h-10{height:calc(var(--hx-spacing)*10)}.hx\:h-16{height:calc(var(--hx-spacing)*16)}.hx\:h-\[18px\]{height:18px}.hx\:h-full{height:100%}.hx\:max-h-\(--menu-height\){max-height:var(--menu-height)}.hx\:max-h-64{max-height:calc(var(--hx-spacing)*64)}.hx\:max-h-\[calc\(100vh-var\(--navbar-height\)-env\(safe-area-inset-bottom\)\)\]{max-height:calc(100vh - var(--navbar-height) - env(safe-area-inset-bottom))}.hx\:max-h-\[min\(calc\(50vh-11rem-env\(safe-area-inset-bottom\)\)\,400px\)\]{max-height:min(calc(50vh - 11rem - env(safe-area-inset-bottom)),400px)}.hx\:min-h-\[100px\]{min-height:100px}.hx\:min-h-\[calc\(100vh-var\(--navbar-height\)\)\]{min-height:calc(100vh - var(--navbar-height))}.hx\:w-2{width:calc(var(--hx-spacing)*2)}.hx\:w-3\.5{width:calc(var(--hx-spacing)*3.5)}.hx\:w-4{width:calc(var(--hx-spacing)*4)}.hx\:w-10{width:calc(var(--hx-spacing)*10)}.hx\:w-64{width:calc(var(--hx-spacing)*64)}.hx\:w-\[110\%\]{width:110%}.hx\:w-\[180\%\]{width:180%}.hx\:w-full{width:100%}.hx\:w-max{width:max-content}.hx\:w-screen{width:100vw}.hx\:max-w-6xl{max-width:var(--hx-container-6xl)}.hx\:max-w-\[50\%\]{max-width:50%}.hx\:max-w-\[90rem\]{max-width:90rem}.hx\:max-w-\[min\(calc\(100vw-2rem\)\,calc\(100\%\+20rem\)\)\]{max-width:min(100vw - 2rem,100% + 20rem)}.hx\:max-w-full{max-width:100%}.hx\:max-w-none{max-width:none}.hx\:max-w-screen-xl{max-width:var(--hx-breakpoint-xl)}.hx\:min-w-0{min-width:calc(var(--hx-spacing)*0)}.hx\:min-w-\[18px\]{min-width:18px}.hx\:min-w-\[24px\]{min-width:24px}.hx\:min-w-full{min-width:100%}.hx\:shrink-0{flex-shrink:0}.hx\:grow{flex-grow:1}.hx\:origin-center{transform-origin:50%}.hx\:cursor-default{cursor:default}.hx\:cursor-pointer{cursor:pointer}.hx\:scroll-my-6{scroll-margin-block:calc(var(--hx-spacing)*6)}.hx\:scroll-py-6{scroll-padding-block:calc(var(--hx-spacing)*6)}.hx\:list-none{list-style-type:none}.hx\:appearance-none{appearance:none}.hx\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.hx\:flex-col{flex-direction:column}.hx\:flex-wrap{flex-wrap:wrap}.hx\:items-center{align-items:center}.hx\:items-start{align-items:flex-start}.hx\:justify-between{justify-content:space-between}.hx\:justify-center{justify-content:center}.hx\:justify-end{justify-content:flex-end}.hx\:justify-start{justify-content:flex-start}.hx\:justify-items-start{justify-items:start}.hx\:gap-1{gap:calc(var(--hx-spacing)*1)}.hx\:gap-2{gap:calc(var(--hx-spacing)*2)}.hx\:gap-4{gap:calc(var(--hx-spacing)*4)}.hx\:gap-x-1\.5{column-gap:calc(var(--hx-spacing)*1.5)}.hx\:gap-x-2{column-gap:calc(var(--hx-spacing)*2)}.hx\:gap-y-1{row-gap:calc(var(--hx-spacing)*1)}.hx\:gap-y-2{row-gap:calc(var(--hx-spacing)*2)}.hx\:overflow-auto{overflow:auto}.hx\:overflow-hidden{overflow:hidden}.hx\:overflow-x-auto{overflow-x:auto}.hx\:overflow-x-hidden{overflow-x:hidden}.hx\:overflow-y-auto{overflow-y:auto}.hx\:overflow-y-hidden{overflow-y:hidden}.hx\:overscroll-contain{overscroll-behavior:contain}.hx\:overscroll-x-contain{overscroll-behavior-x:contain}.hx\:rounded-3xl{border-radius:var(--hx-radius-3xl)}.hx\:rounded-full{border-radius:3.40282e38px}.hx\:rounded-lg{border-radius:var(--hx-radius-lg)}.hx\:rounded-md{border-radius:var(--hx-radius-md)}.hx\:rounded-sm{border-radius:var(--hx-radius-sm)}.hx\:rounded-xl{border-radius:var(--hx-radius-xl)}.hx\:rounded-xs{border-radius:var(--hx-radius-xs)}.hx\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.hx\:border{border-style:var(--tw-border-style);border-width:1px}.hx\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.hx\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.hx\:border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.hx\:border-amber-200{border-color:var(--hx-color-amber-200)}.hx\:border-black\/5{border-color:var(--hx-color-black)}@supports (color:color-mix(in lab, red, red)){.hx\:border-black\/5{border-color:color-mix(in oklab,var(--hx-color-black)5%,transparent)}}.hx\:border-blue-200{border-color:var(--hx-color-blue-200)}.hx\:border-gray-200{border-color:var(--hx-color-gray-200)}.hx\:border-gray-500{border-color:var(--hx-color-gray-500)}.hx\:border-green-200{border-color:var(--hx-color-green-200)}.hx\:border-indigo-200{border-color:var(--hx-color-indigo-200)}.hx\:border-orange-100{border-color:var(--hx-color-orange-100)}.hx\:border-purple-200{border-color:var(--hx-color-purple-200)}.hx\:border-red-200{border-color:var(--hx-color-red-200)}.hx\:border-transparent{border-color:#0000}.hx\:border-yellow-100{border-color:var(--hx-color-yellow-100)}.hx\:bg-amber-100{background-color:var(--hx-color-amber-100)}.hx\:bg-black\/\[\.05\]{background-color:var(--hx-color-black)}@supports (color:color-mix(in lab, red, red)){.hx\:bg-black\/\[\.05\]{background-color:color-mix(in oklab,var(--hx-color-black)5%,transparent)}}.hx\:bg-blue-100{background-color:var(--hx-color-blue-100)}.hx\:bg-gray-100{background-color:var(--hx-color-gray-100)}.hx\:bg-green-100{background-color:var(--hx-color-green-100)}.hx\:bg-indigo-100{background-color:var(--hx-color-indigo-100)}.hx\:bg-neutral-50{background-color:var(--hx-color-neutral-50)}.hx\:bg-neutral-900{background-color:var(--hx-color-neutral-900)}.hx\:bg-orange-50{background-color:var(--hx-color-orange-50)}.hx\:bg-primary-100{background-color:var(--hx-color-primary-100)}.hx\:bg-primary-400{background-color:var(--hx-color-primary-400)}.hx\:bg-primary-600{background-color:var(--hx-color-primary-600)}.hx\:bg-primary-700\/5{background-color:var(--hx-color-primary-700)}@supports (color:color-mix(in lab, red, red)){.hx\:bg-primary-700\/5{background-color:color-mix(in oklab,var(--hx-color-primary-700)5%,transparent)}}.hx\:bg-purple-100{background-color:var(--hx-color-purple-100)}.hx\:bg-red-100{background-color:var(--hx-color-red-100)}.hx\:bg-transparent{background-color:#0000}.hx\:bg-white{background-color:var(--hx-color-white)}.hx\:bg-yellow-50{background-color:var(--hx-color-yellow-50)}.hx\:bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.hx\:from-gray-900{--tw-gradient-from:var(--hx-color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.hx\:to-gray-600{--tw-gradient-to:var(--hx-color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.hx\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.hx\:p-0\.5{padding:calc(var(--hx-spacing)*.5)}.hx\:p-1{padding:calc(var(--hx-spacing)*1)}.hx\:p-1\.5{padding:calc(var(--hx-spacing)*1.5)}.hx\:p-2{padding:calc(var(--hx-spacing)*2)}.hx\:p-4{padding:calc(var(--hx-spacing)*4)}.hx\:p-6{padding:calc(var(--hx-spacing)*6)}.hx\:px-1\.5{padding-inline:calc(var(--hx-spacing)*1.5)}.hx\:px-2{padding-inline:calc(var(--hx-spacing)*2)}.hx\:px-2\.5{padding-inline:calc(var(--hx-spacing)*2.5)}.hx\:px-3{padding-inline:calc(var(--hx-spacing)*3)}.hx\:px-4{padding-inline:calc(var(--hx-spacing)*4)}.hx\:px-6{padding-inline:calc(var(--hx-spacing)*6)}.hx\:px-8{padding-inline:calc(var(--hx-spacing)*8)}.hx\:py-1{padding-block:calc(var(--hx-spacing)*1)}.hx\:py-1\.5{padding-block:calc(var(--hx-spacing)*1.5)}.hx\:py-2{padding-block:calc(var(--hx-spacing)*2)}.hx\:py-2\.5{padding-block:calc(var(--hx-spacing)*2.5)}.hx\:py-3{padding-block:calc(var(--hx-spacing)*3)}.hx\:py-4{padding-block:calc(var(--hx-spacing)*4)}.hx\:py-12{padding-block:calc(var(--hx-spacing)*12)}.hx\:pt-4{padding-top:calc(var(--hx-spacing)*4)}.hx\:pt-6{padding-top:calc(var(--hx-spacing)*6)}.hx\:pt-8{padding-top:calc(var(--hx-spacing)*8)}.hx\:pr-2{padding-right:calc(var(--hx-spacing)*2)}.hx\:pr-4{padding-right:calc(var(--hx-spacing)*4)}.hx\:pr-\[calc\(env\(safe-area-inset-right\)-1\.5rem\)\]{padding-right:calc(env(safe-area-inset-right) - 1.5rem)}.hx\:pr-\[max\(env\(safe-area-inset-left\)\,1\.5rem\)\]{padding-right:max(env(safe-area-inset-left),1.5rem)}.hx\:pr-\[max\(env\(safe-area-inset-right\)\,1\.5rem\)\]{padding-right:max(env(safe-area-inset-right),1.5rem)}.hx\:pb-8{padding-bottom:calc(var(--hx-spacing)*8)}.hx\:pb-\[env\(safe-area-inset-bottom\)\]{padding-bottom:env(safe-area-inset-bottom)}.hx\:pb-px{padding-bottom:1px}.hx\:pl-\[max\(env\(safe-area-inset-left\)\,1\.5rem\)\]{padding-left:max(env(safe-area-inset-left),1.5rem)}.hx\:text-center{text-align:center}.hx\:text-left{text-align:left}.hx\:align-\[-2\.5px\]{vertical-align:-2.5px}.hx\:align-baseline{vertical-align:baseline}.hx\:align-middle{vertical-align:middle}.hx\:align-text-bottom{vertical-align:text-bottom}.hx\:font-mono{font-family:var(--hx-font-mono)}.hx\:text-2xl{font-size:var(--hx-text-2xl);line-height:var(--tw-leading,var(--hx-text-2xl--line-height))}.hx\:text-4xl{font-size:var(--hx-text-4xl);line-height:var(--tw-leading,var(--hx-text-4xl--line-height))}.hx\:text-base{font-size:var(--hx-text-base);line-height:var(--tw-leading,var(--hx-text-base--line-height))}.hx\:text-lg{font-size:var(--hx-text-lg);line-height:var(--tw-leading,var(--hx-text-lg--line-height))}.hx\:text-sm{font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height))}.hx\:text-xl{font-size:var(--hx-text-xl);line-height:var(--tw-leading,var(--hx-text-xl--line-height))}.hx\:text-xs{font-size:var(--hx-text-xs);line-height:var(--tw-leading,var(--hx-text-xs--line-height))}.hx\:text-\[\.65rem\]{font-size:.65rem}.hx\:text-\[10px\]{font-size:10px}.hx\:leading-5{--tw-leading:calc(var(--hx-spacing)*5);line-height:calc(var(--hx-spacing)*5)}.hx\:leading-6{--tw-leading:calc(var(--hx-spacing)*6);line-height:calc(var(--hx-spacing)*6)}.hx\:leading-7{--tw-leading:calc(var(--hx-spacing)*7);line-height:calc(var(--hx-spacing)*7)}.hx\:leading-none{--tw-leading:1;line-height:1}.hx\:leading-tight{--tw-leading:var(--hx-leading-tight);line-height:var(--hx-leading-tight)}.hx\:font-bold{--tw-font-weight:var(--hx-font-weight-bold);font-weight:var(--hx-font-weight-bold)}.hx\:font-extrabold{--tw-font-weight:var(--hx-font-weight-extrabold);font-weight:var(--hx-font-weight-extrabold)}.hx\:font-medium{--tw-font-weight:var(--hx-font-weight-medium);font-weight:var(--hx-font-weight-medium)}.hx\:font-normal{--tw-font-weight:var(--hx-font-weight-normal);font-weight:var(--hx-font-weight-normal)}.hx\:font-semibold{--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold)}.hx\:tracking-tight{--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight)}.hx\:tracking-tighter{--tw-tracking:var(--hx-tracking-tighter);letter-spacing:var(--hx-tracking-tighter)}.hx\:break-words{overflow-wrap:break-word}.hx\:text-ellipsis{text-overflow:ellipsis}.hx\:whitespace-nowrap{white-space:nowrap}.hx\:text-\[color\:hsl\(var\(--primary-hue\)\,100\%\,50\%\)\]{color:hsl(var(--primary-hue),100%,50%)}.hx\:text-amber-900{color:var(--hx-color-amber-900)}.hx\:text-blue-900{color:var(--hx-color-blue-900)}.hx\:text-current{color:currentColor}.hx\:text-gray-100{color:var(--hx-color-gray-100)}.hx\:text-gray-500{color:var(--hx-color-gray-500)}.hx\:text-gray-600{color:var(--hx-color-gray-600)}.hx\:text-gray-700{color:var(--hx-color-gray-700)}.hx\:text-gray-800{color:var(--hx-color-gray-800)}.hx\:text-gray-900{color:var(--hx-color-gray-900)}.hx\:text-green-900{color:var(--hx-color-green-900)}.hx\:text-indigo-900{color:var(--hx-color-indigo-900)}.hx\:text-orange-800{color:var(--hx-color-orange-800)}.hx\:text-primary-800{color:var(--hx-color-primary-800)}.hx\:text-purple-900{color:var(--hx-color-purple-900)}.hx\:text-red-900{color:var(--hx-color-red-900)}.hx\:text-slate-50{color:var(--hx-color-slate-50)}.hx\:text-slate-900{color:var(--hx-color-slate-900)}.hx\:text-transparent{color:#0000}.hx\:text-white{color:var(--hx-color-white)}.hx\:text-yellow-900{color:var(--hx-color-yellow-900)}.hx\:capitalize{text-transform:capitalize}.hx\:no-underline{text-decoration-line:none}.hx\:underline{text-decoration-line:underline}.hx\:decoration-from-font{text-decoration-thickness:from-font}.hx\:underline-offset-2{text-underline-offset:2px}.hx\:opacity-0{opacity:0}.hx\:opacity-50{opacity:.5}.hx\:opacity-80{opacity:.8}.hx\:shadow-\[0_-12px_16px_\#fff\]{--tw-shadow:0 -12px 16px var(--tw-shadow-color,#fff);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-\[0_-12px_16px_white\]{--tw-shadow:0 -12px 16px var(--tw-shadow-color,white);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-\[0_2px_4px_rgba\(0\,0\,0\,\.02\)\,0_1px_0_rgba\(0\,0\,0\,\.06\)\]{--tw-shadow:0 2px 4px var(--tw-shadow-color,#00000005),0 1px 0 var(--tw-shadow-color,#0000000f);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:shadow-gray-100{--tw-shadow-color:var(--hx-color-gray-100)}@supports (color:color-mix(in lab, red, red)){.hx\:shadow-gray-100{--tw-shadow-color:color-mix(in oklab,var(--hx-color-gray-100)var(--tw-shadow-alpha),transparent)}}.hx\:ring-black\/5{--tw-ring-color:var(--hx-color-black)}@supports (color:color-mix(in lab, red, red)){.hx\:ring-black\/5{--tw-ring-color:color-mix(in oklab,var(--hx-color-black)5%,transparent)}}.hx\:transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.hx\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.hx\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.hx\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.hx\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.hx\:duration-75{--tw-duration:75ms;transition-duration:75ms}.hx\:duration-200{--tw-duration:.2s;transition-duration:.2s}.hx\:ease-in{--tw-ease:var(--hx-ease-in);transition-timing-function:var(--hx-ease-in)}.hx\:ease-in-out{--tw-ease:var(--hx-ease-in-out);transition-timing-function:var(--hx-ease-in-out)}.hx\:select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.hx\:group-hover\:underline:is(:where(.hx\:group):hover *){text-decoration-line:underline}.hx\:group-hover\/code\:opacity-100:is(:where(.hx\:group\/code):hover *){opacity:1}}.hx\:group-data-\[theme\=dark\]\:hidden:is(:where(.hx\:group)[data-theme=dark] *),.hx\:group-data-\[theme\=light\]\:hidden:is(:where(.hx\:group)[data-theme=light] *),.hx\:group-data-\[theme\=system\]\:hidden:is(:where(.hx\:group)[data-theme=system] *){display:none}.hx\:group-\[\.copied\]\/copybtn\:block:is(:where(.hx\:group\/copybtn).copied *){display:block}.hx\:group-\[\.copied\]\/copybtn\:hidden:is(:where(.hx\:group\/copybtn).copied *){display:none}.hx\:placeholder\:text-gray-500::placeholder{color:var(--hx-color-gray-500)}.hx\:before\:pointer-events-none:before{content:var(--tw-content);pointer-events:none}.hx\:before\:absolute:before{content:var(--tw-content);position:absolute}.hx\:before\:inset-0:before{content:var(--tw-content);inset:calc(var(--hx-spacing)*0)}.hx\:before\:inset-y-1:before{content:var(--tw-content);inset-block:calc(var(--hx-spacing)*1)}.hx\:before\:mr-1:before{content:var(--tw-content);margin-right:calc(var(--hx-spacing)*1)}.hx\:before\:inline-block:before{content:var(--tw-content);display:inline-block}.hx\:before\:w-px:before{content:var(--tw-content);width:1px}.hx\:before\:bg-gray-200:before{content:var(--tw-content);background-color:var(--hx-color-gray-200)}.hx\:before\:opacity-25:before{content:var(--tw-content);opacity:.25}.hx\:before\:transition-transform:before{content:var(--tw-content);transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.hx\:before\:content-\[\"\"\]:before{content:var(--tw-content);--tw-content:"";content:var(--tw-content)}.hx\:before\:content-\[\'\#\'\]:before{content:var(--tw-content);--tw-content:"#";content:var(--tw-content)}.hx\:before\:content-\[\'\'\]:before{content:var(--tw-content);--tw-content:"";content:var(--tw-content)}.hx\:before\:content-\[\\\"\\\"\]:before{content:var(--tw-content);--tw-content:\"\";content:var(--tw-content)}.hx\:group-open\:before\:rotate-90:is(:where(.hx\:group):is([open],:popover-open,:open) *):before{content:var(--tw-content);rotate:90deg}.hx\:first\:mt-0:first-child{margin-top:calc(var(--hx-spacing)*0)}.hx\:last-of-type\:mb-0:last-of-type{margin-bottom:calc(var(--hx-spacing)*0)}@media (hover:hover){.hx\:hover\:border-gray-200:hover{border-color:var(--hx-color-gray-200)}.hx\:hover\:border-gray-300:hover{border-color:var(--hx-color-gray-300)}.hx\:hover\:border-gray-400:hover{border-color:var(--hx-color-gray-400)}.hx\:hover\:border-gray-900:hover{border-color:var(--hx-color-gray-900)}.hx\:hover\:bg-gray-100:hover{background-color:var(--hx-color-gray-100)}.hx\:hover\:bg-gray-800\/5:hover{background-color:var(--hx-color-gray-800)}@supports (color:color-mix(in lab, red, red)){.hx\:hover\:bg-gray-800\/5:hover{background-color:color-mix(in oklab,var(--hx-color-gray-800)5%,transparent)}}.hx\:hover\:bg-primary-50:hover{background-color:var(--hx-color-primary-50)}.hx\:hover\:bg-primary-700:hover{background-color:var(--hx-color-primary-700)}.hx\:hover\:bg-slate-50:hover{background-color:var(--hx-color-slate-50)}.hx\:hover\:text-black:hover{color:var(--hx-color-black)}.hx\:hover\:text-gray-800:hover{color:var(--hx-color-gray-800)}.hx\:hover\:text-gray-900:hover{color:var(--hx-color-gray-900)}.hx\:hover\:text-primary-600:hover{color:var(--hx-color-primary-600)}.hx\:hover\:opacity-60:hover{opacity:.6}.hx\:hover\:opacity-75:hover{opacity:.75}.hx\:hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:hover\:shadow-gray-100:hover{--tw-shadow-color:var(--hx-color-gray-100)}@supports (color:color-mix(in lab, red, red)){.hx\:hover\:shadow-gray-100:hover{--tw-shadow-color:color-mix(in oklab,var(--hx-color-gray-100)var(--tw-shadow-alpha),transparent)}}}.hx\:focus\:bg-white:focus{background-color:var(--hx-color-white)}.hx\:focus\:hextra-focus:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--hx-color-primary-200);--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-offset-color:var(--hx-color-primary-300);--tw-outline-style:none;outline-style:none}.hx\:focus\:hextra-focus:focus:where(.dark,.dark *){--tw-ring-color:var(--hx-color-primary-800);--tw-ring-offset-color:var(--hx-color-primary-700)}.hx\:focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:focus\:ring-primary-300:focus{--tw-ring-color:var(--hx-color-primary-300)}.hx\:focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.hx\:focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.hx\:active\:bg-gray-400\/20:active{background-color:var(--hx-color-gray-400)}@supports (color:color-mix(in lab, red, red)){.hx\:active\:bg-gray-400\/20:active{background-color:color-mix(in oklab,var(--hx-color-gray-400)20%,transparent)}}.hx\:active\:opacity-50:active{opacity:.5}.hx\:active\:shadow-sm:active{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:active\:shadow-gray-200:active{--tw-shadow-color:var(--hx-color-gray-200)}@supports (color:color-mix(in lab, red, red)){.hx\:active\:shadow-gray-200:active{--tw-shadow-color:color-mix(in oklab,var(--hx-color-gray-200)var(--tw-shadow-alpha),transparent)}}.hx\:data-\[state\=closed\]\:hidden[data-state=closed],.hx\:data-\[state\=open\]\:hidden[data-state=open]{display:none}.hx\:data-\[state\=selected\]\:block[data-state=selected]{display:block}.hx\:data-\[state\=selected\]\:border-primary-500[data-state=selected]{border-color:var(--hx-color-primary-500)}.hx\:data-\[state\=selected\]\:text-primary-600[data-state=selected]{color:var(--hx-color-primary-600)}@media (prefers-contrast:more){.hx\:contrast-more\:border{border-style:var(--tw-border-style);border-width:1px}.hx\:contrast-more\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.hx\:contrast-more\:border-current{border-color:currentColor}.hx\:contrast-more\:border-gray-800{border-color:var(--hx-color-gray-800)}.hx\:contrast-more\:border-gray-900{border-color:var(--hx-color-gray-900)}.hx\:contrast-more\:border-neutral-400{border-color:var(--hx-color-neutral-400)}.hx\:contrast-more\:border-primary-500{border-color:var(--hx-color-primary-500)}.hx\:contrast-more\:border-transparent{border-color:#0000}.hx\:contrast-more\:font-bold{--tw-font-weight:var(--hx-font-weight-bold);font-weight:var(--hx-font-weight-bold)}.hx\:contrast-more\:text-current{color:currentColor}.hx\:contrast-more\:text-gray-700{color:var(--hx-color-gray-700)}.hx\:contrast-more\:text-gray-800{color:var(--hx-color-gray-800)}.hx\:contrast-more\:text-gray-900{color:var(--hx-color-gray-900)}.hx\:contrast-more\:underline{text-decoration-line:underline}.hx\:contrast-more\:shadow-\[0_0_0_1px_\#000\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#000);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:contrast-more\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.hx\:contrast-more\:hover\:border-gray-900:hover{border-color:var(--hx-color-gray-900)}}}@media not all and (min-width:80rem){.hx\:max-xl\:hidden{display:none}}@media not all and (min-width:64rem){.hx\:max-lg\:min-h-\[340px\]{min-height:340px}}@media not all and (min-width:48rem){.hx\:max-md\:sticky{position:sticky}.hx\:max-md\:hidden{display:none}.hx\:max-md\:min-h-\[340px\]{min-height:340px}.hx\:max-md\:\[transform\:translate3d\(0\,-100\%\,0\)\]{transform:translateY(-100%)}.hx\:max-md\:\[transform\:translate3d\(0\,0\,0\)\]{transform:translate(0)}}@media not all and (min-width:40rem){.hx\:max-sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media (min-width:40rem){.hx\:sm\:block{display:block}.hx\:sm\:flex{display:flex}.hx\:sm\:w-\[110\%\]{width:110%}.hx\:sm\:items-start{align-items:flex-start}.hx\:sm\:text-xl{font-size:var(--hx-text-xl);line-height:var(--tw-leading,var(--hx-text-xl--line-height))}@media not all and (min-width:64rem){.hx\:sm\:max-lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}@media (min-width:48rem){.hx\:md\:sticky{position:sticky}.hx\:md\:top-16{top:calc(var(--hx-spacing)*16)}.hx\:md\:mr-0{margin-right:calc(var(--hx-spacing)*0)}.hx\:md\:hidden{display:none}.hx\:md\:inline-block{display:inline-block}.hx\:md\:inline-flex{display:inline-flex}.hx\:md\:aspect-\[1\.1\/1\]{aspect-ratio:1.1}.hx\:md\:h-\[calc\(100vh-var\(--navbar-height\)-var\(--menu-height\)\)\]{height:calc(100vh - var(--navbar-height) - var(--menu-height))}.hx\:md\:max-h-\[min\(calc\(100vh-5rem-env\(safe-area-inset-bottom\)\)\,400px\)\]{max-height:min(calc(100vh - 5rem - env(safe-area-inset-bottom)),400px)}.hx\:md\:w-64{width:calc(var(--hx-spacing)*64)}.hx\:md\:shrink-0{flex-shrink:0}.hx\:md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.hx\:md\:justify-start{justify-content:flex-start}.hx\:md\:self-start{align-self:flex-start}.hx\:md\:overflow-auto{overflow:auto}.hx\:md\:px-12{padding-inline:calc(var(--hx-spacing)*12)}.hx\:md\:pt-12{padding-top:calc(var(--hx-spacing)*12)}.hx\:md\:text-3xl{font-size:var(--hx-text-3xl);line-height:var(--tw-leading,var(--hx-text-3xl--line-height))}.hx\:md\:text-5xl{font-size:var(--hx-text-5xl);line-height:var(--tw-leading,var(--hx-text-5xl--line-height))}.hx\:md\:text-lg{font-size:var(--hx-text-lg);line-height:var(--tw-leading,var(--hx-text-lg--line-height))}.hx\:md\:text-sm{font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height))}}@media (min-width:64rem){.hx\:lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:80rem){.hx\:xl\:block{display:block}.hx\:xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.hx\:ltr\:right-1\.5:where(:dir(ltr),[dir=ltr],[dir=ltr] *){right:calc(var(--hx-spacing)*1.5)}.hx\:ltr\:right-3:where(:dir(ltr),[dir=ltr],[dir=ltr] *){right:calc(var(--hx-spacing)*3)}.hx\:ltr\:-mr-4:where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-right:calc(var(--hx-spacing)*-4)}.hx\:ltr\:mr-auto:where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-right:auto}.hx\:ltr\:ml-1:where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-left:calc(var(--hx-spacing)*1)}.hx\:ltr\:ml-3:where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-left:calc(var(--hx-spacing)*3)}.hx\:ltr\:ml-auto:where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-left:auto}.hx\:ltr\:rotate-180:where(:dir(ltr),[dir=ltr],[dir=ltr] *){rotate:180deg}.hx\:ltr\:border-l:where(:dir(ltr),[dir=ltr],[dir=ltr] *){border-left-style:var(--tw-border-style);border-left-width:1px}.hx\:ltr\:pr-0:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-right:calc(var(--hx-spacing)*0)}.hx\:ltr\:pr-2:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-right:calc(var(--hx-spacing)*2)}.hx\:ltr\:pr-4:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-right:calc(var(--hx-spacing)*4)}.hx\:ltr\:pr-9:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-right:calc(var(--hx-spacing)*9)}.hx\:ltr\:pl-3:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*3)}.hx\:ltr\:pl-4:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*4)}.hx\:ltr\:pl-5:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*5)}.hx\:ltr\:pl-6:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*6)}.hx\:ltr\:pl-8:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*8)}.hx\:ltr\:pl-12:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*12)}.hx\:ltr\:pl-16:where(:dir(ltr),[dir=ltr],[dir=ltr] *){padding-left:calc(var(--hx-spacing)*16)}.hx\:ltr\:text-right:where(:dir(ltr),[dir=ltr],[dir=ltr] *){text-align:right}.hx\:ltr\:before\:left-0:where(:dir(ltr),[dir=ltr],[dir=ltr] *):before{content:var(--tw-content);left:calc(var(--hx-spacing)*0)}@media (min-width:48rem){.hx\:ltr\:md\:left-auto:where(:dir(ltr),[dir=ltr],[dir=ltr] *){left:auto}}.hx\:rtl\:left-1\.5:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:calc(var(--hx-spacing)*1.5)}.hx\:rtl\:left-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){left:calc(var(--hx-spacing)*3)}.hx\:rtl\:mr-1:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:calc(var(--hx-spacing)*1)}.hx\:rtl\:mr-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:calc(var(--hx-spacing)*3)}.hx\:rtl\:mr-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:auto}.hx\:rtl\:-ml-4:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-left:calc(var(--hx-spacing)*-4)}.hx\:rtl\:ml-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-left:auto}.hx\:rtl\:-rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:-180deg}.hx\:rtl\:rotate-270:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:270deg}.hx\:rtl\:border-r:where(:dir(rtl),[dir=rtl],[dir=rtl] *){border-right-style:var(--tw-border-style);border-right-width:1px}.hx\:rtl\:pr-3:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*3)}.hx\:rtl\:pr-4:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*4)}.hx\:rtl\:pr-5:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*5)}.hx\:rtl\:pr-6:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*6)}.hx\:rtl\:pr-8:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*8)}.hx\:rtl\:pr-12:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*12)}.hx\:rtl\:pr-16:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-right:calc(var(--hx-spacing)*16)}.hx\:rtl\:pl-2:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-left:calc(var(--hx-spacing)*2)}.hx\:rtl\:pl-4:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-left:calc(var(--hx-spacing)*4)}.hx\:rtl\:pl-9:where(:dir(rtl),[dir=rtl],[dir=rtl] *){padding-left:calc(var(--hx-spacing)*9)}.hx\:rtl\:text-left:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:left}.hx\:rtl\:before\:right-0:where(:dir(rtl),[dir=rtl],[dir=rtl] *):before{content:var(--tw-content);right:calc(var(--hx-spacing)*0)}.hx\:rtl\:before\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *):before{content:var(--tw-content);rotate:180deg}@media (min-width:48rem){.hx\:rtl\:md\:right-auto:where(:dir(rtl),[dir=rtl],[dir=rtl] *){right:auto}}.hx\:dark\:block:where(.dark,.dark *){display:block}.hx\:dark\:hidden:where(.dark,.dark *){display:none}.hx\:dark\:border-amber-200\/30:where(.dark,.dark *){border-color:var(--hx-color-amber-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-amber-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-amber-200)30%,transparent)}}.hx\:dark\:border-blue-200\/30:where(.dark,.dark *){border-color:var(--hx-color-blue-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-blue-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-blue-200)30%,transparent)}}.hx\:dark\:border-gray-100\/20:where(.dark,.dark *){border-color:var(--hx-color-gray-100)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-gray-100\/20:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-gray-100)20%,transparent)}}.hx\:dark\:border-gray-400:where(.dark,.dark *){border-color:var(--hx-color-gray-400)}.hx\:dark\:border-green-200\/30:where(.dark,.dark *){border-color:var(--hx-color-green-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-green-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-green-200)30%,transparent)}}.hx\:dark\:border-indigo-200\/30:where(.dark,.dark *){border-color:var(--hx-color-indigo-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-indigo-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-indigo-200)30%,transparent)}}.hx\:dark\:border-neutral-700:where(.dark,.dark *){border-color:var(--hx-color-neutral-700)}.hx\:dark\:border-neutral-800:where(.dark,.dark *){border-color:var(--hx-color-neutral-800)}.hx\:dark\:border-orange-400\/30:where(.dark,.dark *){border-color:var(--hx-color-orange-400)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-orange-400\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-orange-400)30%,transparent)}}.hx\:dark\:border-purple-200\/30:where(.dark,.dark *){border-color:var(--hx-color-purple-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-purple-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-purple-200)30%,transparent)}}.hx\:dark\:border-red-200\/30:where(.dark,.dark *){border-color:var(--hx-color-red-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-red-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-red-200)30%,transparent)}}.hx\:dark\:border-white\/10:where(.dark,.dark *){border-color:var(--hx-color-white)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-white\/10:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-white)10%,transparent)}}.hx\:dark\:border-yellow-200\/30:where(.dark,.dark *){border-color:var(--hx-color-yellow-200)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:border-yellow-200\/30:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-yellow-200)30%,transparent)}}.hx\:dark\:bg-amber-900\/30:where(.dark,.dark *){background-color:var(--hx-color-amber-900)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-amber-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-amber-900)30%,transparent)}}.hx\:dark\:bg-blue-900\/30:where(.dark,.dark *){background-color:var(--hx-color-blue-900)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-blue-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-blue-900)30%,transparent)}}.hx\:dark\:bg-dark:where(.dark,.dark *),.hx\:dark\:bg-dark\/50:where(.dark,.dark *){background-color:var(--hx-color-dark)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-dark\/50:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-dark)50%,transparent)}}.hx\:dark\:bg-gray-50\/10:where(.dark,.dark *){background-color:var(--hx-color-gray-50)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-gray-50\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-gray-50)10%,transparent)}}.hx\:dark\:bg-green-900\/30:where(.dark,.dark *){background-color:var(--hx-color-green-900)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-green-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-green-900)30%,transparent)}}.hx\:dark\:bg-indigo-900\/30:where(.dark,.dark *){background-color:var(--hx-color-indigo-900)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-indigo-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-indigo-900)30%,transparent)}}.hx\:dark\:bg-neutral-800:where(.dark,.dark *){background-color:var(--hx-color-neutral-800)}.hx\:dark\:bg-neutral-900:where(.dark,.dark *){background-color:var(--hx-color-neutral-900)}.hx\:dark\:bg-orange-400\/20:where(.dark,.dark *){background-color:var(--hx-color-orange-400)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-orange-400\/20:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-orange-400)20%,transparent)}}.hx\:dark\:bg-primary-300\/10:where(.dark,.dark *){background-color:var(--hx-color-primary-300)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-primary-300\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-primary-300)10%,transparent)}}.hx\:dark\:bg-primary-400\/10:where(.dark,.dark *){background-color:var(--hx-color-primary-400)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-primary-400\/10:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-primary-400)10%,transparent)}}.hx\:dark\:bg-primary-600:where(.dark,.dark *){background-color:var(--hx-color-primary-600)}.hx\:dark\:bg-purple-900\/30:where(.dark,.dark *){background-color:var(--hx-color-purple-900)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-purple-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-purple-900)30%,transparent)}}.hx\:dark\:bg-red-900\/30:where(.dark,.dark *){background-color:var(--hx-color-red-900)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-red-900\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-red-900)30%,transparent)}}.hx\:dark\:bg-yellow-700\/30:where(.dark,.dark *){background-color:var(--hx-color-yellow-700)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:bg-yellow-700\/30:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-yellow-700)30%,transparent)}}.hx\:dark\:from-gray-100:where(.dark,.dark *){--tw-gradient-from:var(--hx-color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.hx\:dark\:to-gray-400:where(.dark,.dark *){--tw-gradient-to:var(--hx-color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.hx\:dark\:text-amber-200:where(.dark,.dark *){color:var(--hx-color-amber-200)}.hx\:dark\:text-blue-200:where(.dark,.dark *){color:var(--hx-color-blue-200)}.hx\:dark\:text-gray-50:where(.dark,.dark *){color:var(--hx-color-gray-50)}.hx\:dark\:text-gray-100:where(.dark,.dark *){color:var(--hx-color-gray-100)}.hx\:dark\:text-gray-200:where(.dark,.dark *){color:var(--hx-color-gray-200)}.hx\:dark\:text-gray-300:where(.dark,.dark *){color:var(--hx-color-gray-300)}.hx\:dark\:text-gray-400:where(.dark,.dark *){color:var(--hx-color-gray-400)}.hx\:dark\:text-green-200:where(.dark,.dark *){color:var(--hx-color-green-200)}.hx\:dark\:text-indigo-200:where(.dark,.dark *){color:var(--hx-color-indigo-200)}.hx\:dark\:text-neutral-200:where(.dark,.dark *){color:var(--hx-color-neutral-200)}.hx\:dark\:text-neutral-400:where(.dark,.dark *){color:var(--hx-color-neutral-400)}.hx\:dark\:text-orange-300:where(.dark,.dark *){color:var(--hx-color-orange-300)}.hx\:dark\:text-primary-600:where(.dark,.dark *){color:var(--hx-color-primary-600)}.hx\:dark\:text-purple-200:where(.dark,.dark *){color:var(--hx-color-purple-200)}.hx\:dark\:text-red-200:where(.dark,.dark *){color:var(--hx-color-red-200)}.hx\:dark\:text-slate-100:where(.dark,.dark *){color:var(--hx-color-slate-100)}.hx\:dark\:text-white:where(.dark,.dark *){color:var(--hx-color-white)}.hx\:dark\:text-yellow-200:where(.dark,.dark *){color:var(--hx-color-yellow-200)}.hx\:dark\:opacity-80:where(.dark,.dark *){opacity:.8}.hx\:dark\:shadow-\[0_-1px_0_rgba\(255\,255\,255\,\.1\)_inset\]:where(.dark,.dark *){--tw-shadow:0 -1px 0 var(--tw-shadow-color,#ffffff1a)inset;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:dark\:shadow-\[0_-12px_16px_\#111\]:where(.dark,.dark *){--tw-shadow:0 -12px 16px var(--tw-shadow-color,#111);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:dark\:shadow-none:where(.dark,.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:dark\:ring-white\/20:where(.dark,.dark *){--tw-ring-color:var(--hx-color-white)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:ring-white\/20:where(.dark,.dark *){--tw-ring-color:color-mix(in oklab,var(--hx-color-white)20%,transparent)}}.hx\:dark\:placeholder\:text-gray-400:where(.dark,.dark *)::placeholder{color:var(--hx-color-gray-400)}.hx\:dark\:before\:bg-neutral-800:where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--hx-color-neutral-800)}.hx\:dark\:before\:invert:where(.dark,.dark *):before{content:var(--tw-content);--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}@media (hover:hover){.hx\:dark\:hover\:border-gray-100:where(.dark,.dark *):hover{border-color:var(--hx-color-gray-100)}.hx\:dark\:hover\:border-gray-600:where(.dark,.dark *):hover{border-color:var(--hx-color-gray-600)}.hx\:dark\:hover\:border-neutral-500:where(.dark,.dark *):hover{border-color:var(--hx-color-neutral-500)}.hx\:dark\:hover\:border-neutral-700:where(.dark,.dark *):hover{border-color:var(--hx-color-neutral-700)}.hx\:dark\:hover\:border-neutral-800:where(.dark,.dark *):hover{border-color:var(--hx-color-neutral-800)}.hx\:dark\:hover\:bg-gray-100\/5:where(.dark,.dark *):hover{background-color:var(--hx-color-gray-100)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:hover\:bg-gray-100\/5:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--hx-color-gray-100)5%,transparent)}}.hx\:dark\:hover\:bg-neutral-700:where(.dark,.dark *):hover{background-color:var(--hx-color-neutral-700)}.hx\:dark\:hover\:bg-neutral-800:where(.dark,.dark *):hover{background-color:var(--hx-color-neutral-800)}.hx\:dark\:hover\:bg-neutral-900:where(.dark,.dark *):hover{background-color:var(--hx-color-neutral-900)}.hx\:dark\:hover\:bg-primary-100\/5:where(.dark,.dark *):hover{background-color:var(--hx-color-primary-100)}@supports (color:color-mix(in lab, red, red)){.hx\:dark\:hover\:bg-primary-100\/5:where(.dark,.dark *):hover{background-color:color-mix(in oklab,var(--hx-color-primary-100)5%,transparent)}}.hx\:dark\:hover\:bg-primary-700:where(.dark,.dark *):hover{background-color:var(--hx-color-primary-700)}.hx\:hover\:dark\:bg-primary-500\/10:hover:where(.dark,.dark *){background-color:var(--hx-color-primary-500)}@supports (color:color-mix(in lab, red, red)){.hx\:hover\:dark\:bg-primary-500\/10:hover:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-primary-500)10%,transparent)}}.hx\:dark\:hover\:text-gray-50:where(.dark,.dark *):hover{color:var(--hx-color-gray-50)}.hx\:dark\:hover\:text-gray-100:where(.dark,.dark *):hover{color:var(--hx-color-gray-100)}.hx\:dark\:hover\:text-gray-200:where(.dark,.dark *):hover{color:var(--hx-color-gray-200)}.hx\:dark\:hover\:text-gray-300:where(.dark,.dark *):hover{color:var(--hx-color-gray-300)}.hx\:dark\:hover\:text-neutral-50:where(.dark,.dark *):hover{color:var(--hx-color-neutral-50)}.hx\:dark\:hover\:text-white:where(.dark,.dark *):hover{color:var(--hx-color-white)}.hx\:hover\:dark\:text-primary-600:hover:where(.dark,.dark *){color:var(--hx-color-primary-600)}.hx\:dark\:hover\:shadow-none:where(.dark,.dark *):hover{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.hx\:dark\:focus\:bg-dark:where(.dark,.dark *):focus{background-color:var(--hx-color-dark)}.hx\:dark\:focus\:ring-primary-800:where(.dark,.dark *):focus{--tw-ring-color:var(--hx-color-primary-800)}.hx\:data-\[state\=selected\]\:dark\:border-primary-500[data-state=selected]:where(.dark,.dark *){border-color:var(--hx-color-primary-500)}.hx\:data-\[state\=selected\]\:dark\:text-primary-600[data-state=selected]:where(.dark,.dark *){color:var(--hx-color-primary-600)}@media (prefers-contrast:more){.hx\:contrast-more\:dark\:border-current:where(.dark,.dark *){border-color:currentColor}.hx\:contrast-more\:dark\:border-gray-50:where(.dark,.dark *){border-color:var(--hx-color-gray-50)}.hx\:contrast-more\:dark\:border-neutral-400:where(.dark,.dark *){border-color:var(--hx-color-neutral-400)}.hx\:contrast-more\:dark\:border-primary-500:where(.dark,.dark *){border-color:var(--hx-color-primary-500)}.hx\:dark\:contrast-more\:border-neutral-400:where(.dark,.dark *){border-color:var(--hx-color-neutral-400)}.hx\:contrast-more\:dark\:text-current:where(.dark,.dark *){color:currentColor}.hx\:contrast-more\:dark\:text-gray-50:where(.dark,.dark *){color:var(--hx-color-gray-50)}.hx\:contrast-more\:dark\:text-gray-100:where(.dark,.dark *){color:var(--hx-color-gray-100)}.hx\:contrast-more\:dark\:text-gray-300:where(.dark,.dark *){color:var(--hx-color-gray-300)}.hx\:contrast-more\:dark\:shadow-\[0_0_0_1px_\#fff\]:where(.dark,.dark *){--tw-shadow:0 0 0 1px var(--tw-shadow-color,#fff);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hx\:contrast-more\:dark\:shadow-none:where(.dark,.dark *){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (hover:hover){.hx\:contrast-more\:dark\:hover\:border-gray-50:where(.dark,.dark *):hover{border-color:var(--hx-color-gray-50)}}}@media print{.hx\:print\:\[display\:none\],.hx\:print\:hidden{display:none}.hx\:print\:bg-transparent{background-color:#0000}}}html{font-size:var(--hx-text-base);line-height:var(--tw-leading,var(--hx-text-base--line-height));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{background-color:var(--hx-color-white);width:100%}body:where(.dark,.dark *){background-color:var(--hx-color-dark);color:var(--hx-color-gray-100)}:root{--primary-hue:212deg;--primary-saturation:100%;--primary-lightness:50%;--navbar-height:4rem;--hextra-banner-height:2rem;--menu-height:3.75rem}.dark{--primary-hue:204deg;--primary-saturation:100%;--primary-lightness:50%}.content :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*2);font-size:var(--hx-text-4xl);line-height:var(--tw-leading,var(--hx-text-4xl--line-height));--tw-font-weight:var(--hx-font-weight-bold);font-weight:var(--hx-font-weight-bold);--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight);color:var(--hx-color-slate-900)}.content :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){color:var(--hx-color-slate-100)}.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*10);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--hx-color-neutral-200)}@supports(color:color-mix(in lab,red,red)){.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:color-mix(in oklab,var(--hx-color-neutral-200)70%,transparent)}}.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){padding-bottom:calc(var(--hx-spacing)*1);font-size:var(--hx-text-3xl);line-height:var(--tw-leading,var(--hx-text-3xl--line-height));--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold);--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight);color:var(--hx-color-slate-900)}@media(prefers-contrast:more){.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--hx-color-neutral-400)}}.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-primary-100)}@supports(color:color-mix(in lab,red,red)){.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-primary-100)10%,transparent)}}.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){color:var(--hx-color-slate-100)}@media(prefers-contrast:more){.content :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-neutral-400)}}.content :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*8);font-size:var(--hx-text-2xl);line-height:var(--tw-leading,var(--hx-text-2xl--line-height));--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold);--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight);color:var(--hx-color-slate-900)}.content :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){color:var(--hx-color-slate-100)}.content :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*8);font-size:var(--hx-text-xl);line-height:var(--tw-leading,var(--hx-text-xl--line-height));--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold);--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight);color:var(--hx-color-slate-900)}.content :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){color:var(--hx-color-slate-100)}.content :where(h5):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*8);font-size:var(--hx-text-lg);line-height:var(--tw-leading,var(--hx-text-lg--line-height));--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold);--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight);color:var(--hx-color-slate-900)}.content :where(h5):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){color:var(--hx-color-slate-100)}.content :where(h6):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*8);font-size:var(--hx-text-base);line-height:var(--tw-leading,var(--hx-text-base--line-height));--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold);--tw-tracking:var(--hx-tracking-tight);letter-spacing:var(--hx-tracking-tight);color:var(--hx-color-slate-900)}.content :where(h6):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){color:var(--hx-color-slate-100)}.content :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*6);--tw-leading:calc(var(--hx-spacing)*7);line-height:calc(var(--hx-spacing)*7)}.content :where(p):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}.content :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--hx-color-primary-600);text-decoration-line:underline;text-decoration-thickness:from-font}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*6);border-color:var(--hx-color-gray-300);color:var(--hx-color-gray-700);font-style:italic}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)):where(:dir(ltr),[dir=ltr],[dir=ltr] *){border-left-style:var(--tw-border-style);padding-left:calc(var(--hx-spacing)*6);border-left-width:2px}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)):where(:dir(rtl),[dir=rtl],[dir=rtl] *){border-right-style:var(--tw-border-style);padding-right:calc(var(--hx-spacing)*6);border-right-width:2px}.content :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-gray-700);color:var(--hx-color-gray-400)}.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){margin-bottom:calc(var(--hx-spacing)*4);border-radius:var(--hx-radius-xl);background-color:var(--hx-color-primary-700);overflow-x:auto}@supports(color:color-mix(in lab,red,red)){.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){background-color:color-mix(in oklab,var(--hx-color-primary-700)5%,transparent)}}.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){padding-block:calc(var(--hx-spacing)*4);--tw-font-weight:var(--hx-font-weight-medium);font-size:.9em;font-weight:var(--hx-font-weight-medium);-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media(prefers-contrast:more){.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){border-style:var(--tw-border-style);border-width:1px;border-color:var(--hx-color-primary-900)}@supports(color:color-mix(in lab,red,red)){.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){border-color:color-mix(in oklab,var(--hx-color-primary-900)20%,transparent)}}.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){--tw-contrast:contrast(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:var(--hx-color-primary-300)}@supports(color:color-mix(in lab,red,red)){.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-primary-300)10%,transparent)}}@media(prefers-contrast:more){.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-primary-100)}@supports(color:color-mix(in lab,red,red)){.content :where(pre):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-primary-100)40%,transparent)}}}.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)){border-radius:var(--hx-radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--hx-color-black)}@supports(color:color-mix(in lab,red,red)){.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)){border-color:color-mix(in oklab,var(--hx-color-black)4%,transparent)}}.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)){background-color:var(--hx-color-black)}@supports(color:color-mix(in lab,red,red)){.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)){background-color:color-mix(in oklab,var(--hx-color-black)3%,transparent)}}.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)){padding-inline:.25em;padding-block:calc(var(--hx-spacing)*.5);overflow-wrap:break-word;font-size:.9em}.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-white)}@supports(color:color-mix(in lab,red,red)){.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-white)10%,transparent)}}.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:var(--hx-color-white)}@supports(color:color-mix(in lab,red,red)){.content :where(code):not(:where(.hextra-code-block code,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-white)10%,transparent)}}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)){margin-block:calc(var(--hx-spacing)*6);width:100%;padding:calc(var(--hx-spacing)*0);font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height));--tw-leading:calc(var(--hx-spacing)*5);line-height:calc(var(--hx-spacing)*5);display:block;overflow-x:auto}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) thead{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--hx-color-gray-200)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) thead:where(.dark,.dark *){border-color:var(--hx-color-neutral-800)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) tbody tr{margin:calc(var(--hx-spacing)*0);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--hx-color-gray-100)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) tbody tr:where(.dark,.dark *){border-color:var(--hx-color-neutral-800)}@supports(color:color-mix(in lab,red,red)){.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) tbody tr:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-neutral-800)50%,transparent)}}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) th{margin:calc(var(--hx-spacing)*0);padding:calc(var(--hx-spacing)*2);--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) th:first-child{padding-left:calc(var(--hx-spacing)*0)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) th:last-child{padding-right:calc(var(--hx-spacing)*0)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) td{margin:calc(var(--hx-spacing)*0);padding:calc(var(--hx-spacing)*2)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) td:first-child{padding-left:calc(var(--hx-spacing)*0)}.content :where(table):not(:where(.hextra-code-block table,[class~=not-prose],[class~=not-prose] *)) td:last-child{padding-right:calc(var(--hx-spacing)*0)}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*6);list-style-type:decimal}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)):where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-left:calc(var(--hx-spacing)*6)}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)):where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:calc(var(--hx-spacing)*6)}.content :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)) li{margin-block:calc(var(--hx-spacing)*2)}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*6);list-style-type:disc}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)):where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-left:calc(var(--hx-spacing)*6)}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)):where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:calc(var(--hx-spacing)*6)}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)) li{margin-block:calc(var(--hx-spacing)*2)}.content :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)):has(li input[type=checkbox]){list-style-type:none}.content :where(ul,ol)>li>:where(ul,ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:calc(var(--hx-spacing)*0)}.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:var(--hx-radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--hx-color-black)}@supports(color:color-mix(in lab,red,red)){.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:color-mix(in oklab,var(--hx-color-black)4%,transparent)}}.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--hx-color-black)}@supports(color:color-mix(in lab,red,red)){.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:color-mix(in oklab,var(--hx-color-black)3%,transparent)}}.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline:.25em;padding-block:calc(var(--hx-spacing)*.5);overflow-wrap:break-word;font-size:.9em}.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-white)}@supports(color:color-mix(in lab,red,red)){.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-white)10%,transparent)}}.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:var(--hx-color-white)}@supports(color:color-mix(in lab,red,red)){.content :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-white)10%,transparent)}}.content :where(pre.mermaid):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)){background-color:#0000;border-radius:0}.content :where(pre.mermaid):not(:where(.hextra-code-block pre,[class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){background-color:#0000}.content :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-inline:auto;margin-block:calc(var(--hx-spacing)*4);border-radius:var(--hx-radius-md)}.content :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)) figcaption{margin-top:calc(var(--hx-spacing)*2);text-align:center;font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height));color:var(--hx-color-gray-500);display:block}.content :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)) figcaption:where(.dark,.dark *){color:var(--hx-color-gray-400)}.content :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)) dt{margin-top:calc(var(--hx-spacing)*6);--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold)}.content :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)) dd{margin-block:calc(var(--hx-spacing)*2);padding-inline-start:calc(var(--hx-spacing)*6)}.content :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-block:calc(var(--hx-spacing)*10);border-color:var(--hx-color-gray-200)}.content :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}.content :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)):last-child{margin-bottom:calc(var(--hx-spacing)*0)}.content :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)):where(.dark,.dark *){border-color:var(--hx-color-neutral-800)}.content .footnotes{margin-top:calc(var(--hx-spacing)*12);font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height))}.content .footnotes hr{border-color:var(--hx-color-gray-200)}.content .footnotes hr:where(.dark,.dark *){border-color:var(--hx-color-neutral-800)}.content .subheading-anchor{opacity:0;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration))}.content .subheading-anchor:where(:dir(ltr),[dir=ltr],[dir=ltr] *){margin-left:calc(var(--hx-spacing)*1)}.content .subheading-anchor:where(:dir(rtl),[dir=rtl],[dir=rtl] *){margin-right:calc(var(--hx-spacing)*1)}span:target+:is(.content .subheading-anchor),:hover>:is(.content .subheading-anchor),.content .subheading-anchor:focus{opacity:1}span+:is(.content .subheading-anchor),:hover>:is(.content .subheading-anchor){text-decoration-line:none !important}.content .subheading-anchor:after{content:var(--tw-content);color:var(--hx-color-gray-300)}.content .subheading-anchor:where(.dark,.dark *):after{content:var(--tw-content);color:var(--hx-color-neutral-700)}.content .subheading-anchor:after{padding-inline:calc(var(--hx-spacing)*1);--tw-content:"#";content:var(--tw-content)}span:target+:is(){color:var(--hx-color-gray-400)}span:target+:is():where(.dark,.dark *){color:var(--hx-color-neutral-500)}article details>summary::-webkit-details-marker{display:none}article details>summary:before{vertical-align:-4px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='hx:h-5 hx:w-5' viewBox='0 0 20 20' fill='currentColor'%3E%3Cpath fill-rule='evenodd' d='M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z' clip-rule='evenodd' /%3E%3C/svg%3E");width:1.2em;height:1.2em;padding:0 .6em}:lang(fa) ol{list-style-type:persian}.highlight .chroma .err{color:#a61717;background-color:#e3d2d2}.highlight .chroma .lnlinks{color:inherit;outline:none;text-decoration:none}.highlight .chroma .line{display:flex}.highlight .chroma .k,.highlight .chroma .kc,.highlight .chroma .kd,.highlight .chroma .kn,.highlight .chroma .kp,.highlight .chroma .kr{color:#000;font-weight:700}.highlight .chroma .kt{color:#458;font-weight:700}.highlight .chroma .na{color:teal}.highlight .chroma .nb{color:#0086b3}.highlight .chroma .bp{color:#999}.highlight .chroma .nc{color:#458;font-weight:700}.highlight .chroma .no{color:teal}.highlight .chroma .nd{color:#3c5d5d;font-weight:700}.highlight .chroma .ni{color:purple}.highlight .chroma .ne,.highlight .chroma .nf,.highlight .chroma .nl{color:#900;font-weight:700}.highlight .chroma .nn{color:#555}.highlight .chroma .nt{color:navy}.highlight .chroma .nv,.highlight .chroma .vc,.highlight .chroma .vg,.highlight .chroma .vi{color:teal}.highlight .chroma .s,.highlight .chroma .sa,.highlight .chroma .sb,.highlight .chroma .sc,.highlight .chroma .dl,.highlight .chroma .sd,.highlight .chroma .s2,.highlight .chroma .se,.highlight .chroma .sh,.highlight .chroma .si,.highlight .chroma .sx{color:#d14}.highlight .chroma .sr{color:#009926}.highlight .chroma .s1{color:#d14}.highlight .chroma .ss{color:#990073}.highlight .chroma .m,.highlight .chroma .mb,.highlight .chroma .mf,.highlight .chroma .mh,.highlight .chroma .mi,.highlight .chroma .il,.highlight .chroma .mo{color:#099}.highlight .chroma .o,.highlight .chroma .ow{color:#000;font-weight:700}.highlight .chroma .c,.highlight .chroma .ch,.highlight .chroma .cm,.highlight .chroma .c1{color:#998;font-style:italic}.highlight .chroma .cs,.highlight .chroma .cp,.highlight .chroma .cpf{color:#999;font-style:italic;font-weight:700}.highlight .chroma .gd{color:#000;background-color:#fdd}.highlight .chroma .ge{color:#000;font-style:italic}.highlight .chroma .gr{color:#a00}.highlight .chroma .gh{color:#999}.highlight .chroma .gi{color:#000;background-color:#dfd}.highlight .chroma .go{color:#888}.highlight .chroma .gp{color:#555}.highlight .chroma .gs{font-weight:700}.highlight .chroma .gu{color:#aaa}.highlight .chroma .gt{color:#a00}.highlight .chroma .gl{text-decoration:underline}.highlight .chroma .w{color:#bbb}.dark .highlight .chroma .err{color:#f85149}.dark .highlight .chroma .lnlinks{color:inherit;outline:none;text-decoration:none}.dark .highlight .chroma .line{display:flex}.dark .highlight .chroma .k{color:#ff7b72}.dark .highlight .chroma .kc{color:#79c0ff}.dark .highlight .chroma .kd,.dark .highlight .chroma .kn{color:#ff7b72}.dark .highlight .chroma .kp{color:#79c0ff}.dark .highlight .chroma .kr,.dark .highlight .chroma .kt{color:#ff7b72}.dark .highlight .chroma .nc{color:#f0883e;font-weight:700}.dark .highlight .chroma .no{color:#79c0ff;font-weight:700}.dark .highlight .chroma .nd{color:#d2a8ff;font-weight:700}.dark .highlight .chroma .ni{color:#ffa657}.dark .highlight .chroma .ne{color:#f0883e;font-weight:700}.dark .highlight .chroma .nf{color:#d2a8ff;font-weight:700}.dark .highlight .chroma .nl{color:#79c0ff;font-weight:700}.dark .highlight .chroma .nn{color:#ff7b72}.dark .highlight .chroma .py{color:#79c0ff}.dark .highlight .chroma .nt{color:#7ee787}.dark .highlight .chroma .nv{color:#79c0ff}.dark .highlight .chroma .l{color:#a5d6ff}.dark .highlight .chroma .ld{color:#79c0ff}.dark .highlight .chroma .s{color:#a5d6ff}.dark .highlight .chroma .sa{color:#79c0ff}.dark .highlight .chroma .sb,.dark .highlight .chroma .sc{color:#a5d6ff}.dark .highlight .chroma .dl{color:#79c0ff}.dark .highlight .chroma .sd,.dark .highlight .chroma .s2{color:#a5d6ff}.dark .highlight .chroma .se,.dark .highlight .chroma .sh{color:#79c0ff}.dark .highlight .chroma .si,.dark .highlight .chroma .sx{color:#a5d6ff}.dark .highlight .chroma .sr{color:#79c0ff}.dark .highlight .chroma .s1,.dark .highlight .chroma .ss,.dark .highlight .chroma .m,.dark .highlight .chroma .mb,.dark .highlight .chroma .mf,.dark .highlight .chroma .mh,.dark .highlight .chroma .mi,.dark .highlight .chroma .il,.dark .highlight .chroma .mo{color:#a5d6ff}.dark .highlight .chroma .o,.dark .highlight .chroma .ow{color:#ff7b72;font-weight:700}.dark .highlight .chroma .c,.dark .highlight .chroma .ch,.dark .highlight .chroma .cm,.dark .highlight .chroma .c1{color:#8b949e;font-style:italic}.dark .highlight .chroma .cs,.dark .highlight .chroma .cp,.dark .highlight .chroma .cpf{color:#8b949e;font-style:italic;font-weight:700}.dark .highlight .chroma .gd{color:#ffa198;background-color:#490202}.dark .highlight .chroma .ge{color:inherit;font-style:italic}.dark .highlight .chroma .gr{color:#ffa198}.dark .highlight .chroma .gh{color:#79c0ff;font-weight:700}.dark .highlight .chroma .gi{color:#56d364;background-color:#0f5323}.dark .highlight .chroma .go,.dark .highlight .chroma .gp{color:#8b949e}.dark .highlight .chroma .gs{font-weight:700}.dark .highlight .chroma .gu{color:#79c0ff}.dark .highlight .chroma .gt{color:#ff7b72}.dark .highlight .chroma .gl{text-decoration:underline}.dark .highlight .chroma .w{color:#6e7681}.hextra-code-block{--tw-leading:calc(var(--hx-spacing)*5);font-size:.9em;line-height:calc(var(--hx-spacing)*5)}.hextra-code-block pre{background-color:var(--hx-color-primary-700);overflow-x:auto}@supports(color:color-mix(in lab,red,red)){.hextra-code-block pre{background-color:color-mix(in oklab,var(--hx-color-primary-700)5%,transparent)}}.hextra-code-block pre{--tw-font-weight:var(--hx-font-weight-medium);font-size:.9em;font-weight:var(--hx-font-weight-medium);-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}@media(prefers-contrast:more){.hextra-code-block pre{border-style:var(--tw-border-style);border-width:1px;border-color:var(--hx-color-primary-900)}@supports(color:color-mix(in lab,red,red)){.hextra-code-block pre{border-color:color-mix(in oklab,var(--hx-color-primary-900)20%,transparent)}}.hextra-code-block pre{--tw-contrast:contrast(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}}.hextra-code-block pre:where(.dark,.dark *){background-color:var(--hx-color-primary-300)}@supports(color:color-mix(in lab,red,red)){.hextra-code-block pre:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-primary-300)10%,transparent)}}@media(prefers-contrast:more){.hextra-code-block pre:where(.dark,.dark *){border-color:var(--hx-color-primary-100)}@supports(color:color-mix(in lab,red,red)){.hextra-code-block pre:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-primary-100)40%,transparent)}}}.hextra-code-block .hextra-code-filename{top:calc(var(--hx-spacing)*0);z-index:1;text-overflow:ellipsis;white-space:nowrap;border-top-left-radius:var(--hx-radius-xl);border-top-right-radius:var(--hx-radius-xl);background-color:var(--hx-color-primary-700);width:100%;position:absolute;overflow:hidden}@supports(color:color-mix(in lab,red,red)){.hextra-code-block .hextra-code-filename{background-color:color-mix(in oklab,var(--hx-color-primary-700)5%,transparent)}}.hextra-code-block .hextra-code-filename{padding-inline:calc(var(--hx-spacing)*4);padding-block:calc(var(--hx-spacing)*2);font-size:var(--hx-text-xs);line-height:var(--tw-leading,var(--hx-text-xs--line-height));color:var(--hx-color-gray-700)}.hextra-code-block .hextra-code-filename:where(.dark,.dark *){background-color:var(--hx-color-primary-300)}@supports(color:color-mix(in lab,red,red)){.hextra-code-block .hextra-code-filename:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-primary-300)10%,transparent)}}.hextra-code-block .hextra-code-filename:where(.dark,.dark *){color:var(--hx-color-gray-200)}.hextra-code-block .hextra-code-filename+pre:not(.lntable pre){padding-top:calc(var(--hx-spacing)*12)}.hextra-code-block pre:not(.lntable pre){margin-bottom:calc(var(--hx-spacing)*4);border-radius:var(--hx-radius-xl);padding-inline:calc(var(--hx-spacing)*4);padding-block:calc(var(--hx-spacing)*4)}.hextra-code-block div:nth-of-type(2) pre{padding-top:calc(var(--hx-spacing)*12);padding-bottom:calc(var(--hx-spacing)*4)}.chroma .lntable{margin:calc(var(--hx-spacing)*0);border-radius:var(--hx-radius-xl);width:auto;display:block;overflow:auto}.chroma .lntable pre{padding-top:calc(var(--hx-spacing)*4);padding-bottom:calc(var(--hx-spacing)*4)}.chroma .ln,.chroma .lnt:not(.hl>.lnt),.chroma .hl:not(.line){min-width:2.6rem;padding-right:calc(var(--hx-spacing)*4);padding-left:calc(var(--hx-spacing)*4);color:var(--hx-color-neutral-600)}:is(.chroma .ln,.chroma .lnt:not(.hl>.lnt),.chroma .hl:not(.line)):where(.dark,.dark *){color:var(--hx-color-neutral-300)}.chroma .lntd{padding:calc(var(--hx-spacing)*0);vertical-align:top}.chroma .lntd:last-of-type{width:100%}.chroma .hl{background-color:var(--hx-color-primary-800);width:100%;display:block}@supports(color:color-mix(in lab,red,red)){.chroma .hl{background-color:color-mix(in oklab,var(--hx-color-primary-800)10%,transparent)}}.hextra-cards{grid-template-columns:repeat(auto-fill,minmax(max(250px,calc((100% - 1rem*2)/var(--hextra-cards-grid-cols))),1fr))}.hextra-card{position:relative}.hextra-card img{-webkit-user-select:none;user-select:none}.hextra-card:hover .hextra-card-icon svg{color:currentColor}.hextra-card .hextra-card-icon svg{color:#0003;width:1.5rem;transition:color .3s}.hextra-card p{margin-top:.5rem;position:relative}.dark .hextra-card .hextra-card-icon svg{color:#fff6}.dark .hextra-card:hover .hextra-card-icon svg{color:currentColor}.hextra-card-tag{z-index:10;position:absolute;top:5px}.hextra-card-tag:where(:dir(ltr)){right:5px}.hextra-card-tag:where(:dir(rtl)){left:5px}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker){counter-increment:step}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):where(:dir(ltr),[dir=ltr],[dir=ltr] *):before{content:var(--tw-content);margin-left:-41px}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):where(:dir(rtl),[dir=rtl],[dir=rtl] *):before{content:var(--tw-content);margin-right:-44px}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):before{content:var(--tw-content);background-color:var(--hx-color-gray-100)}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):where(.dark,.dark *):before{content:var(--tw-content);background-color:var(--hx-color-neutral-800)}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):before{content:var(--tw-content);border-style:var(--tw-border-style);content:var(--tw-content);border-width:4px;border-color:var(--hx-color-white)}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):where(.dark,.dark *):before{content:var(--tw-content);border-color:var(--hx-color-dark)}.hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):before{content:counter(step);text-align:center;text-indent:-1px;width:33px;height:33px;font-size:var(--hx-text-base);line-height:var(--tw-leading,var(--hx-text-base--line-height));--tw-font-weight:var(--hx-font-weight-normal);font-weight:var(--hx-font-weight-normal);color:var(--hx-color-neutral-400);border-radius:3.40282e38px;position:absolute}:lang(fa) .hextra-steps :where(h2,h3,h4,h5,h6):not(.no-step-marker):before{content:counter(step,persian)}.hextra-search-wrapper li{margin-inline:calc(var(--hx-spacing)*2.5);border-radius:var(--hx-radius-md);overflow-wrap:break-word;color:var(--hx-color-gray-800)}@media(prefers-contrast:more){.hextra-search-wrapper li{border-style:var(--tw-border-style);border-width:1px;border-color:#0000}}.hextra-search-wrapper li:where(.dark,.dark *){color:var(--hx-color-gray-300)}.hextra-search-wrapper li a{scroll-margin:calc(var(--hx-spacing)*12);padding-inline:calc(var(--hx-spacing)*2.5);padding-block:calc(var(--hx-spacing)*2);display:block}.hextra-search-wrapper li a:focus,.hextra-search-wrapper li a:focus-visible{--tw-outline-style:none;outline-style:none}.hextra-search-wrapper li .hextra-search-title{font-size:var(--hx-text-base);line-height:var(--tw-leading,var(--hx-text-base--line-height));--tw-leading:calc(var(--hx-spacing)*5);line-height:calc(var(--hx-spacing)*5);--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold)}.hextra-search-wrapper li .hextra-search-active{border-radius:var(--hx-radius-md);background-color:var(--hx-color-primary-500)}@supports(color:color-mix(in lab,red,red)){.hextra-search-wrapper li .hextra-search-active{background-color:color-mix(in oklab,var(--hx-color-primary-500)10%,transparent)}}@media(prefers-contrast:more){.hextra-search-wrapper li .hextra-search-active{border-color:var(--hx-color-primary-500)}}.hextra-search-wrapper .hextra-search-no-result{padding:calc(var(--hx-spacing)*8);text-align:center;font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height));color:var(--hx-color-gray-400);-webkit-user-select:none;user-select:none;display:block}.hextra-search-wrapper .hextra-search-prefix{margin-inline:calc(var(--hx-spacing)*2.5);margin-top:calc(var(--hx-spacing)*6);margin-bottom:calc(var(--hx-spacing)*2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--hx-color-black)}@supports(color:color-mix(in lab,red,red)){.hextra-search-wrapper .hextra-search-prefix{border-color:color-mix(in oklab,var(--hx-color-black)10%,transparent)}}.hextra-search-wrapper .hextra-search-prefix{padding-inline:calc(var(--hx-spacing)*2.5);padding-bottom:calc(var(--hx-spacing)*1.5);font-size:var(--hx-text-xs);line-height:var(--tw-leading,var(--hx-text-xs--line-height));--tw-font-weight:var(--hx-font-weight-semibold);font-weight:var(--hx-font-weight-semibold);color:var(--hx-color-gray-500);text-transform:uppercase;-webkit-user-select:none;user-select:none}.hextra-search-wrapper .hextra-search-prefix:first-child{margin-top:calc(var(--hx-spacing)*0)}@media(prefers-contrast:more){.hextra-search-wrapper .hextra-search-prefix{border-color:var(--hx-color-gray-600);color:var(--hx-color-gray-900)}}.hextra-search-wrapper .hextra-search-prefix:where(.dark,.dark *){border-color:var(--hx-color-white)}@supports(color:color-mix(in lab,red,red)){.hextra-search-wrapper .hextra-search-prefix:where(.dark,.dark *){border-color:color-mix(in oklab,var(--hx-color-white)20%,transparent)}}.hextra-search-wrapper .hextra-search-prefix:where(.dark,.dark *){color:var(--hx-color-gray-300)}@media(prefers-contrast:more){.hextra-search-wrapper .hextra-search-prefix:where(.dark,.dark *){border-color:var(--hx-color-gray-50);color:var(--hx-color-gray-50)}}.hextra-search-wrapper .hextra-search-excerpt{margin-top:calc(var(--hx-spacing)*1);font-size:var(--hx-text-sm);line-height:var(--tw-leading,var(--hx-text-sm--line-height));--tw-leading:1.35rem;text-overflow:ellipsis;color:var(--hx-color-gray-600);line-height:1.35rem;overflow:hidden}.hextra-search-wrapper .hextra-search-excerpt:where(.dark,.dark *){color:var(--hx-color-gray-400)}@media(prefers-contrast:more){.hextra-search-wrapper .hextra-search-excerpt:where(.dark,.dark *){color:var(--hx-color-gray-50)}}.hextra-search-wrapper .hextra-search-excerpt{line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box}.hextra-search-wrapper .hextra-search-match{color:var(--hx-color-primary-600)}@media(max-width:48rem){.hextra-sidebar-container{top:calc(var(--hx-spacing)*0);bottom:calc(var(--hx-spacing)*0);z-index:15;overscroll-behavior:contain;background-color:var(--hx-color-white);width:100%;padding-top:calc(var(--navbar-height) + var(--hextra-banner-height));position:fixed}.hextra-sidebar-container:where(.dark,.dark *){background-color:var(--hx-color-dark)}.hextra-sidebar-container{will-change:transform,opacity;contain:layout style;backface-visibility:hidden;transition:transform .4s cubic-bezier(.52,.16,.04,1)}}.hextra-sidebar-container li>div{height:calc(var(--hx-spacing)*0)}.hextra-sidebar-container li.open>div{height:auto;padding-top:calc(var(--hx-spacing)*1)}.hextra-sidebar-container li.open>a>span>svg>path{rotate:90deg}.hextra-banner-hidden .hextra-banner{display:none}.hextra-banner :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:underline;text-decoration-thickness:from-font}.hextra-banner :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){--tw-leading:calc(var(--hx-spacing)*7);line-height:calc(var(--hx-spacing)*7)}.hextra-banner :where(p):not(:where([class~=not-prose],[class~=not-prose] *)):first-child{margin-top:calc(var(--hx-spacing)*0)}nav .hextra-search-wrapper{display:none}@media(min-width:48rem){nav .hextra-search-wrapper{display:inline-block}}@supports((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){.hextra-nav-container-blur{background-color:var(--hx-color-white)}@supports(color:color-mix(in lab,red,red)){.hextra-nav-container-blur{background-color:color-mix(in oklab,var(--hx-color-white)85%,transparent)}}.hextra-nav-container-blur{--tw-backdrop-blur:blur(var(--hx-blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.hextra-nav-container-blur:where(.dark,.dark *){background-color:var(--hx-color-dark) !important}@supports(color:color-mix(in lab,red,red)){.hextra-nav-container-blur:where(.dark,.dark *){background-color:color-mix(in oklab,var(--hx-color-dark)80%,transparent) !important}}}.hextra-hamburger-menu svg g{transform-origin:50%;transition-property:all;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration));--tw-duration:.1s;--tw-ease:var(--hx-ease-out);transition-duration:.1s;transition-timing-function:var(--hx-ease-out)}.hextra-hamburger-menu svg path{opacity:1;transition-property:all;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration));--tw-duration:.1s;--tw-ease:var(--hx-ease-out);transition-duration:.1s;transition-delay:.1s;transition-timing-function:var(--hx-ease-out)}.hextra-hamburger-menu svg.open path{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration));--tw-duration:.1s;--tw-ease:var(--hx-ease-out);transition-duration:.1s;transition-delay:0s;transition-timing-function:var(--hx-ease-out)}.hextra-hamburger-menu svg.open g{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration));--tw-duration:.1s;--tw-ease:var(--hx-ease-out);transition-duration:.1s;transition-delay:.1s;transition-timing-function:var(--hx-ease-out)}.hextra-hamburger-menu svg.open>path{opacity:0}.hextra-hamburger-menu svg.open>g:first-of-type{rotate:45deg}.hextra-hamburger-menu svg.open>g:first-of-type path{--tw-translate-y:calc(var(--hx-spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.hextra-hamburger-menu svg.open>g:nth-of-type(2){rotate:-45deg}.hextra-hamburger-menu svg.open>g:nth-of-type(2) path{--tw-translate-y:calc(var(--hx-spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.hextra-scrollbar,.hextra-scrollbar *{scrollbar-width:thin;scrollbar-color:oklch(55.55% 0 0/.4)transparent;scrollbar-gutter:stable}:is(.hextra-scrollbar,.hextra-scrollbar *)::-webkit-scrollbar{height:calc(var(--hx-spacing)*3);width:calc(var(--hx-spacing)*3)}:is(.hextra-scrollbar,.hextra-scrollbar *)::-webkit-scrollbar-track{background-color:#0000}:is(.hextra-scrollbar,.hextra-scrollbar *)::-webkit-scrollbar-thumb{border-radius:10px}:is(.hextra-scrollbar,.hextra-scrollbar *):hover::-webkit-scrollbar-thumb{background-color:var(--tw-shadow-color);--tw-shadow-color:var(--hx-color-neutral-500);background-clip:content-box;border:3px solid #0000}@supports(color:color-mix(in lab,red,red)){:is(.hextra-scrollbar,.hextra-scrollbar *):hover::-webkit-scrollbar-thumb{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--hx-color-neutral-500)20%,transparent)var(--tw-shadow-alpha),transparent)}}@media(hover:hover){:is(.hextra-scrollbar,.hextra-scrollbar *):hover::-webkit-scrollbar-thumb:hover{--tw-shadow-color:var(--hx-color-neutral-500)}@supports(color:color-mix(in lab,red,red)){:is(.hextra-scrollbar,.hextra-scrollbar *):hover::-webkit-scrollbar-thumb:hover{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--hx-color-neutral-500)40%,transparent)var(--tw-shadow-alpha),transparent)}}}@supports((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){.hextra-code-copy-btn{opacity:.85;--tw-backdrop-blur:blur(var(--hx-blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.hextra-code-copy-btn:where(.dark,.dark *){opacity:.8}}@media(min-width:1024px){.hextra-feature-grid{grid-template-columns:repeat(var(--hextra-feature-grid-cols),minmax(0,1fr))}}.hextra-jupyter-code-cell{scrollbar-gutter:auto;margin-top:calc(var(--hx-spacing)*6)}.hextra-jupyter-code-cell .hextra-jupyter-code-cell-outputs-container{font-size:var(--hx-text-xs);line-height:var(--tw-leading,var(--hx-text-xs--line-height));overflow:hidden}.hextra-jupyter-code-cell .hextra-jupyter-code-cell-outputs-container .hextra-jupyter-code-cell-outputs{max-height:50vh;overflow:auto}.hextra-jupyter-code-cell .hextra-jupyter-code-cell-outputs-container .hextra-jupyter-code-cell-outputs pre{max-width:100%;font-size:var(--hx-text-xs);line-height:var(--tw-leading,var(--hx-text-xs--line-height));overflow:auto}.hextra-badge{align-items:center;display:inline-flex}.hextra-toc a.hextra-toc-active{transition-property:all;transition-timing-function:var(--tw-ease,var(--hx-default-transition-timing-function));transition-duration:var(--tw-duration,var(--hx-default-transition-duration));--tw-duration:.2s;transition-duration:.2s;color:var(--hx-color-gray-900) !important}.hextra-toc a.hextra-toc-active:where(.dark,.dark *){color:var(--hx-color-gray-50) !important}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}:root{--primary-hue:187deg;--primary-saturation:54.4%;--primary-lightness:57.8%}.hx\:line-clamp-3.hextra-card-subtitle{-webkit-line-clamp:30}.author-cards{grid-template-columns:repeat(auto-fill,minmax(max(150px,calc((100% - 1rem * 4)/var(--hextra-cards-grid-cols))),1fr))}.support-cards{grid-template-columns:repeat(auto-fill,minmax(max(200px,calc((100% - 1rem * 4)/var(--hextra-cards-grid-cols))),1fr))}.support-cards .hextra-card-image{margin:2rem}.gl-hidden{display:none}.hextra-nav-container a[title="Support us"]{transition:ease-in-out .2s}.hextra-nav-container a[title="Support us"]:hover{transform:scale(1.3,1.3)}.hextra-footer .social-media{transition:ease-in-out .2s}.hextra-footer .social-media :hover{transform:translateY(-2px)}.hextra-banner{background:#6bb43a;background:linear-gradient(135deg,#6bb43a 0%,#1dfdfd 50%,#4591fc 100%);color:var(--hx-color-slate-900)}.extra-banner-close-button{color:var(--hx-color-slate-50)} \ No newline at end of file diff --git a/docs/configuration/cli/index.html b/docs/configuration/cli/index.html new file mode 100644 index 000000000000..1379a46d7a54 --- /dev/null +++ b/docs/configuration/cli/index.html @@ -0,0 +1,424 @@ +Command-Line – Golangci-lint
New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

Command-Line

$ golangci-lint -h
+Smart, fast linters runner.
+
+Usage:
+  golangci-lint [flags]
+  golangci-lint [command]
+
+Available Commands:
+  cache       Cache control and information.
+  completion  Generate the autocompletion script for the specified shell
+  config      Configuration file information and verification.
+  custom      Build a version of golangci-lint with custom linters.
+  fmt         Format Go source files.
+  formatters  List current formatters configuration.
+  help        Display extra help
+  linters     List current linters configuration.
+  migrate     Migrate configuration file from v1 to v2.
+  run         Lint the code.
+  version     Display the golangci-lint version.
+
+Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+      --version        Print version
+
+Use "golangci-lint [command] --help" for more information about a command.
+

run +

Note

This command executes enabled linters, and the formatters defined in formatters, +but it does not format the code.

To only format code, use golangci-lint fmt. +To apply both linter fixes and formatting, use golangci-lint run --fix.

The formatters cannot be enabled or disabled inside the linters section or the flags -E/--enable, -D/--disable of the command golangci-lint run.

The formatters can be enabled/disabled by defining them inside the formatters section or by using the flags -E/--enable, -D/--disable of command golangci-lint fmt.

$ golangci-lint run -h
+Lint the code.
+
+Usage:
+  golangci-lint run [flags]
+
+Flags:
+  -c, --config PATH                       Read config from file path PATH
+      --no-config                         Don't read config file
+      --default string                    Default set of linters to enable (default "standard")
+  -D, --disable strings                   Disable specific linter
+  -E, --enable strings                    Enable specific linter
+      --enable-only strings               Override linters configuration section to only run the specific linter(s)
+      --fast-only                         Filter enabled linters to run only fast linters
+  -j, --concurrency int                   Number of CPUs to use (Default: Automatically set to match Linux container CPU quota and fall back to the number of logical CPUs in the machine)
+      --modules-download-mode string      Modules download mode. If not empty, passed as -mod=<mode> to go tools
+      --issues-exit-code int              Exit code when issues were found (default 1)
+      --build-tags strings                Build tags
+      --timeout duration                  Timeout for total work. Disabled by default
+      --tests                             Analyze tests (*_test.go) (default true)
+      --allow-parallel-runners            Allow multiple parallel golangci-lint instances running.
+                                          If false (default) - golangci-lint acquires file lock on start.
+      --allow-serial-runners              Allow multiple golangci-lint instances running, but serialize them around a lock.
+                                          If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start.
+      --path-prefix string                Path prefix to add to output
+      --path-mode string                  Path mode to use (empty, or 'abs')
+      --show-stats                        Show statistics per linter (default true)
+      --output.text.path stdout           Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.text.print-linter-name     Print linter name in the end of issue text. (default true)
+      --output.text.print-issued-lines    Print lines of code with issue. (default true)
+      --output.text.colors                Use colors. (default true)
+      --output.json.path stdout           Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.tab.path stdout            Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.tab.print-linter-name      Print linter name in the end of issue text. (default true)
+      --output.tab.colors                 Use colors. (default true)
+      --output.html.path stdout           Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.checkstyle.path stdout     Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.code-climate.path stdout   Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.junit-xml.path stdout      Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.junit-xml.extended         Support extra JUnit XML fields.
+      --output.teamcity.path stdout       Output path can be either stdout, `stderr` or path to the file to write to.
+      --output.sarif.path stdout          Output path can be either stdout, `stderr` or path to the file to write to.
+      --max-issues-per-linter int         Maximum issues count per one linter. Set to 0 to disable (default 50)
+      --max-same-issues int               Maximum count of issues with the same text. Set to 0 to disable (default 3)
+      --uniq-by-line                      Make issues output unique by line (default true)
+  -n, --new                               Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.
+                                          It's a super-useful option for integration of golangci-lint into existing large codebase.
+                                          It's not practical to fix all existing issues at the moment of integration: much better to not allow issues in new code.
+                                          For CI setups, prefer --new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate unstaged files before golangci-lint runs.
+      --new-from-rev REV                  Show only new issues created after git revision REV
+      --new-from-patch PATH               Show only new issues created in git patch with file path PATH
+      --new-from-merge-base string        Show only new issues created after the best common ancestor (merge-base against HEAD)
+      --whole-files                       Show issues in any part of update files (requires new-from-rev or new-from-patch)
+      --fix                               Fix found issues (if it's supported by the linter)
+      --cpu-profile-path string           Path to CPU profile output file
+      --mem-profile-path string           Path to memory profile output file
+      --trace-path string                 Path to trace output file
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

When the --cpu-profile-path or --mem-profile-path arguments are specified, +golangci-lint writes runtime profiling data in the format expected by the pprof visualization tool.

When the --trace-path argument is specified, golangci-lint writes runtime tracing data in the format expected by +the go tool trace command and visualization tool.

fmt +

$ golangci-lint fmt -h
+Format Go source files.
+
+Usage:
+  golangci-lint fmt [flags]
+
+Flags:
+  -c, --config PATH      Read config from file path PATH
+      --no-config        Don't read config file
+  -E, --enable strings   Enable specific formatter
+  -d, --diff             Display diffs instead of rewriting files
+      --diff-colored     Display diffs instead of rewriting files (with colors)
+      --stdin            Use standard input for piping source files
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

migrate +

$ golangci-lint migrate -h
+Migrate configuration file from v1 to v2.
+
+Usage:
+  golangci-lint migrate [flags]
+
+Flags:
+  -c, --config PATH       Read config from file path PATH
+      --no-config         Don't read config file
+      --format string     Output file format.
+                          By default, the format of the input configuration file is used.
+                          It can be 'yml', 'yaml', 'toml', or 'json'.
+      --skip-validation   Skip validation of the configuration file against the JSON Schema for v1.
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

formatters +

$ golangci-lint formatters -h
+List current formatters configuration.
+
+Usage:
+  golangci-lint formatters [flags]
+
+Flags:
+  -c, --config PATH      Read config from file path PATH
+      --no-config        Don't read config file
+  -E, --enable strings   Enable specific formatter
+      --json             Display as JSON
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

help +

$ golangci-lint help -h
+Display extra help
+
+Usage:
+  golangci-lint help [flags]
+  golangci-lint help [command]
+
+Available Commands:
+  formatters  Display help for formatters.
+  linters     Display help for linters.
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+
+Use "golangci-lint help [command] --help" for more information about a command.
+

linters +

$ golangci-lint linters -h
+List current linters configuration.
+
+Usage:
+  golangci-lint linters [flags]
+
+Flags:
+  -c, --config PATH           Read config from file path PATH
+      --no-config             Don't read config file
+      --default string        Default set of linters to enable (default "standard")
+  -D, --disable strings       Disable specific linter
+  -E, --enable strings        Enable specific linter
+      --enable-only strings   Override linters configuration section to only run the specific linter(s)
+      --fast-only             Filter enabled linters to run only fast linters
+      --json                  Display as JSON
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

cache +

Golangci-lint stores its cache in the subdirectory golangci-lint inside the default user cache directory.

You can override the default cache directory with the environment variable GOLANGCI_LINT_CACHE; the path must be absolute.

The cache is only used by golangci-lint run (linters).

$ golangci-lint cache -h
+Cache control and information.
+
+Usage:
+  golangci-lint cache [flags]
+  golangci-lint cache [command]
+
+Available Commands:
+  clean       Clean cache
+  status      Show cache status
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+
+Use "golangci-lint cache [command] --help" for more information about a command.
+

config +

$ golangci-lint config -h
+Configuration file information and verification.
+
+Usage:
+  golangci-lint config [flags]
+  golangci-lint config [command]
+
+Available Commands:
+  path        Print used configuration path.
+  verify      Verify configuration against JSON schema.
+
+Flags:
+  -c, --config PATH   Read config from file path PATH
+      --no-config     Don't read config file
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+
+Use "golangci-lint config [command] --help" for more information about a command.
+

custom +

$ golangci-lint custom -h
+Build a version of golangci-lint with custom linters.
+
+Usage:
+  golangci-lint custom [flags]
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

version +

$ golangci-lint version -h
+Display the golangci-lint version.
+
+Usage:
+  golangci-lint version [flags]
+
+Flags:
+      --debug   Add build information
+      --json    Display as JSON
+      --short   Display only the version number
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+

completion +

$ golangci-lint completion -h
+Generate the autocompletion script for golangci-lint for the specified shell.
+See each sub-command's help for details on how to use the generated script.
+
+Usage:
+  golangci-lint completion [command]
+
+Available Commands:
+  bash        Generate the autocompletion script for bash
+  fish        Generate the autocompletion script for fish
+  powershell  Generate the autocompletion script for powershell
+  zsh         Generate the autocompletion script for zsh
+
+Global Flags:
+      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
+  -h, --help           Help for a command
+  -v, --verbose        Verbose output
+
+Use "golangci-lint completion [command] --help" for more information about a command.
+
Last updated on
\ No newline at end of file diff --git a/docs/configuration/file/index.html b/docs/configuration/file/index.html new file mode 100644 index 000000000000..02ce7248d8f2 --- /dev/null +++ b/docs/configuration/file/index.html @@ -0,0 +1,693 @@ +Configuration File – Golangci-lint
New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

Configuration File

Golangci-lint looks for config files in the following paths from the current working directory:

  • .golangci.yml
  • .golangci.yaml
  • .golangci.toml
  • .golangci.json

Golangci-lint also searches for config files in all directories from the directory of the first analyzed path up to the root. +If no configuration file has been found, golangci-lint will try to find one in your home directory. +To see which config file is being used and where it was sourced from run golangci-lint with -v option.

Config options inside the file are identical to command-line options. +You can configure specific linters’ options only within the config file (not the command-line).

There is a .golangci.reference.yml file with all supported options, their descriptions, and default values. +This file is neither a working example nor a recommended configuration, +it’s just a reference to display all the configuration options used to generate the documentation.

The configuration file can be validated with the JSON Schema: golangci.jsonschema.json

# See the dedicated "version" documentation section.
+version: "2"
+linters:
+  # See the dedicated "linters" documentation section.
+  option: value
+formatters:
+  # See the dedicated "formatters" documentation section.
+  option: value
+issues:
+  # See the dedicated "issues" documentation section.
+  option: value
+# Output configuration options.
+output:
+  # See the dedicated "output" documentation section.
+  option: value
+# Options for analysis running.
+run:
+  # See the dedicated "run" documentation section.
+  option: value
+severity:
+  # See the dedicated "severity" documentation section.
+  option: value

version configuration +

# Defines the configuration version.
+# The only possible value is "2".
+version: "2"

linters configuration +

linters:
+  # Default set of linters.
+  # The value can be:
+  # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default
+  # - `all`: enables all linters by default.
+  # - `none`: disables all linters by default.
+  # - `fast`: enables only linters considered as "fast" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`).
+  # Default: standard
+  default: all
+  # Enable specific linter.
+  enable:
+    - arangolint
+    - asasalint
+    - asciicheck
+    - bidichk
+    - bodyclose
+    - canonicalheader
+    - containedctx
+    - contextcheck
+    - copyloopvar
+    - cyclop
+    - decorder
+    - depguard
+    - dogsled
+    - dupl
+    - dupword
+    - durationcheck
+    - embeddedstructfieldcheck
+    - err113
+    - errcheck
+    - errchkjson
+    - errname
+    - errorlint
+    - exhaustive
+    - exhaustruct
+    - exptostd
+    - fatcontext
+    - forbidigo
+    - forcetypeassert
+    - funcorder
+    - funlen
+    - ginkgolinter
+    - gocheckcompilerdirectives
+    - gochecknoglobals
+    - gochecknoinits
+    - gochecksumtype
+    - gocognit
+    - goconst
+    - gocritic
+    - gocyclo
+    - godoclint
+    - godot
+    - godox
+    - goheader
+    - gomoddirectives
+    - gomodguard
+    - goprintffuncname
+    - gosec
+    - gosmopolitan
+    - govet
+    - grouper
+    - iface
+    - importas
+    - inamedparam
+    - ineffassign
+    - interfacebloat
+    - intrange
+    - iotamixing
+    - ireturn
+    - lll
+    - loggercheck
+    - maintidx
+    - makezero
+    - mirror
+    - misspell
+    - mnd
+    - musttag
+    - nakedret
+    - nestif
+    - nilerr
+    - nilnesserr
+    - nilnil
+    - nlreturn
+    - noctx
+    - noinlineerr
+    - nolintlint
+    - nonamedreturns
+    - nosprintfhostport
+    - paralleltest
+    - perfsprint
+    - prealloc
+    - predeclared
+    - promlinter
+    - protogetter
+    - reassign
+    - recvcheck
+    - revive
+    - rowserrcheck
+    - sloglint
+    - spancheck
+    - sqlclosecheck
+    - staticcheck
+    - tagalign
+    - tagliatelle
+    - testableexamples
+    - testifylint
+    - testpackage
+    - thelper
+    - tparallel
+    - unconvert
+    - unparam
+    - unqueryvet
+    - unused
+    - usestdlibvars
+    - usetesting
+    - varnamelen
+    - wastedassign
+    - whitespace
+    - wrapcheck
+    - wsl
+    - wsl_v5
+    - zerologlint
+  # Disable specific linters.
+  disable:
+    - arangolint
+    - asasalint
+    - asciicheck
+    - bidichk
+    - bodyclose
+    - canonicalheader
+    - containedctx
+    - contextcheck
+    - copyloopvar
+    - cyclop
+    - decorder
+    - depguard
+    - dogsled
+    - dupl
+    - dupword
+    - durationcheck
+    - embeddedstructfieldcheck
+    - err113
+    - errcheck
+    - errchkjson
+    - errname
+    - errorlint
+    - exhaustive
+    - exhaustruct
+    - exptostd
+    - fatcontext
+    - forbidigo
+    - forcetypeassert
+    - funcorder
+    - funlen
+    - ginkgolinter
+    - gocheckcompilerdirectives
+    - gochecknoglobals
+    - gochecknoinits
+    - gochecksumtype
+    - gocognit
+    - goconst
+    - gocritic
+    - gocyclo
+    - godoclint
+    - godot
+    - godox
+    - goheader
+    - gomoddirectives
+    - gomodguard
+    - goprintffuncname
+    - gosec
+    - gosmopolitan
+    - govet
+    - grouper
+    - iface
+    - importas
+    - inamedparam
+    - ineffassign
+    - interfacebloat
+    - intrange
+    - iotamixing
+    - ireturn
+    - lll
+    - loggercheck
+    - maintidx
+    - makezero
+    - mirror
+    - misspell
+    - mnd
+    - musttag
+    - nakedret
+    - nestif
+    - nilerr
+    - nilnesserr
+    - nilnil
+    - nlreturn
+    - noctx
+    - noinlineerr
+    - nolintlint
+    - nonamedreturns
+    - nosprintfhostport
+    - paralleltest
+    - perfsprint
+    - prealloc
+    - predeclared
+    - promlinter
+    - protogetter
+    - reassign
+    - recvcheck
+    - revive
+    - rowserrcheck
+    - sloglint
+    - spancheck
+    - sqlclosecheck
+    - staticcheck
+    - tagalign
+    - tagliatelle
+    - testableexamples
+    - testifylint
+    - testpackage
+    - thelper
+    - tparallel
+    - unconvert
+    - unparam
+    - unqueryvet
+    - unused
+    - usestdlibvars
+    - usetesting
+    - varnamelen
+    - wastedassign
+    - whitespace
+    - wrapcheck
+    - wsl
+    - wsl_v5
+    - zerologlint
+  # All available settings of specific linters.
+  settings:
+    # See the dedicated "linters.settings" documentation section.
+    option: value
+  # Defines a set of rules to ignore issues.
+  # It does not skip the analysis, and so does not ignore "typecheck" errors.
+  exclusions:
+    # Mode of the generated files analysis.
+    #
+    # - `strict`: sources are excluded by strictly following the Go generated file convention.
+    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`
+    #    This line must appear before the first non-comment, non-blank text in the file.
+    #    https://go.dev/s/generatedcode
+    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.
+    # - `disable`: disable the generated files exclusion.
+    #
+    # Default: strict
+    generated: lax
+    # Log a warning if an exclusion rule is unused.
+    # Default: false
+    warn-unused: true
+    # Predefined exclusion rules.
+    # Default: []
+    presets:
+      - comments
+      - std-error-handling
+      - common-false-positives
+      - legacy
+    # Excluding configuration per-path, per-linter, per-text and per-source.
+    rules:
+      # Exclude some linters from running on tests files.
+      - path: _test\.go
+        linters:
+          - gocyclo
+          - errcheck
+          - dupl
+          - gosec
+      # Run some linter only for test files by excluding its issues for everything else.
+      - path-except: _test\.go
+        linters:
+          - forbidigo
+      # Exclude known linters from partially hard-vendored code,
+      # which is impossible to exclude via `nolint` comments.
+      # `/` will be replaced by the current OS file path separator to properly work on Windows.
+      - path: internal/hmac/
+        text: "weak cryptographic primitive"
+        linters:
+          - gosec
+      # Exclude some `staticcheck` messages.
+      - linters:
+          - staticcheck
+        text: "SA9003:"
+      # Exclude `lll` issues for long lines with `go:generate`.
+      - linters:
+          - lll
+        source: "^//go:generate "
+    # Which file paths to exclude: they will be analyzed, but issues from them won't be reported.
+    # "/" will be replaced by the current OS file path separator to properly work on Windows.
+    # Default: []
+    paths:
+      - ".*\\.my\\.go$"
+      - lib/bad.go
+    # Which file paths to not exclude.
+    # Default: []
+    paths-except:
+      - ".*\\.my\\.go$"
+      - lib/bad.go

formatters configuration +

formatters:
+  # Enable specific formatter.
+  # Default: [] (uses standard Go formatting)
+  enable:
+    - gci
+    - gofmt
+    - gofumpt
+    - goimports
+    - golines
+    - swaggo
+  # Formatters settings.
+  settings:
+    # See the dedicated "formatters.settings" documentation section.
+    option: value
+  exclusions:
+    # Log a warning if an exclusion path is unused.
+    # Default: false
+    warn-unused: true
+    # Mode of the generated files analysis.
+    #
+    # - `strict`: sources are excluded by strictly following the Go generated file convention.
+    #    Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`
+    #    This line must appear before the first non-comment, non-blank text in the file.
+    #    https://go.dev/s/generatedcode
+    # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.
+    # - `disable`: disable the generated files exclusion.
+    #
+    # Default: lax
+    generated: strict
+    # Which file paths to exclude.
+    # This option is ignored when using `--stdin` as the path is unknown.
+    # Default: []
+    paths:
+      - ".*\\.my\\.go$"
+      - lib/bad.go

issues configuration +

issues:
+  # Maximum issues count per one linter.
+  # Set to 0 to disable.
+  # Default: 50
+  max-issues-per-linter: 0
+  # Maximum count of issues with the same text.
+  # Set to 0 to disable.
+  # Default: 3
+  max-same-issues: 0
+  # Make issues output unique by line.
+  # Default: true
+  uniq-by-line: false
+  # Show only new issues: if there are unstaged changes or untracked files,
+  # only those changes are analyzed, else only changes in HEAD~ are analyzed.
+  # It's a super-useful option for integration of golangci-lint into existing large codebase.
+  # It's not practical to fix all existing issues at the moment of integration:
+  # much better don't allow issues in new code.
+  #
+  # Default: false
+  new: true
+  # Show only new issues created after the best common ancestor (merge-base against HEAD).
+  # Default: ""
+  new-from-merge-base: main
+  # Show only new issues created after git revision `REV`.
+  # Default: ""
+  new-from-rev: HEAD
+  # Show only new issues created in git patch with set file path.
+  # Default: ""
+  new-from-patch: path/to/patch/file
+  # Show issues in any part of update files (requires new-from-rev or new-from-patch).
+  # Default: false
+  whole-files: true
+  # Fix found issues (if it's supported by the linter).
+  # Default: false
+  fix: true

output configuration +

# Output configuration options.
+output:
+  # The formats used to render issues.
+  formats:
+    # Prints issues in a text format with colors, line number, and linter name.
+    # This format is the default format.
+    text:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.txt
+      # Print linter name in the end of issue text.
+      # Default: true
+      print-linter-name: false
+      # Print lines of code with issue.
+      # Default: true
+      print-issued-lines: false
+      # Use colors.
+      # Default: true
+      colors: false
+    # Prints issues in a JSON representation.
+    json:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.json
+    # Prints issues in columns representation separated by tabulations.
+    tab:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.txt
+      # Print linter name in the end of issue text.
+      # Default: true
+      print-linter-name: true
+      # Use colors.
+      # Default: true
+      colors: false
+    # Prints issues in an HTML page.
+    # It uses the Cloudflare CDN (cdnjs) and React.
+    html:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.html
+    # Prints issues in the Checkstyle format.
+    checkstyle:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.xml
+    # Prints issues in the Code Climate format.
+    code-climate:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.json
+    # Prints issues in the JUnit XML format.
+    junit-xml:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.xml
+      # Support extra JUnit XML fields.
+      # Default: false
+      extended: true
+    # Prints issues in the TeamCity format.
+    teamcity:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.txt
+    # Prints issues in the SARIF format.
+    sarif:
+      # Output path can be either `stdout`, `stderr` or path to the file to write to.
+      # Default: stdout
+      path: ./path/to/output.json
+  # Add a prefix to the output file references.
+  # This option is ignored when using `output.path-mode: abs` mode.
+  # Default: ""
+  path-prefix: ""
+  # By default, the report are related to the path obtained by `run.relative-path-mode`.
+  # The mode `abs` allows to show absolute file paths instead of relative file paths.
+  # The option `output.path-prefix` is ignored when using `abs` mode.
+  # Default: ""
+  path-mode: "abs"
+  # Order to use when sorting results.
+  # Possible values: `file`, `linter`, and `severity`.
+  #
+  # If the severity values are inside the following list, they are ordered in this order:
+  #   1. error
+  #   2. warning
+  #   3. high
+  #   4. medium
+  #   5. low
+  # Either they are sorted alphabetically.
+  #
+  # Default: ["linter", "file"]
+  sort-order:
+    - linter
+    - severity
+    - file # filepath, line, and column.
+  # Show statistics per linter.
+  # Default: true
+  show-stats: false

run configuration +

# Options for analysis running.
+run:
+  # Timeout for total work, e.g. 30s, 5m, 5m30s.
+  # If the value is lower or equal to 0, the timeout is disabled.
+  # Default: 0 (disabled)
+  timeout: 5m
+  # The mode used to evaluate relative paths.
+  # It's used by exclusions, Go plugins, and some linters.
+  # The value can be:
+  # - `gomod`: the paths will be relative to the directory of the `go.mod` file.
+  # - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).
+  # - `cfg`: the paths will be relative to the configuration file.
+  # - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.
+  # Default: cfg
+  relative-path-mode: gomod
+  # Exit code when at least one issue was found.
+  # Default: 1
+  issues-exit-code: 2
+  # Include test files or not.
+  # Default: true
+  tests: false
+  # List of build tags, all linters use it.
+  # Default: []
+  build-tags:
+    - mytag
+  # If set, we pass it to "go list -mod={option}". From "go help modules":
+  # If invoked with -mod=readonly, the go command is disallowed from the implicit
+  # automatic updating of go.mod described above. Instead, it fails when any changes
+  # to go.mod are needed. This setting is most useful to check that go.mod does
+  # not need updates, such as in a continuous integration and testing system.
+  # If invoked with -mod=vendor, the go command assumes that the vendor
+  # directory holds the correct copies of dependencies and ignores
+  # the dependency descriptions in go.mod.
+  #
+  # Allowed values: readonly|vendor|mod
+  # Default: ""
+  modules-download-mode: readonly
+  # Allow multiple parallel golangci-lint instances running.
+  # If false, golangci-lint acquires file lock on start.
+  # Default: false
+  allow-parallel-runners: true
+  # Allow multiple golangci-lint instances running, but serialize them around a lock.
+  # If false, golangci-lint exits with an error if it fails to acquire file lock on start.
+  # Default: false
+  allow-serial-runners: true
+  # Define the Go version limit.
+  # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.
+  go: '1.23'
+  # Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.
+  # Default: 0 (automatically set to match Linux container CPU quota and
+  # fall back to the number of logical CPUs in the machine)
+  concurrency: 4

severity configuration +

severity:
+  # Set the default severity for issues.
+  #
+  # If severity rules are defined and the issues do not match or no severity is provided to the rule
+  # this will be the default severity applied.
+  # Severities should match the supported severity names of the selected out format.
+  # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity
+  # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel
+  # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
+  # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance
+  #
+  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)
+  #
+  # Default: ""
+  default: error
+  # When a list of severity rules are provided, severity information will be added to lint issues.
+  # Severity rules have the same filtering capability as exclude rules
+  # except you are allowed to specify one matcher per severity rule.
+  #
+  # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)
+  #
+  # Only affects out formats that support setting severity information.
+  #
+  # Default: []
+  rules:
+    - linters:
+        - dupl
+      severity: info
Last updated on
\ No newline at end of file diff --git a/docs/configuration/index.html b/docs/configuration/index.html new file mode 100644 index 000000000000..8bc34094eb07 --- /dev/null +++ b/docs/configuration/index.html @@ -0,0 +1,109 @@ +Configuration – Golangci-lint
New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
\ No newline at end of file diff --git a/docs/configuration/index.xml b/docs/configuration/index.xml new file mode 100644 index 000000000000..9ebccf6175de --- /dev/null +++ b/docs/configuration/index.xml @@ -0,0 +1,1137 @@ +Golangci-lint – Configurationhttps://golangci-lint.run/docs/configuration/Recent content in Configuration on Golangci-lintHugo -- gohugo.ioen-usCommand-Linehttps://golangci-lint.run/docs/configuration/cli/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/configuration/cli/ +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint -h +</span></span><span class="line"><span class="cl"><span class="go">Smart, fast linters runner. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> cache Cache control and information. +</span></span></span><span class="line"><span class="cl"><span class="go"> completion Generate the autocompletion script for the specified shell +</span></span></span><span class="line"><span class="cl"><span class="go"> config Configuration file information and verification. +</span></span></span><span class="line"><span class="cl"><span class="go"> custom Build a version of golangci-lint with custom linters. +</span></span></span><span class="line"><span class="cl"><span class="go"> fmt Format Go source files. +</span></span></span><span class="line"><span class="cl"><span class="go"> formatters List current formatters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"> help Display extra help +</span></span></span><span class="line"><span class="cl"><span class="go"> linters List current linters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"> migrate Migrate configuration file from v1 to v2. +</span></span></span><span class="line"><span class="cl"><span class="go"> run Lint the code. +</span></span></span><span class="line"><span class="cl"><span class="go"> version Display the golangci-lint version. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"> --version Print version +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>run</code><span class="hx:absolute hx:-mt-20" id="run"></span> +<a href="#run" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 3;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Linters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/configuration/file/#linters-configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Global Configuration</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters/configuration/" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Linter Settings</span></a> +</div> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>Note</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>This command executes enabled linters, and the formatters defined in <a href="https://golangci-lint.run/docs/configuration/file/#formatters-configuration"><code>formatters</code></a>, +but it does not format the code.</p> +<p>To only format code, use <a href="https://golangci-lint.run/docs/configuration/cli/#fmt"><code>golangci-lint fmt</code></a>. +To apply both linter fixes and formatting, use <code>golangci-lint run --fix</code>.</p> +<p>The formatters cannot be enabled or disabled inside the <a href="https://golangci-lint.run/docs/configuration/file/#linters-configuration"><code>linters</code></a> section or the flags <code>-E/--enable</code>, <code>-D/--disable</code> of the command <a href="https://golangci-lint.run/docs/configuration/cli/#run"><code>golangci-lint run</code></a>.</p> +<p>The formatters can be enabled/disabled by defining them inside the <a href="https://golangci-lint.run/docs/configuration/file/#formatters-configuration"><code>formatters</code></a> section or by using the flags <code>-E/--enable</code>, <code>-D/--disable</code> of command <a href="https://golangci-lint.run/docs/configuration/cli/#fmt"><code>golangci-lint fmt</code></a>.</p></div> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint run -h +</span></span><span class="line"><span class="cl"><span class="go">Lint the code. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint run [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --default string Default set of linters to enable (default &#34;standard&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -D, --disable strings Disable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> --enable-only strings Override linters configuration section to only run the specific linter(s) +</span></span></span><span class="line"><span class="cl"><span class="go"> --fast-only Filter enabled linters to run only fast linters +</span></span></span><span class="line"><span class="cl"><span class="go"> -j, --concurrency int Number of CPUs to use (Default: Automatically set to match Linux container CPU quota and fall back to the number of logical CPUs in the machine) +</span></span></span><span class="line"><span class="cl"><span class="go"> --modules-download-mode string Modules download mode. If not empty, passed as -mod=&lt;mode&gt; to go tools +</span></span></span><span class="line"><span class="cl"><span class="go"> --issues-exit-code int Exit code when issues were found (default 1) +</span></span></span><span class="line"><span class="cl"><span class="go"> --build-tags strings Build tags +</span></span></span><span class="line"><span class="cl"><span class="go"> --timeout duration Timeout for total work. Disabled by default +</span></span></span><span class="line"><span class="cl"><span class="go"> --tests Analyze tests (*_test.go) (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --allow-parallel-runners Allow multiple parallel golangci-lint instances running. +</span></span></span><span class="line"><span class="cl"><span class="go"> If false (default) - golangci-lint acquires file lock on start. +</span></span></span><span class="line"><span class="cl"><span class="go"> --allow-serial-runners Allow multiple golangci-lint instances running, but serialize them around a lock. +</span></span></span><span class="line"><span class="cl"><span class="go"> If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start. +</span></span></span><span class="line"><span class="cl"><span class="go"> --path-prefix string Path prefix to add to output +</span></span></span><span class="line"><span class="cl"><span class="go"> --path-mode string Path mode to use (empty, or &#39;abs&#39;) +</span></span></span><span class="line"><span class="cl"><span class="go"> --show-stats Show statistics per linter (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.print-linter-name Print linter name in the end of issue text. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.print-issued-lines Print lines of code with issue. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.colors Use colors. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.json.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.tab.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.tab.print-linter-name Print linter name in the end of issue text. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.tab.colors Use colors. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.html.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.checkstyle.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.code-climate.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.junit-xml.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.junit-xml.extended Support extra JUnit XML fields. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.teamcity.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.sarif.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --max-issues-per-linter int Maximum issues count per one linter. Set to 0 to disable (default 50) +</span></span></span><span class="line"><span class="cl"><span class="go"> --max-same-issues int Maximum count of issues with the same text. Set to 0 to disable (default 3) +</span></span></span><span class="line"><span class="cl"><span class="go"> --uniq-by-line Make issues output unique by line (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> -n, --new Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed. +</span></span></span><span class="line"><span class="cl"><span class="go"> It&#39;s a super-useful option for integration of golangci-lint into existing large codebase. +</span></span></span><span class="line"><span class="cl"><span class="go"> It&#39;s not practical to fix all existing issues at the moment of integration: much better to not allow issues in new code. +</span></span></span><span class="line"><span class="cl"><span class="go"> For CI setups, prefer --new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate unstaged files before golangci-lint runs. +</span></span></span><span class="line"><span class="cl"><span class="go"> --new-from-rev REV Show only new issues created after git revision REV +</span></span></span><span class="line"><span class="cl"><span class="go"> --new-from-patch PATH Show only new issues created in git patch with file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --new-from-merge-base string Show only new issues created after the best common ancestor (merge-base against HEAD) +</span></span></span><span class="line"><span class="cl"><span class="go"> --whole-files Show issues in any part of update files (requires new-from-rev or new-from-patch) +</span></span></span><span class="line"><span class="cl"><span class="go"> --fix Fix found issues (if it&#39;s supported by the linter) +</span></span></span><span class="line"><span class="cl"><span class="go"> --cpu-profile-path string Path to CPU profile output file +</span></span></span><span class="line"><span class="cl"><span class="go"> --mem-profile-path string Path to memory profile output file +</span></span></span><span class="line"><span class="cl"><span class="go"> --trace-path string Path to trace output file +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>When the <code>--cpu-profile-path</code> or <code>--mem-profile-path</code> arguments are specified, +golangci-lint writes runtime profiling data in the format expected by the <a href="https://github.com/google/pprof"target="_blank" rel="noopener">pprof</a> visualization tool.</p> +<p>When the <code>--trace-path</code> argument is specified, <code>golangci-lint</code> writes runtime tracing data in the format expected by +the <code>go tool trace</code> command and visualization tool.</p> +<h2>fmt<span class="hx:absolute hx:-mt-20" id="fmt"></span> +<a href="#fmt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 3;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Formatters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/configuration/file/#formatters-configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Global Configuration</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters/configuration/" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Formatter Settings</span></a> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint fmt -h +</span></span><span class="line"><span class="cl"><span class="go">Format Go source files. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint fmt [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific formatter +</span></span></span><span class="line"><span class="cl"><span class="go"> -d, --diff Display diffs instead of rewriting files +</span></span></span><span class="line"><span class="cl"><span class="go"> --diff-colored Display diffs instead of rewriting files (with colors) +</span></span></span><span class="line"><span class="cl"><span class="go"> --stdin Use standard input for piping source files +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>migrate</code><span class="hx:absolute hx:-mt-20" id="migrate"></span> +<a href="#migrate" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint migrate -h +</span></span><span class="line"><span class="cl"><span class="go">Migrate configuration file from v1 to v2. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint migrate [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --format string Output file format. +</span></span></span><span class="line"><span class="cl"><span class="go"> By default, the format of the input configuration file is used. +</span></span></span><span class="line"><span class="cl"><span class="go"> It can be &#39;yml&#39;, &#39;yaml&#39;, &#39;toml&#39;, or &#39;json&#39;. +</span></span></span><span class="line"><span class="cl"><span class="go"> --skip-validation Skip validation of the configuration file against the JSON Schema for v1. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>formatters</code><span class="hx:absolute hx:-mt-20" id="formatters"></span> +<a href="#formatters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint formatters -h +</span></span><span class="line"><span class="cl"><span class="go">List current formatters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint formatters [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific formatter +</span></span></span><span class="line"><span class="cl"><span class="go"> --json Display as JSON +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>help</code><span class="hx:absolute hx:-mt-20" id="help"></span> +<a href="#help" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint <span class="nb">help</span> -h +</span></span><span class="line"><span class="cl"><span class="go">Display extra help +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint help [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint help [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> formatters Display help for formatters. +</span></span></span><span class="line"><span class="cl"><span class="go"> linters Display help for linters. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint help [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>linters</code><span class="hx:absolute hx:-mt-20" id="linters"></span> +<a href="#linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint linters -h +</span></span><span class="line"><span class="cl"><span class="go">List current linters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint linters [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --default string Default set of linters to enable (default &#34;standard&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -D, --disable strings Disable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> --enable-only strings Override linters configuration section to only run the specific linter(s) +</span></span></span><span class="line"><span class="cl"><span class="go"> --fast-only Filter enabled linters to run only fast linters +</span></span></span><span class="line"><span class="cl"><span class="go"> --json Display as JSON +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>cache</code><span class="hx:absolute hx:-mt-20" id="cache"></span> +<a href="#cache" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Golangci-lint stores its cache in the subdirectory <code>golangci-lint</code> inside the <a href="https://pkg.go.dev/os#UserCacheDir"target="_blank" rel="noopener">default user cache directory</a>.</p> +<p>You can override the default cache directory with the environment variable <code>GOLANGCI_LINT_CACHE</code>; the path must be absolute.</p> +<p>The cache is only used by <code>golangci-lint run</code> (linters).</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint cache -h +</span></span><span class="line"><span class="cl"><span class="go">Cache control and information. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint cache [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint cache [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> clean Clean cache +</span></span></span><span class="line"><span class="cl"><span class="go"> status Show cache status +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint cache [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>config</code><span class="hx:absolute hx:-mt-20" id="config"></span> +<a href="#config" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint config -h +</span></span><span class="line"><span class="cl"><span class="go">Configuration file information and verification. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint config [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint config [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> path Print used configuration path. +</span></span></span><span class="line"><span class="cl"><span class="go"> verify Verify configuration against JSON schema. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint config [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>custom</code><span class="hx:absolute hx:-mt-20" id="custom"></span> +<a href="#custom" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint custom -h +</span></span><span class="line"><span class="cl"><span class="go">Build a version of golangci-lint with custom linters. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint custom [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>version</code><span class="hx:absolute hx:-mt-20" id="version"></span> +<a href="#version" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint version -h +</span></span><span class="line"><span class="cl"><span class="go">Display the golangci-lint version. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint version [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --debug Add build information +</span></span></span><span class="line"><span class="cl"><span class="go"> --json Display as JSON +</span></span></span><span class="line"><span class="cl"><span class="go"> --short Display only the version number +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>completion</code><span class="hx:absolute hx:-mt-20" id="completion"></span> +<a href="#completion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint completion -h +</span></span><span class="line"><span class="cl"><span class="go">Generate the autocompletion script for golangci-lint for the specified shell. +</span></span></span><span class="line"><span class="cl"><span class="go">See each sub-command&#39;s help for details on how to use the generated script. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint completion [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> bash Generate the autocompletion script for bash +</span></span></span><span class="line"><span class="cl"><span class="go"> fish Generate the autocompletion script for fish +</span></span></span><span class="line"><span class="cl"><span class="go"> powershell Generate the autocompletion script for powershell +</span></span></span><span class="line"><span class="cl"><span class="go"> zsh Generate the autocompletion script for zsh +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint completion [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Configuration Filehttps://golangci-lint.run/docs/configuration/file/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/configuration/file/ +<p>Golangci-lint looks for config files in the following paths from the current working directory:</p> +<ul> +<li><code>.golangci.yml</code></li> +<li><code>.golangci.yaml</code></li> +<li><code>.golangci.toml</code></li> +<li><code>.golangci.json</code></li> +</ul> +<p>Golangci-lint also searches for config files in all directories from the directory of the first analyzed path up to the root. +If no configuration file has been found, golangci-lint will try to find one in your home directory. +To see which config file is being used and where it was sourced from run golangci-lint with <code>-v</code> option.</p> +<p>Config options inside the file are identical to command-line options. +You can configure specific linters&rsquo; options only within the config file (not the command-line).</p> +<p>There is a <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.reference.yml"target="_blank" rel="noopener"><code>.golangci.reference.yml</code></a> file with all supported options, their descriptions, and default values. +This file is neither a working example nor a recommended configuration, +it&rsquo;s just a reference to display all the configuration options used to generate the documentation.</p> +<p>The configuration file can be validated with the JSON Schema: <a href="https://golangci-lint.run/jsonschema/golangci.jsonschema.json"target="_blank" rel="noopener">golangci.jsonschema.json</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># See the dedicated &#34;version&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;linters&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;formatters&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;issues&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Output configuration options.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;output&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Options for analysis running.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;run&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;severity&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>version</code> configuration<span class="hx:absolute hx:-mt-20" id="version-configuration"></span> +<a href="#version-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Defines the configuration version.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The only possible value is &#34;2&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>linters</code> configuration<span class="hx:absolute hx:-mt-20" id="linters-configuration"></span> +<a href="#linters-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Linters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters/configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Linters Settings</span></a> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default set of linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The value can be:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `all`: enables all linters by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `none`: disables all linters by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `fast`: enables only linters considered as &#34;fast&#34; (`golangci-lint help linters --json | jq &#39;[ .[] | select(.fast==true) ] | map(.name)&#39;`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: standard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable specific linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">arangolint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asasalint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asciicheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bidichk</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bodyclose</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">canonicalheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">containedctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contextcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copyloopvar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cyclop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">depguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dogsled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupword</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">durationcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">embeddedstructfieldcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errchkjson</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustruct</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exptostd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fatcontext</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forbidigo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forcetypeassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funcorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ginkgolinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocheckcompilerdirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoglobals</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoinits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecksumtype</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocognit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocritic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godoclint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godot</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godox</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomoddirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomodguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goprintffuncname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosmopolitan</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">govet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">grouper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inamedparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ineffassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">interfacebloat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">intrange</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iotamixing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ireturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loggercheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">maintidx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">makezero</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mirror</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">misspell</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">musttag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nakedret</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnesserr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nlreturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noinlineerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nolintlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nonamedreturns</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nosprintfhostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paralleltest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">perfsprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">prealloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">predeclared</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">promlinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">protogetter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">recvcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">revive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rowserrcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloglint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">spancheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlclosecheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagliatelle</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testableexamples</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testifylint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testpackage</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tparallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unconvert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unqueryvet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unused</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usestdlibvars</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usetesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">varnamelen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wastedassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl_v5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">zerologlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable specific linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">arangolint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asasalint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asciicheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bidichk</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bodyclose</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">canonicalheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">containedctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contextcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copyloopvar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cyclop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">depguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dogsled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupword</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">durationcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">embeddedstructfieldcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errchkjson</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustruct</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exptostd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fatcontext</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forbidigo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forcetypeassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funcorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ginkgolinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocheckcompilerdirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoglobals</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoinits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecksumtype</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocognit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocritic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godoclint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godot</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godox</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomoddirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomodguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goprintffuncname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosmopolitan</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">govet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">grouper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inamedparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ineffassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">interfacebloat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">intrange</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iotamixing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ireturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loggercheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">maintidx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">makezero</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mirror</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">misspell</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">musttag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nakedret</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnesserr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nlreturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noinlineerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nolintlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nonamedreturns</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nosprintfhostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paralleltest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">perfsprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">prealloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">predeclared</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">promlinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">protogetter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">recvcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">revive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rowserrcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloglint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">spancheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlclosecheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagliatelle</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testableexamples</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testifylint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testpackage</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tparallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unconvert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unqueryvet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unused</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usestdlibvars</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usetesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">varnamelen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wastedassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl_v5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">zerologlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># All available settings of specific linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;linters.settings&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines a set of rules to ignore issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It does not skip the analysis, and so does not ignore &#34;typecheck&#34; errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mode of the generated files analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `strict`: sources are excluded by strictly following the Go generated file convention.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This line must appear before the first non-comment, non-blank text in the file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go.dev/s/generatedcode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `disable`: disable the generated files exclusion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: strict</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Log a warning if an exclusion rule is unused.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">warn-unused</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Predefined exclusion rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Excluding configuration per-path, per-linter, per-text and per-source.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude some linters from running on tests files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">_test\.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run some linter only for test files by excluding its issues for everything else.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="l">_test\.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forbidigo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude known linters from partially hard-vendored code,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># which is impossible to exclude via `nolint` comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `/` will be replaced by the current OS file path separator to properly work on Windows.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">internal/hmac/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;weak cryptographic primitive&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude some `staticcheck` messages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;SA9003:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude `lll` issues for long lines with `go:generate`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^//go:generate &#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which file paths to exclude: they will be analyzed, but issues from them won&#39;t be reported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#34;/&#34; will be replaced by the current OS file path separator to properly work on Windows.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*\\.my\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which file paths to not exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths-except</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*\\.my\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>formatters</code> configuration<span class="hx:absolute hx:-mt-20" id="formatters-configuration"></span> +<a href="#formatters-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Formatters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters/configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Formatters Settings</span></a> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable specific formatter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [] (uses standard Go formatting)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gci</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofumpt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goimports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">golines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">swaggo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Formatters settings.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;formatters.settings&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Log a warning if an exclusion path is unused.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">warn-unused</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mode of the generated files analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `strict`: sources are excluded by strictly following the Go generated file convention.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This line must appear before the first non-comment, non-blank text in the file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go.dev/s/generatedcode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `disable`: disable the generated files exclusion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: lax</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">strict</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which file paths to exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This option is ignored when using `--stdin` as the path is unknown.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*\\.my\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>issues</code> configuration<span class="hx:absolute hx:-mt-20" id="issues-configuration"></span> +<a href="#issues-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum issues count per one linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to 0 to disable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 50</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-issues-per-linter</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum count of issues with the same text.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to 0 to disable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-same-issues</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Make issues output unique by line.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uniq-by-line</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues: if there are unstaged changes or untracked files,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># only those changes are analyzed, else only changes in HEAD~ are analyzed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It&#39;s a super-useful option for integration of golangci-lint into existing large codebase.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It&#39;s not practical to fix all existing issues at the moment of integration:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># much better don&#39;t allow issues in new code.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues created after the best common ancestor (merge-base against HEAD).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new-from-merge-base</span><span class="p">:</span><span class="w"> </span><span class="l">main</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues created after git revision `REV`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new-from-rev</span><span class="p">:</span><span class="w"> </span><span class="l">HEAD</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues created in git patch with set file path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new-from-patch</span><span class="p">:</span><span class="w"> </span><span class="l">path/to/patch/file</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show issues in any part of update files (requires new-from-rev or new-from-patch).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">whole-files</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Fix found issues (if it&#39;s supported by the linter).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fix</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>output</code> configuration<span class="hx:absolute hx:-mt-20" id="output-configuration"></span> +<a href="#output-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Output configuration options.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The formats used to render issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in a text format with colors, line number, and linter name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This format is the default format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Print linter name in the end of issue text.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Print lines of code with issue.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-issued-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use colors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in a JSON representation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in columns representation separated by tabulations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Print linter name in the end of issue text.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use colors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in an HTML page.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It uses the Cloudflare CDN (cdnjs) and React.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">html</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.html</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the Checkstyle format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkstyle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.xml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the Code Climate format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">code-climate</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the JUnit XML format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">junit-xml</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.xml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Support extra JUnit XML fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extended</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the TeamCity format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">teamcity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the SARIF format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sarif</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Add a prefix to the output file references.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This option is ignored when using `output.path-mode: abs` mode.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path-prefix</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, the report are related to the path obtained by `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The mode `abs` allows to show absolute file paths instead of relative file paths.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The option `output.path-prefix` is ignored when using `abs` mode.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path-mode</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;abs&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Order to use when sorting results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Possible values: `file`, `linter`, and `severity`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If the severity values are inside the following list, they are ordered in this order:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 1. error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 2. warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 3. high</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 4. medium</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 5. low</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Either they are sorted alphabetically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;linter&#34;, &#34;file&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sort-order</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">linter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">severity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">file</span><span class="w"> </span><span class="c"># filepath, line, and column.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show statistics per linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-stats</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>run</code> configuration<span class="hx:absolute hx:-mt-20" id="run-configuration"></span> +<a href="#run-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Options for analysis running.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Timeout for total work, e.g. 30s, 5m, 5m30s.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If the value is lower or equal to 0, the timeout is disabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0 (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The mode used to evaluate relative paths.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It&#39;s used by exclusions, Go plugins, and some linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The value can be:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `gomod`: the paths will be relative to the directory of the `go.mod` file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `cfg`: the paths will be relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: cfg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">relative-path-mode</span><span class="p">:</span><span class="w"> </span><span class="l">gomod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exit code when at least one issue was found.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">issues-exit-code</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include test files or not.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tests</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of build tags, all linters use it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">build-tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mytag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If set, we pass it to &#34;go list -mod={option}&#34;. From &#34;go help modules&#34;:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If invoked with -mod=readonly, the go command is disallowed from the implicit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># automatic updating of go.mod described above. Instead, it fails when any changes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># to go.mod are needed. This setting is most useful to check that go.mod does</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># not need updates, such as in a continuous integration and testing system.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If invoked with -mod=vendor, the go command assumes that the vendor</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># directory holds the correct copies of dependencies and ignores</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># the dependency descriptions in go.mod.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allowed values: readonly|vendor|mod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules-download-mode</span><span class="p">:</span><span class="w"> </span><span class="l">readonly</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow multiple parallel golangci-lint instances running.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If false, golangci-lint acquires file lock on start.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-parallel-runners</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow multiple golangci-lint instances running, but serialize them around a lock.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If false, golangci-lint exits with an error if it fails to acquire file lock on start.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-serial-runners</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define the Go version limit.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1.23&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0 (automatically set to match Linux container CPU quota and</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># fall back to the number of logical CPUs in the machine)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">concurrency</span><span class="p">:</span><span class="w"> </span><span class="m">4</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>severity</code> configuration<span class="hx:absolute hx:-mt-20" id="severity-configuration"></span> +<a href="#severity-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set the default severity for issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If severity rules are defined and the issues do not match or no severity is provided to the rule</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># this will be the default severity applied.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Severities should match the supported severity names of the selected out format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># When a list of severity rules are provided, severity information will be added to lint issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Severity rules have the same filtering capability as exclude rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># except you are allowed to specify one matcher per severity rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only affects out formats that support setting severity information.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> \ No newline at end of file diff --git a/docs/contributing/architecture/index.html b/docs/contributing/architecture/index.html new file mode 100644 index 000000000000..fd8a0a45d256 --- /dev/null +++ b/docs/contributing/architecture/index.html @@ -0,0 +1,234 @@ +Architecture – Golangci-lint
New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

Architecture

There are the following golangci-lint execution steps:

+  graph LR
+    init[Init]
+    loadPackages[Load packages]
+    runLinters[Run linters]
+    postprocess[Postprocess issues]
+    print[Print issues]
+
+    init --> loadPackages --> runLinters --> postprocess --> print
+

Init +

The configuration is loaded from file and flags by config.Loader inside PersistentPreRun (or PreRun) of the commands that require configuration.

The linter database (linterdb.Manager) is fill based on the configuration:

  • The linters (“internals” and plugins) are built by linterdb.LinterBuilder and linterdb.PluginBuilder builders.
  • The configuration is validated by linterdb.Validator.

Load Packages +

Loading packages is listing all packages and their recursive dependencies for analysis.
Also, depending on the enabled linters set some parsing of the source code can be performed at this step.

Packages loading starts here:

func (l *PackageLoader) Load(ctx context.Context, linters []*linter.Config) (pkgs, deduplicatedPkgs []*packages.Package, err error) {
+	loadMode := findLoadMode(linters)
+
+	pkgs, err = l.loadPackages(ctx, loadMode)
+	if err != nil {
+		return nil, nil, fmt.Errorf("failed to load packages: %w", err)
+	}
+// ...

First, we find a load mode as union of load modes for all enabled linters. +We use go/packages for packages loading and use it’s enum packages.Need* for load modes. +Load mode sets which data does a linter needs for execution.

A linter that works only with AST need minimum of information: only filenames and AST.

There is no need for packages dependencies or type information. +AST is built during go/analysis execution to reduce memory usage. +Such AST-based linters are configured with the following code:

func (lc *Config) WithLoadFiles() *Config {
+	lc.LoadMode |= packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles
+	return lc
+}

If a linter uses go/analysis and needs type information, we need to extract more data by go/packages:

func (lc *Config) WithLoadForGoAnalysis() *Config {
+	lc = lc.WithLoadFiles()
+	lc.LoadMode |= packages.NeedImports | packages.NeedDeps | packages.NeedExportFile | packages.NeedTypesSizes
+	lc.IsSlow = true
+	return lc
+}

After finding a load mode, we run go/packages: +the library get list of dirs (or ./... as the default value) as input and outputs list of packages and requested information about them: +filenames, type information, AST, etc.

Run Linters +

First, we need to find all enabled linters. All linters are registered here:

func (b LinterBuilder) Build(cfg *config.Config) []*linter.Config {
+	// ...
+	return []*linter.Config{
+		// ...
+		linter.NewConfig(golinters.NewBodyclose()).
+			WithSince("v1.18.0").
+			WithLoadForGoAnalysis().
+			WithURL("https://github.com/timakin/bodyclose"),
+		// ...
+		linter.NewConfig(golinters.NewGovet(govetCfg)).
+			WithGroups(config.GroupStandard).
+			WithSince("v1.0.0").
+			WithLoadForGoAnalysis().
+			WithURL("https://pkg.go.dev/cmd/vet"),
+		// ...
+	}
+}

We filter requested in config and command-line linters in EnabledSet:

func (m *Manager) GetEnabledLintersMap() (map[string]*linter.Config, error)

We merge enabled linters into one MetaLinter to improve execution time if we can:

// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters into a fewer number of linters.
+// E.g. some go/analysis linters can be optimized into one metalinter for data reuse and speed up.
+func (m *Manager) GetOptimizedLinters() ([]*linter.Config, error) {
+	// ...
+	m.combineGoAnalysisLinters(resultLintersSet)
+	// ...
+}

The MetaLinter just stores all merged linters inside to run them at once:

type MetaLinter struct {
+	linters              []*Linter
+	analyzerToLinterName map[*analysis.Analyzer]string
+}

Currently, all linters except unused can be merged into this meta linter.
The unused isn’t merged because it has high memory usage.

Linters execution starts in runAnalyzers. +It’s the most complex part of the golangci-lint. +We use custom go/analysis runner there.
It runs as much as it can in parallel. +It lazy-loads as much as it can to reduce memory usage. +Also, it sets all heavyweight data to nil as becomes unneeded to save memory.

We don’t use existing multichecker because +it doesn’t use caching and doesn’t have some important performance optimizations.

All found by linters issues are represented with result.Issue struct:

type Issue struct {
+	FromLinter string
+	Text       string
+
+	Severity string
+
+	// Source lines of a code with the issue to show
+	SourceLines []string
+
+	// Pkg is needed for proper caching of linting results
+	Pkg *packages.Package `json:"-"`
+
+	Pos token.Position
+
+	LineRange *Range `json:",omitempty"`
+
+	// HunkPos is used only when golangci-lint is run over a diff
+	HunkPos int `json:",omitempty"`
+
+	// If we know how to fix the issue we can provide replacement lines
+	SuggestedFixes []analysis.SuggestedFix `json:",omitempty"`
+
+	// If we are expecting a nolint (because this is from nolintlint), record the expected linter
+	ExpectNoLint         bool
+	ExpectedNoLintLinter string
+
+	// ...
+}

Postprocess Issues +

We have an abstraction of result.Processor to postprocess found issues:

    • cgo.go
    • diff.go
    • exclusion_generated_file_filter.go
    • exclusion_generated_file_matcher.go
    • exclusion_paths.go
    • exclusion_presets.go
    • exclusion_rules.go
    • filename_unadjuster.go
    • fixer.go
    • identifier_marker.go
    • invalid_issue.go
    • issues.go
    • max_from_linter.go
    • max_per_file_from_linter.go
    • max_same_issues.go
    • nolint_filter.go
    • path_absoluter.go
    • path_prettifier.go
    • path_relativity.go
    • path_shortener.go
    • processor.go
    • severity.go
    • sort_results.go
    • source_code.go
    • uniq_by_line.go
  • The abstraction is simple:

    type Processor interface {
    +	Process(issues []*result.Issue) ([]*result.Issue, error)
    +	Name() string
    +	Finish()
    +}

    A processor can hide issues (nolint, exclude) or change issues (path_prettifier).

    Print Issues +

    We have an abstraction for printing found issues.

    • checkstyle.go
    • codeclimate.go
    • html.go
    • json.go
    • junitxml.go
    • printer.go
    • sarif.go
    • tab.go
    • teamcity.go
    • text.go
  • Last updated on
    \ No newline at end of file diff --git a/docs/contributing/debug/index.html b/docs/contributing/debug/index.html new file mode 100644 index 000000000000..20b3de213715 --- /dev/null +++ b/docs/contributing/debug/index.html @@ -0,0 +1,118 @@ +Debugging – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/contributing/faq/index.html b/docs/contributing/faq/index.html new file mode 100644 index 000000000000..e653ef3c772c --- /dev/null +++ b/docs/contributing/faq/index.html @@ -0,0 +1,125 @@ +FAQ – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    FAQ

    How to add a new open-source linter to golangci-lint +

    See there.

    How to add a new private linter to golangci-lint +

    See there.

    How to update an existing linter +

    We use Dependabot to update dependencies, including linters.
    The updates happen at least automatically once a week (Sunday 11am UTC).

    No pull requests to update a linter will be accepted unless you are the author of the linter and specific changes are required.

    How to add a configuration option to an existing linter +

    Add a new field to the linter settings struct.
    Document it in .golangci.next.reference.yml.
    Pass it to the linter.

    How to see INFO or DEBUG logs +

    See tutorial about debugging.

    Last updated on
    \ No newline at end of file diff --git a/docs/contributing/index.html b/docs/contributing/index.html new file mode 100644 index 000000000000..7d31ea5e8dd9 --- /dev/null +++ b/docs/contributing/index.html @@ -0,0 +1,106 @@ +Contributing – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/contributing/index.xml b/docs/contributing/index.xml new file mode 100644 index 000000000000..4eefcf4d9903 --- /dev/null +++ b/docs/contributing/index.xml @@ -0,0 +1,683 @@ +Golangci-lint – Contributinghttps://golangci-lint.run/docs/contributing/Recent content in Contributing on Golangci-lintHugo -- gohugo.ioen-usWorkflowhttps://golangci-lint.run/docs/contributing/workflow/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/workflow/ +<p>By participating in this project, you agree to abide our <a href="https://github.com/golangci/golangci-lint?tab=coc-ov-file"target="_blank" rel="noopener">code of conduct</a>.</p> +<h2>Set up your machine<span class="hx:absolute hx:-mt-20" id="set-up-your-machine"></span> +<a href="#set-up-your-machine" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Golangci-lint is written in <a href="https://go.dev/"target="_blank" rel="noopener">Go</a>.</p> +<p>Prerequisites:</p> +<ul> +<li><code>make</code></li> +<li><a href="https://go.dev/doc/install"target="_blank" rel="noopener">Go</a></li> +</ul> +<p>Fork and clone <a href="https://github.com/golangci/golangci-lint"target="_blank" rel="noopener">golangci-lint</a> repository.</p> +<p>A good way of making sure everything is all right is running the following:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make build +</span></span><span class="line"><span class="cl">./golangci-lint run -v</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Test your change<span class="hx:absolute hx:-mt-20" id="test-your-change"></span> +<a href="#test-your-change" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When you are satisfied with the changes, we suggest you run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make test</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Which runs all the linters and tests.</p> +<h2>Create or update parameters for docs<span class="hx:absolute hx:-mt-20" id="create-or-update-parameters-for-docs"></span> +<a href="#create-or-update-parameters-for-docs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add your new or updated parameters to <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml"target="_blank" rel="noopener">.golangci.next.reference.yml</a> so they will be shown in the docs</p> +<h2>Submit a pull request<span class="hx:absolute hx:-mt-20" id="submit-a-pull-request"></span> +<a href="#submit-a-pull-request" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Push your branch to your golangci-lint fork and open a pull request against the +<code>main</code> branch.</p> +<h2>Pull request checks<span class="hx:absolute hx:-mt-20" id="pull-request-checks"></span> +<a href="#pull-request-checks" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>First, please, accept CLA - <a href="https://cla-assistant.io/"target="_blank" rel="noopener">CLA assistant</a> will make a comment on the pull request about it.</p> +<p>Also, we run a few checks in CI by using GitHub Actions, you can see them <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.github/workflows"target="_blank" rel="noopener">here</a>.</p> +<h2>New releases<span class="hx:absolute hx:-mt-20" id="new-releases"></span> +<a href="#new-releases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>First, see <a href="https://golangci-lint.run/docs/product/roadmap/#versioning-policy">our versioning policy</a>.</p> +<p>To make a new release create a tag <code>vX.Y.Z</code>.<br> +Don&rsquo;t forget to add zero patch version for a new minor release, e.g. <code>v1.99.0</code>.</p> +<p>A GitHub Action <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.github/workflows/release.yml"target="_blank" rel="noopener">workflow</a> will start building and publishing release after that.</p> +<p>After making a release, you need to update GitHub <a href="https://github.com/golangci/golangci-lint/blob/HEAD/assets/github-action-config.json"target="_blank" rel="noopener">Action config</a> by running:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make assets/github-action-config.json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Architecturehttps://golangci-lint.run/docs/contributing/architecture/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/architecture/ +<p>There are the following golangci-lint execution steps:</p> +<pre class="mermaid hx:mt-6"> +graph LR +init[Init] +loadPackages[Load packages] +runLinters[Run linters] +postprocess[Postprocess issues] +print[Print issues] +init --&gt; loadPackages --&gt; runLinters --&gt; postprocess --&gt; print +</pre><h2>Init<span class="hx:absolute hx:-mt-20" id="init"></span> +<a href="#init" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The configuration is loaded from file and flags by <code>config.Loader</code> inside <code>PersistentPreRun</code> (or <code>PreRun</code>) of the commands that require configuration.</p> +<p>The linter database (<code>linterdb.Manager</code>) is fill based on the configuration:</p> +<ul> +<li>The linters (&ldquo;internals&rdquo; and plugins) are built by <code>linterdb.LinterBuilder</code> and <code>linterdb.PluginBuilder</code> builders.</li> +<li>The configuration is validated by <code>linterdb.Validator</code>.</li> +</ul> +<h2>Load Packages<span class="hx:absolute hx:-mt-20" id="load-packages"></span> +<a href="#load-packages" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Loading packages is listing all packages and their recursive dependencies for analysis.<br> +Also, depending on the enabled linters set some parsing of the source code can be performed at this step.</p> +<p>Packages loading starts here:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/lint/package.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/package.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">l</span> <span class="o">*</span><span class="nx">PackageLoader</span><span class="p">)</span> <span class="nf">Load</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">linters</span> <span class="p">[]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">)</span> <span class="p">(</span><span class="nx">pkgs</span><span class="p">,</span> <span class="nx">deduplicatedPkgs</span> <span class="p">[]</span><span class="o">*</span><span class="nx">packages</span><span class="p">.</span><span class="nx">Package</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">loadMode</span> <span class="o">:=</span> <span class="nf">findLoadMode</span><span class="p">(</span><span class="nx">linters</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">pkgs</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">l</span><span class="p">.</span><span class="nf">loadPackages</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">loadMode</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">&#34;failed to load packages: %w&#34;</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="c1">// ...</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>First, we find a load mode as union of load modes for all enabled linters. +We use <a href="https://pkg.go.dev/golang.org/x/tools/go/packages"target="_blank" rel="noopener">go/packages</a> for packages loading and use it&rsquo;s enum <code>packages.Need*</code> for load modes. +Load mode sets which data does a linter needs for execution.</p> +<p>A linter that works only with AST need minimum of information: only filenames and AST.</p> +<p>There is no need for packages dependencies or type information. +AST is built during <code>go/analysis</code> execution to reduce memory usage. +Such AST-based linters are configured with the following code:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/linter/config.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/linter/config.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">lc</span> <span class="o">*</span><span class="nx">Config</span><span class="p">)</span> <span class="nf">WithLoadFiles</span><span class="p">()</span> <span class="o">*</span><span class="nx">Config</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span><span class="p">.</span><span class="nx">LoadMode</span> <span class="o">|=</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedName</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedFiles</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedCompiledGoFiles</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">lc</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>If a linter uses <code>go/analysis</code> and needs type information, we need to extract more data by <code>go/packages</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/linter/config.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/linter/config.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">lc</span> <span class="o">*</span><span class="nx">Config</span><span class="p">)</span> <span class="nf">WithLoadForGoAnalysis</span><span class="p">()</span> <span class="o">*</span><span class="nx">Config</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span> <span class="p">=</span> <span class="nx">lc</span><span class="p">.</span><span class="nf">WithLoadFiles</span><span class="p">()</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span><span class="p">.</span><span class="nx">LoadMode</span> <span class="o">|=</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedImports</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedDeps</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedExportFile</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedTypesSizes</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span><span class="p">.</span><span class="nx">IsSlow</span> <span class="p">=</span> <span class="kc">true</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">lc</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>After finding a load mode, we run <code>go/packages</code>: +the library get list of dirs (or <code>./...</code> as the default value) as input and outputs list of packages and requested information about them: +filenames, type information, AST, etc.</p> +<h2>Run Linters<span class="hx:absolute hx:-mt-20" id="run-linters"></span> +<a href="#run-linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>First, we need to find all enabled linters. All linters are registered here:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/lintersdb/builder_linter.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/lintersdb/builder_linter.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="nx">LinterBuilder</span><span class="p">)</span> <span class="nf">Build</span><span class="p">(</span><span class="nx">cfg</span> <span class="o">*</span><span class="nx">config</span><span class="p">.</span><span class="nx">Config</span><span class="p">)</span> <span class="p">[]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="nx">linter</span><span class="p">.</span><span class="nf">NewConfig</span><span class="p">(</span><span class="nx">golinters</span><span class="p">.</span><span class="nf">NewBodyclose</span><span class="p">()).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithSince</span><span class="p">(</span><span class="s">&#34;v1.18.0&#34;</span><span class="p">).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithLoadForGoAnalysis</span><span class="p">().</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithURL</span><span class="p">(</span><span class="s">&#34;https://github.com/timakin/bodyclose&#34;</span><span class="p">),</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="nx">linter</span><span class="p">.</span><span class="nf">NewConfig</span><span class="p">(</span><span class="nx">golinters</span><span class="p">.</span><span class="nf">NewGovet</span><span class="p">(</span><span class="nx">govetCfg</span><span class="p">)).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithGroups</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">GroupStandard</span><span class="p">).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithSince</span><span class="p">(</span><span class="s">&#34;v1.0.0&#34;</span><span class="p">).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithLoadForGoAnalysis</span><span class="p">().</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithURL</span><span class="p">(</span><span class="s">&#34;https://pkg.go.dev/cmd/vet&#34;</span><span class="p">),</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>We filter requested in config and command-line linters in <code>EnabledSet</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/lintersdb/manager.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/lintersdb/manager.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">m</span> <span class="o">*</span><span class="nx">Manager</span><span class="p">)</span> <span class="nf">GetEnabledLintersMap</span><span class="p">()</span> <span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>We merge enabled linters into one <code>MetaLinter</code> to improve execution time if we can:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/lintersdb/manager.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/lintersdb/manager.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters into a fewer number of linters.</span> +</span></span><span class="line"><span class="cl"><span class="c1">// E.g. some go/analysis linters can be optimized into one metalinter for data reuse and speed up.</span> +</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">m</span> <span class="o">*</span><span class="nx">Manager</span><span class="p">)</span> <span class="nf">GetOptimizedLinters</span><span class="p">()</span> <span class="p">([]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="nx">m</span><span class="p">.</span><span class="nf">combineGoAnalysisLinters</span><span class="p">(</span><span class="nx">resultLintersSet</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The <code>MetaLinter</code> just stores all merged linters inside to run them at once:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/goanalysis/metalinter.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/goanalysis/metalinter.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">MetaLinter</span> <span class="kd">struct</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">linters</span> <span class="p">[]</span><span class="o">*</span><span class="nx">Linter</span> +</span></span><span class="line"><span class="cl"> <span class="nx">analyzerToLinterName</span> <span class="kd">map</span><span class="p">[</span><span class="o">*</span><span class="nx">analysis</span><span class="p">.</span><span class="nx">Analyzer</span><span class="p">]</span><span class="kt">string</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Currently, all linters except <code>unused</code> can be merged into this meta linter.<br> +The <code>unused</code> isn&rsquo;t merged because it has high memory usage.</p> +<p>Linters execution starts in <code>runAnalyzers</code>. +It&rsquo;s the most complex part of the golangci-lint. +We use custom <a href="https://pkg.go.dev/golang.org/x/tools/go/analysis"target="_blank" rel="noopener">go/analysis</a> runner there.<br> +It runs as much as it can in parallel. +It lazy-loads as much as it can to reduce memory usage. +Also, it sets all heavyweight data to <code>nil</code> as becomes unneeded to save memory.</p> +<p>We don&rsquo;t use existing <a href="https://pkg.go.dev/golang.org/x/tools/go/analysis/multichecker"target="_blank" rel="noopener">multichecker</a> because +it doesn&rsquo;t use caching and doesn&rsquo;t have some important performance optimizations.</p> +<p>All found by linters issues are represented with <code>result.Issue</code> struct:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/result/issue.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/result/issue.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Issue</span> <span class="kd">struct</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">FromLinter</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> <span class="nx">Text</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">Severity</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// Source lines of a code with the issue to show</span> +</span></span><span class="line"><span class="cl"> <span class="nx">SourceLines</span> <span class="p">[]</span><span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// Pkg is needed for proper caching of linting results</span> +</span></span><span class="line"><span class="cl"> <span class="nx">Pkg</span> <span class="o">*</span><span class="nx">packages</span><span class="p">.</span><span class="nx">Package</span> <span class="s">`json:&#34;-&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">Pos</span> <span class="nx">token</span><span class="p">.</span><span class="nx">Position</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">LineRange</span> <span class="o">*</span><span class="nx">Range</span> <span class="s">`json:&#34;,omitempty&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// HunkPos is used only when golangci-lint is run over a diff</span> +</span></span><span class="line"><span class="cl"> <span class="nx">HunkPos</span> <span class="kt">int</span> <span class="s">`json:&#34;,omitempty&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// If we know how to fix the issue we can provide replacement lines</span> +</span></span><span class="line"><span class="cl"> <span class="nx">SuggestedFixes</span> <span class="p">[]</span><span class="nx">analysis</span><span class="p">.</span><span class="nx">SuggestedFix</span> <span class="s">`json:&#34;,omitempty&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// If we are expecting a nolint (because this is from nolintlint), record the expected linter</span> +</span></span><span class="line"><span class="cl"> <span class="nx">ExpectNoLint</span> <span class="kt">bool</span> +</span></span><span class="line"><span class="cl"> <span class="nx">ExpectedNoLintLinter</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Postprocess Issues<span class="hx:absolute hx:-mt-20" id="postprocess-issues"></span> +<a href="#postprocess-issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We have an abstraction of <code>result.Processor</code> to postprocess found issues:</p> +<!-- +$ tree -L 1 ./pkg/result/processors/ | grep -v test +--> +<div class="hextra-filetree hx:mt-6 hx:select-none hx:text-sm hx:text-gray-800 hx:dark:text-gray-300 not-prose"> +<div class="hx:inline-block hx:rounded-lg hx:px-4 hx:py-2 hx:border hx:border-gray-200 hx:dark:border-neutral-800"> +<li class="hx:group hx:flex hx:list-none hx:flex-col"> +<button class="hextra-filetree-folder hx:inline-flex hx:cursor-pointer hx:items-center hx:py-1 hx:hover:opacity-60"> +<span data-state="open" class="hx:data-[state=open]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg></span> +<span data-state="open" class="hx:data-[state=closed]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/></svg></span> +<span class="hx:ltr:ml-1 hx:rtl:mr-1">./pkg/result/processors/</span> +</button> +<ul data-state="open" class="hx:ltr:pl-5 hx:rtl:pr-5 hx:data-[state=closed]:hidden"> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">cgo.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">diff.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_generated_file_filter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_generated_file_matcher.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_paths.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_presets.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_rules.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">filename_unadjuster.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">fixer.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">identifier_marker.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">invalid_issue.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">issues.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">max_from_linter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">max_per_file_from_linter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">max_same_issues.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">nolint_filter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_absoluter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_prettifier.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_relativity.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_shortener.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">processor.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">severity.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">sort_results.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">source_code.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">uniq_by_line.go</span> +</span> +</li> +</ul> +</li> +</div> +</div> +<p>The abstraction is simple:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/result/processors/processor.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/result/processors/processor.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Processor</span> <span class="kd">interface</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nf">Process</span><span class="p">(</span><span class="nx">issues</span> <span class="p">[]</span><span class="o">*</span><span class="nx">result</span><span class="p">.</span><span class="nx">Issue</span><span class="p">)</span> <span class="p">([]</span><span class="o">*</span><span class="nx">result</span><span class="p">.</span><span class="nx">Issue</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nf">Name</span><span class="p">()</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> <span class="nf">Finish</span><span class="p">()</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>A processor can hide issues (<code>nolint</code>, <code>exclude</code>) or change issues (<code>path_prettifier</code>).</p> +<h2>Print Issues<span class="hx:absolute hx:-mt-20" id="print-issues"></span> +<a href="#print-issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We have an abstraction for printing found issues.</p> +<!-- +$ tree -L 1 ./pkg/printers/ | grep -v test +--> +<div class="hextra-filetree hx:mt-6 hx:select-none hx:text-sm hx:text-gray-800 hx:dark:text-gray-300 not-prose"> +<div class="hx:inline-block hx:rounded-lg hx:px-4 hx:py-2 hx:border hx:border-gray-200 hx:dark:border-neutral-800"> +<li class="hx:group hx:flex hx:list-none hx:flex-col"> +<button class="hextra-filetree-folder hx:inline-flex hx:cursor-pointer hx:items-center hx:py-1 hx:hover:opacity-60"> +<span data-state="open" class="hx:data-[state=open]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg></span> +<span data-state="open" class="hx:data-[state=closed]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/></svg></span> +<span class="hx:ltr:ml-1 hx:rtl:mr-1">./pkg/printers/</span> +</button> +<ul data-state="open" class="hx:ltr:pl-5 hx:rtl:pr-5 hx:data-[state=closed]:hidden"> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">checkstyle.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">codeclimate.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">html.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">json.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">junitxml.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">printer.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">sarif.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">tab.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">teamcity.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">text.go</span> +</span> +</li> +</ul> +</li> +</div> +</div>New lintershttps://golangci-lint.run/docs/contributing/new-linters/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/new-linters/ +<h2>How to write a linter<span class="hx:absolute hx:-mt-20" id="how-to-write-a-linter"></span> +<a href="#how-to-write-a-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Use <code>go/analysis</code> and take a look at <a href="https://web.archive.org/web/20250527152107/https://disaev.me/p/writing-useful-go-analysis-linter/"target="_blank" rel="noopener">this tutorial</a>: +it shows how to write <code>go/analysis</code> linter from scratch and integrate it into <code>golangci-lint</code>.</p> +<h2>How to add a public linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-public-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-public-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>You need to implement a new linter using <code>go/analysis</code> API.</p> +<p>We don&rsquo;t accept non <code>go/analysis</code> linters.</p> +<p>After that:</p> +<ol> +<li>Implement functional tests for the linter: +<ul> +<li>Add one file into directory <code>pkg/golinters/{yourlintername}/testdata/</code>.</li> +</ul> +</li> +<li>Add a new file <code>pkg/golinters/{yourlintername}/{yourlintername}.go</code>. +Other linters implementation can help you.</li> +<li>Add the new struct for the linter (which you&rsquo;ve implemented in <code>pkg/golinters/{yourlintername}/{yourlintername}.go</code>) to the +list of all supported linters in <a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/lint/lintersdb/builder_linter.go"target="_blank" rel="noopener"><code>pkg/lint/lintersdb/builder_linter.go</code></a> +to the method <code>LinterBuilder.Build</code>. +<ul> +<li>Add <code>WithSince(&quot;next_version&quot;)</code>, where <code>next_version</code> must be replaced by the next minor version. (ex: v1.2.0 if the current version is v1.1.0)</li> +</ul> +</li> +<li>Find out what options do you need to configure for the linter. +For example, <code>nakedret</code> has only 1 option: <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.reference.yml"target="_blank" rel="noopener"><code>max-func-lines</code></a>. +Choose default values to not being annoying for users of golangci-lint. Add configuration options to: +<ul> +<li><a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml"target="_blank" rel="noopener">.golangci.next.reference.yml</a>: the example of a configuration file. +You can also add them to <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.yml"target="_blank" rel="noopener">.golangci.yml</a> +if you think that this project needs not default values.</li> +<li><a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/config/config.go"target="_blank" rel="noopener">config struct</a>: +don&rsquo;t forget about <code>mapstructure</code> tags for proper configuration files parsing.</li> +</ul> +</li> +<li>Take a look at the example of <a href="https://github.com/golangci/golangci-lint/pulls?q=is%3Apr&#43;is%3Amerged&#43;label%3A%22linter%3A&#43;new%22"target="_blank" rel="noopener">pull requests with new linter support</a>.</li> +<li>Run the tests: +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go run ./cmd/golangci-lint/ run --no-config --default<span class="o">=</span>none --enable<span class="o">={</span>yourlintername<span class="o">}</span> ./pkg/golinters/<span class="o">{</span>yourlintername<span class="o">}</span>/testdata/<span class="o">{</span>yourlintername<span class="o">}</span>.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</li> +</ol> +<h2>How to add a private linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-private-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-private-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Some people and organizations may choose to have custom-made linters run as a part of <code>golangci-lint</code>.<br> +Typically, these linters can&rsquo;t be open-sourced or too specific.</p> +<p>Such linters can be added through 2 plugin systems:</p> +<div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/plugins/module-plugins" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"/></svg>Module Plugin System</span><div class="hextra-badge hextra-card-tag" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700">Recommended</div> +</div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/plugins/go-plugins" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"/></svg>Go Plugin System</span></a> +</div>Debugginghttps://golangci-lint.run/docs/contributing/debug/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/debug/ +<p>You can see a verbose output of linter by using <code>-v</code> option.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run -v</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>If you would like to see more detailed logs you can use the environment variable <code>GL_DEBUG</code>.<br> +Its value is a list of debug tags.</p> +<p>The existing debug tags are documented in the following file: <a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/logutils/logutils.go"target="_blank" rel="noopener">/pkg/logutils/logutils.go</a></p> +<p>For example:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GL_DEBUG</span><span class="o">=</span><span class="s2">&#34;loader,gocritic&#34;</span> golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GL_DEBUG</span><span class="o">=</span><span class="s2">&#34;loader,env&#34;</span> golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>FAQhttps://golangci-lint.run/docs/contributing/faq/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/faq/ +<h2>How to add a new open-source linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-new-open-source-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-new-open-source-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>See <a href="https://golangci-lint.run/docs/contributing/new-linters/#how-to-add-a-public-linter-to-golangci-lint">there</a>.</p> +<h2>How to add a new private linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-new-private-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-new-private-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>See <a href="https://golangci-lint.run/docs/contributing/new-linters/#how-to-add-a-private-linter-to-golangci-lint">there</a>.</p> +<h2>How to update an existing linter<span class="hx:absolute hx:-mt-20" id="how-to-update-an-existing-linter"></span> +<a href="#how-to-update-an-existing-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.github/dependabot.yml"target="_blank" rel="noopener">Dependabot</a> to update dependencies, including linters.<br> +The updates happen at least automatically once a week (Sunday 11am UTC).</p> +<p>No pull requests to update a linter will be accepted unless you are the author of the linter and specific changes are required.</p> +<h2>How to add a configuration option to an existing linter<span class="hx:absolute hx:-mt-20" id="how-to-add-a-configuration-option-to-an-existing-linter"></span> +<a href="#how-to-add-a-configuration-option-to-an-existing-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add a new field to the <a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/config/linters_settings.go"target="_blank" rel="noopener">linter settings struct</a>.<br> +Document it in <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml"target="_blank" rel="noopener">.golangci.next.reference.yml</a>.<br> +Pass it to the linter.</p> +<h2>How to see <code>INFO</code> or <code>DEBUG</code> logs<span class="hx:absolute hx:-mt-20" id="how-to-see-info-or-debug-logs"></span> +<a href="#how-to-see-info-or-debug-logs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>See <a href="https://golangci-lint.run/docs/contributing/debug/">tutorial about debugging</a>.</p>This Websitehttps://golangci-lint.run/docs/contributing/website/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/website/ +<h2>Technology<span class="hx:absolute hx:-mt-20" id="technology"></span> +<a href="#technology" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use <a href="https://gohugo.io/"target="_blank" rel="noopener">Hugo</a> for static site generation because sites built with it are very fast.</p> +<h2>Source Code<span class="hx:absolute hx:-mt-20" id="source-code"></span> +<a href="#source-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The website lives in <code>docs/</code> directory of <a href="https://github.com/golangci/golangci-lint"target="_blank" rel="noopener">golangci-lint repository</a>.</p> +<h2>Theme<span class="hx:absolute hx:-mt-20" id="theme"></span> +<a href="#theme" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The site is based on <a href="https://github.com/imfing/hextra"target="_blank" rel="noopener">hextra</a> theme.</p> +<h2>Templating<span class="hx:absolute hx:-mt-20" id="templating"></span> +<a href="#templating" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use <a href="https://gohugo.io/templates/types/#shortcode"target="_blank" rel="noopener">shortcodes</a> and <a href="https://gohugo.io/templates/types/#partial"target="_blank" rel="noopener">partials</a> based on files from <code>./docs/.tmp/</code> and <code>./docs/data/</code>.</p> +<ul> +<li>The files in <code>./docs/.tmp/</code> are used to be embedded with the shortcode <code>{{% golangci/embed file=&quot;filename.ext&quot; %}}</code>.</li> +<li>The files in <code>./docs/data/</code> are used as <a href="https://gohugo.io/content-management/data-sources/"target="_blank" rel="noopener">data sources</a>.</li> +</ul> +<p>These files are created by running:</p> +<ul> +<li><code>make website_expand_templates</code> in the root of the repository.</li> +<li><code>make website_dump_info</code> in the root of the repository. (only during a release)</li> +</ul> +<h3>Some Notes<span class="hx:absolute hx:-mt-20" id="some-notes"></span> +<a href="#some-notes" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://gohugo.io/templates/types/#shortcode"target="_blank" rel="noopener">shortcodes</a>:</p> +<ul> +<li>cannot be used inside another shortcode</li> +<li>can only be used inside a page</li> +<li>can contain Markdown or HTML, but the tag is different: <code>{{% shortcode %}}</code> vs <code>{{&lt; shortcode &gt;}}</code></li> +</ul> +<p><a href="https://gohugo.io/templates/types/#partial"target="_blank" rel="noopener">partials</a>:</p> +<ul> +<li>are reusable HTML blocks or &ldquo;functions&rdquo;</li> +<li>cannot be used inside a page</li> +<li>can be used inside another partial</li> +<li>can be used inside a shortcode</li> +<li>can be used inside a layout</li> +</ul> +<h2>Hosting<span class="hx:absolute hx:-mt-20" id="hosting"></span> +<a href="#hosting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use GitHub Pages for static website hosting and CD.</p> +<p>GitHub deploys the website to production after merging anything to a <code>main</code> branch.</p> +<h2>Local Testing<span class="hx:absolute hx:-mt-20" id="local-testing"></span> +<a href="#local-testing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Install Hugo Extended (v0.148.1 or newer).</p> +<p>Run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make docs_serve</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>or</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make website_expand_templates +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="nb">cd</span> docs/ +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># (inside the docs/ folder)</span> +</span></span><span class="line"><span class="cl">make serve</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>And navigate to <code>http://localhost:1313</code> after a successful build.</p> +<p>There is no need to restart the Hugo server for almost all changes: it supports hot reload.<br> +Also, there is no need to refresh a webpage: hot reload updates changed content on the open page.</p> +<h2>Website Build<span class="hx:absolute hx:-mt-20" id="website-build"></span> +<a href="#website-build" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To do this, run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make docs_build</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>or</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make website_copy_jsonschema website_expand_templates +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="nb">cd</span> docs/ +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># (inside the docs/ folder)</span> +</span></span><span class="line"><span class="cl">make build</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> \ No newline at end of file diff --git a/docs/contributing/new-linters/index.html b/docs/contributing/new-linters/index.html new file mode 100644 index 000000000000..bb9bdc94aaad --- /dev/null +++ b/docs/contributing/new-linters/index.html @@ -0,0 +1,176 @@ +New linters – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    New linters

    How to write a linter +

    Use go/analysis and take a look at this tutorial: +it shows how to write go/analysis linter from scratch and integrate it into golangci-lint.

    How to add a public linter to golangci-lint +

    You need to implement a new linter using go/analysis API.

    We don’t accept non go/analysis linters.

    After that:

    1. Implement functional tests for the linter:
      • Add one file into directory pkg/golinters/{yourlintername}/testdata/.
    2. Add a new file pkg/golinters/{yourlintername}/{yourlintername}.go. +Other linters implementation can help you.
    3. Add the new struct for the linter (which you’ve implemented in pkg/golinters/{yourlintername}/{yourlintername}.go) to the +list of all supported linters in pkg/lint/lintersdb/builder_linter.go +to the method LinterBuilder.Build.
      • Add WithSince("next_version"), where next_version must be replaced by the next minor version. (ex: v1.2.0 if the current version is v1.1.0)
    4. Find out what options do you need to configure for the linter. +For example, nakedret has only 1 option: max-func-lines. +Choose default values to not being annoying for users of golangci-lint. Add configuration options to:
    5. Take a look at the example of pull requests with new linter support.
    6. Run the tests:
      go run ./cmd/golangci-lint/ run --no-config --default=none --enable={yourlintername} ./pkg/golinters/{yourlintername}/testdata/{yourlintername}.go

    How to add a private linter to golangci-lint +

    Some people and organizations may choose to have custom-made linters run as a part of golangci-lint.
    Typically, these linters can’t be open-sourced or too specific.

    Such linters can be added through 2 plugin systems:

    Last updated on
    \ No newline at end of file diff --git a/docs/contributing/website/index.html b/docs/contributing/website/index.html new file mode 100644 index 000000000000..aa148ec38285 --- /dev/null +++ b/docs/contributing/website/index.html @@ -0,0 +1,147 @@ +This Website – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    This Website

    Technology +

    We use Hugo for static site generation because sites built with it are very fast.

    Source Code +

    The website lives in docs/ directory of golangci-lint repository.

    Theme +

    The site is based on hextra theme.

    Templating +

    We use shortcodes and partials based on files from ./docs/.tmp/ and ./docs/data/.

    • The files in ./docs/.tmp/ are used to be embedded with the shortcode {{% golangci/embed file="filename.ext" %}}.
    • The files in ./docs/data/ are used as data sources.

    These files are created by running:

    • make website_expand_templates in the root of the repository.
    • make website_dump_info in the root of the repository. (only during a release)

    Some Notes +

    shortcodes:

    • cannot be used inside another shortcode
    • can only be used inside a page
    • can contain Markdown or HTML, but the tag is different: {{% shortcode %}} vs {{< shortcode >}}

    partials:

    • are reusable HTML blocks or “functions”
    • cannot be used inside a page
    • can be used inside another partial
    • can be used inside a shortcode
    • can be used inside a layout

    Hosting +

    We use GitHub Pages for static website hosting and CD.

    GitHub deploys the website to production after merging anything to a main branch.

    Local Testing +

    Install Hugo Extended (v0.148.1 or newer).

    Run:

    # (in the root of the repository)
    +make docs_serve

    or

    # (in the root of the repository)
    +make website_expand_templates
    +
    +cd docs/
    +
    +# (inside the docs/ folder)
    +make serve

    And navigate to http://localhost:1313 after a successful build.

    There is no need to restart the Hugo server for almost all changes: it supports hot reload.
    Also, there is no need to refresh a webpage: hot reload updates changed content on the open page.

    Website Build +

    To do this, run:

    # (in the root of the repository)
    +make docs_build

    or

    # (in the root of the repository)
    +make website_copy_jsonschema website_expand_templates
    +
    +cd docs/
    +
    +# (inside the docs/ folder)
    +make build
    Last updated on
    \ No newline at end of file diff --git a/docs/contributing/workflow/index.html b/docs/contributing/workflow/index.html new file mode 100644 index 000000000000..c3c1569ad59f --- /dev/null +++ b/docs/contributing/workflow/index.html @@ -0,0 +1,145 @@ +Workflow – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Workflow

    By participating in this project, you agree to abide our code of conduct.

    Set up your machine +

    Golangci-lint is written in Go.

    Prerequisites:

    Fork and clone golangci-lint repository.

    A good way of making sure everything is all right is running the following:

    make build
    +./golangci-lint run -v

    Test your change +

    When you are satisfied with the changes, we suggest you run:

    make test

    Which runs all the linters and tests.

    Create or update parameters for docs +

    Add your new or updated parameters to .golangci.next.reference.yml so they will be shown in the docs

    Submit a pull request +

    Push your branch to your golangci-lint fork and open a pull request against the +main branch.

    Pull request checks +

    First, please, accept CLA - CLA assistant will make a comment on the pull request about it.

    Also, we run a few checks in CI by using GitHub Actions, you can see them here.

    New releases +

    First, see our versioning policy.

    To make a new release create a tag vX.Y.Z.
    Don’t forget to add zero patch version for a new minor release, e.g. v1.99.0.

    A GitHub Action workflow will start building and publishing release after that.

    After making a release, you need to update GitHub Action config by running:

    make assets/github-action-config.json
    Last updated on
    \ No newline at end of file diff --git a/docs/donate/index.html b/docs/donate/index.html new file mode 100644 index 000000000000..2feef16fbdb3 --- /dev/null +++ b/docs/donate/index.html @@ -0,0 +1,110 @@ +Support Us – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/donate/index.xml b/docs/donate/index.xml new file mode 100644 index 000000000000..c4f36537b372 --- /dev/null +++ b/docs/donate/index.xml @@ -0,0 +1 @@ +Golangci-lint – Support Ushttps://golangci-lint.run/docs/donate/Recent content in Support Us on Golangci-lintHugo -- gohugo.ioen-us \ No newline at end of file diff --git a/docs/formatters/configuration/index.html b/docs/formatters/configuration/index.html new file mode 100644 index 000000000000..6d60774a5167 --- /dev/null +++ b/docs/formatters/configuration/index.html @@ -0,0 +1,204 @@ +Settings – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Settings

    gci +

    Check if code and import statements are formatted, with additional rules.

    Since golangci-lint v1.30.0
    Autofix
    +Repository

    formatters:
    +  settings:
    +    gci:
    +      # Section configuration to compare against.
    +      # Section names are case-insensitive and may contain parameters in ().
    +      # The default order of sections is `standard > default > custom > blank > dot > alias > localmodule`.
    +      # If `custom-order` is `true`, it follows the order of `sections` option.
    +      # Default: ["standard", "default"]
    +      sections:
    +        - standard # Standard section: captures all standard packages.
    +        - default # Default section: contains all imports that could not be matched to another section type.
    +        - prefix(github.com/org/project) # Custom section: groups all imports with the specified Prefix.
    +        - blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled.
    +        - dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled.
    +        - alias # Alias section: contains all alias imports. This section is not present unless explicitly enabled.
    +        - localmodule # Local module section: contains all local packages. This section is not present unless explicitly enabled.
    +      # Checks that no inline comments are present.
    +      # Default: false
    +      no-inline-comments: true
    +      # Checks that no prefix comments (comment lines above an import) are present.
    +      # Default: false
    +      no-prefix-comments: true
    +      # Enable custom order of sections.
    +      # If `true`, make the section order the same as the order of `sections`.
    +      # Default: false
    +      custom-order: true
    +      # Drops lexical ordering for custom sections.
    +      # Default: false
    +      no-lex-order: true

    gofmt +

    Check if the code is formatted according to 'gofmt' command.

    Since golangci-lint v1.0.0
    Autofix
    +Repository

    formatters:
    +  settings:
    +    gofmt:
    +      # Simplify code: gofmt with `-s` option.
    +      # Default: true
    +      simplify: false
    +      # Apply the rewrite rules to the source before reformatting.
    +      # https://pkg.go.dev/cmd/gofmt
    +      # Default: []
    +      rewrite-rules:
    +        - pattern: 'interface{}'
    +          replacement: 'any'
    +        - pattern: 'a[b:len(a)]'
    +          replacement: 'a[b:]'

    gofumpt +

    Check if code and import statements are formatted, with additional rules.

    Since golangci-lint v1.28.0
    Autofix
    +Repository

    formatters:
    +  settings:
    +    gofumpt:
    +      # Module path which contains the source code being formatted.
    +      # Default: ""
    +      module-path: github.com/org/project
    +      # Choose whether to use the extra rules.
    +      # Default: false
    +      extra-rules: true

    goimports +

    Checks if the code and import statements are formatted according to the 'goimports' command.

    Since golangci-lint v1.20.0
    Autofix
    +Repository

    formatters:
    +  settings:
    +    goimports:
    +      # A list of prefixes, which, if set, checks import paths
    +      # with the given prefixes are grouped after 3rd-party packages.
    +      # Default: []
    +      local-prefixes:
    +        - github.com/org/project

    golines +

    Checks if code is formatted, and fixes long lines.

    Since golangci-lint v2.0.0
    Autofix
    +Repository

    formatters:
    +  settings:
    +    golines:
    +      # Target maximum line length.
    +      # Default: 100
    +      max-len: 200
    +      # Length of a tabulation.
    +      # Default: 4
    +      tab-len: 8
    +      # Shorten single-line comments.
    +      # Default: false
    +      shorten-comments: true
    +      # Default: true
    +      reformat-tags: false
    +      # Split chained methods on the dots as opposed to the arguments.
    +      # Default: true
    +      chain-split-dots: false

    swaggo +

    Check if swaggo comments are formatted.

    Since golangci-lint v2.2.0
    Autofix
    +Repository

    No settings available.

    Last updated on
    \ No newline at end of file diff --git a/docs/formatters/index.html b/docs/formatters/index.html new file mode 100644 index 000000000000..8738761bc394 --- /dev/null +++ b/docs/formatters/index.html @@ -0,0 +1,111 @@ +Formatters – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    Last updated on
    \ No newline at end of file diff --git a/docs/formatters/index.xml b/docs/formatters/index.xml new file mode 100644 index 000000000000..c322cfc04b7e --- /dev/null +++ b/docs/formatters/index.xml @@ -0,0 +1,231 @@ +Golangci-lint – Formattershttps://golangci-lint.run/docs/formatters/Recent content in Formatters on Golangci-lintHugo -- gohugo.ioen-usSettingshttps://golangci-lint.run/docs/formatters/configuration/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/formatters/configuration/ +<h2>gci<span class="hx:absolute hx:-mt-20" id="gci"></span> +<a href="#gci" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if code and import statements are formatted, with additional rules.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.30.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/daixiang0/gci" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Section configuration to compare against.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Section names are case-insensitive and may contain parameters in ().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The default order of sections is `standard &gt; default &gt; custom &gt; blank &gt; dot &gt; alias &gt; localmodule`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If `custom-order` is `true`, it follows the order of `sections` option.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;standard&#34;, &#34;default&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sections</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">standard # Standard section</span><span class="p">:</span><span class="w"> </span><span class="l">captures all standard packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">default # Default section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all imports that could not be matched to another section type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">prefix(github.com/org/project) # Custom section</span><span class="p">:</span><span class="w"> </span><span class="l">groups all imports with the specified Prefix.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">blank # Blank section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all blank imports. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">dot # Dot section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all dot imports. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alias # Alias section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all alias imports. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">localmodule # Local module section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all local packages. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that no inline comments are present.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-inline-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that no prefix comments (comment lines above an import) are present.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-prefix-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable custom order of sections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If `true`, make the section order the same as the order of `sections`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom-order</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Drops lexical ordering for custom sections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-lex-order</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gofmt<span class="hx:absolute hx:-mt-20" id="gofmt"></span> +<a href="#gofmt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if the code is formatted according to 'gofmt' command.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://pkg.go.dev/cmd/gofmt" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify code: gofmt with `-s` option.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simplify</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Apply the rewrite rules to the source before reformatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://pkg.go.dev/cmd/gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rewrite-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;interface{}&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replacement</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;any&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;a[b:len(a)]&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replacement</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;a[b:]&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gofumpt<span class="hx:absolute hx:-mt-20" id="gofumpt"></span> +<a href="#gofumpt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if code and import statements are formatted, with additional rules.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/mvdan/gofumpt" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofumpt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Module path which contains the source code being formatted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">module-path</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/org/project</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Choose whether to use the extra rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-rules</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goimports<span class="hx:absolute hx:-mt-20" id="goimports"></span> +<a href="#goimports" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if the code and import statements are formatted according to the 'goimports' command.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://pkg.go.dev/golang.org/x/tools/cmd/goimports" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goimports</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A list of prefixes, which, if set, checks import paths</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># with the given prefixes are grouped after 3rd-party packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-prefixes</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/org/project</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>golines<span class="hx:absolute hx:-mt-20" id="golines"></span> +<a href="#golines" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if code is formatted, and fixes long lines.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/segmentio/golines" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">golines</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Target maximum line length.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 100</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-len</span><span class="p">:</span><span class="w"> </span><span class="m">200</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Length of a tabulation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab-len</span><span class="p">:</span><span class="w"> </span><span class="m">8</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Shorten single-line comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shorten-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reformat-tags</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Split chained methods on the dots as opposed to the arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">chain-split-dots</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>swaggo<span class="hx:absolute hx:-mt-20" id="swaggo"></span> +<a href="#swaggo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if swaggo comments are formatted.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/swaggo/swaggo" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 000000000000..a7ad1800285a --- /dev/null +++ b/docs/index.html @@ -0,0 +1,105 @@ +Golangci-lint Documentation – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/index.xml b/docs/index.xml new file mode 100644 index 000000000000..5a65300888e0 --- /dev/null +++ b/docs/index.xml @@ -0,0 +1,16915 @@ +Golangci-lint – Golangci-lint Documentationhttps://golangci-lint.run/docs/Recent content in Golangci-lint Documentation on Golangci-lintHugo -- gohugo.ioen-usCommand-Linehttps://golangci-lint.run/docs/configuration/cli/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/configuration/cli/ +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint -h +</span></span><span class="line"><span class="cl"><span class="go">Smart, fast linters runner. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> cache Cache control and information. +</span></span></span><span class="line"><span class="cl"><span class="go"> completion Generate the autocompletion script for the specified shell +</span></span></span><span class="line"><span class="cl"><span class="go"> config Configuration file information and verification. +</span></span></span><span class="line"><span class="cl"><span class="go"> custom Build a version of golangci-lint with custom linters. +</span></span></span><span class="line"><span class="cl"><span class="go"> fmt Format Go source files. +</span></span></span><span class="line"><span class="cl"><span class="go"> formatters List current formatters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"> help Display extra help +</span></span></span><span class="line"><span class="cl"><span class="go"> linters List current linters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"> migrate Migrate configuration file from v1 to v2. +</span></span></span><span class="line"><span class="cl"><span class="go"> run Lint the code. +</span></span></span><span class="line"><span class="cl"><span class="go"> version Display the golangci-lint version. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"> --version Print version +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>run</code><span class="hx:absolute hx:-mt-20" id="run"></span> +<a href="#run" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 3;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Linters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/configuration/file/#linters-configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Global Configuration</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters/configuration/" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Linter Settings</span></a> +</div> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>Note</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>This command executes enabled linters, and the formatters defined in <a href="https://golangci-lint.run/docs/configuration/file/#formatters-configuration"><code>formatters</code></a>, +but it does not format the code.</p> +<p>To only format code, use <a href="https://golangci-lint.run/docs/configuration/cli/#fmt"><code>golangci-lint fmt</code></a>. +To apply both linter fixes and formatting, use <code>golangci-lint run --fix</code>.</p> +<p>The formatters cannot be enabled or disabled inside the <a href="https://golangci-lint.run/docs/configuration/file/#linters-configuration"><code>linters</code></a> section or the flags <code>-E/--enable</code>, <code>-D/--disable</code> of the command <a href="https://golangci-lint.run/docs/configuration/cli/#run"><code>golangci-lint run</code></a>.</p> +<p>The formatters can be enabled/disabled by defining them inside the <a href="https://golangci-lint.run/docs/configuration/file/#formatters-configuration"><code>formatters</code></a> section or by using the flags <code>-E/--enable</code>, <code>-D/--disable</code> of command <a href="https://golangci-lint.run/docs/configuration/cli/#fmt"><code>golangci-lint fmt</code></a>.</p></div> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint run -h +</span></span><span class="line"><span class="cl"><span class="go">Lint the code. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint run [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --default string Default set of linters to enable (default &#34;standard&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -D, --disable strings Disable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> --enable-only strings Override linters configuration section to only run the specific linter(s) +</span></span></span><span class="line"><span class="cl"><span class="go"> --fast-only Filter enabled linters to run only fast linters +</span></span></span><span class="line"><span class="cl"><span class="go"> -j, --concurrency int Number of CPUs to use (Default: Automatically set to match Linux container CPU quota and fall back to the number of logical CPUs in the machine) +</span></span></span><span class="line"><span class="cl"><span class="go"> --modules-download-mode string Modules download mode. If not empty, passed as -mod=&lt;mode&gt; to go tools +</span></span></span><span class="line"><span class="cl"><span class="go"> --issues-exit-code int Exit code when issues were found (default 1) +</span></span></span><span class="line"><span class="cl"><span class="go"> --build-tags strings Build tags +</span></span></span><span class="line"><span class="cl"><span class="go"> --timeout duration Timeout for total work. Disabled by default +</span></span></span><span class="line"><span class="cl"><span class="go"> --tests Analyze tests (*_test.go) (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --allow-parallel-runners Allow multiple parallel golangci-lint instances running. +</span></span></span><span class="line"><span class="cl"><span class="go"> If false (default) - golangci-lint acquires file lock on start. +</span></span></span><span class="line"><span class="cl"><span class="go"> --allow-serial-runners Allow multiple golangci-lint instances running, but serialize them around a lock. +</span></span></span><span class="line"><span class="cl"><span class="go"> If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start. +</span></span></span><span class="line"><span class="cl"><span class="go"> --path-prefix string Path prefix to add to output +</span></span></span><span class="line"><span class="cl"><span class="go"> --path-mode string Path mode to use (empty, or &#39;abs&#39;) +</span></span></span><span class="line"><span class="cl"><span class="go"> --show-stats Show statistics per linter (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.print-linter-name Print linter name in the end of issue text. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.print-issued-lines Print lines of code with issue. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.text.colors Use colors. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.json.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.tab.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.tab.print-linter-name Print linter name in the end of issue text. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.tab.colors Use colors. (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.html.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.checkstyle.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.code-climate.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.junit-xml.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.junit-xml.extended Support extra JUnit XML fields. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.teamcity.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --output.sarif.path stdout Output path can be either stdout, `stderr` or path to the file to write to. +</span></span></span><span class="line"><span class="cl"><span class="go"> --max-issues-per-linter int Maximum issues count per one linter. Set to 0 to disable (default 50) +</span></span></span><span class="line"><span class="cl"><span class="go"> --max-same-issues int Maximum count of issues with the same text. Set to 0 to disable (default 3) +</span></span></span><span class="line"><span class="cl"><span class="go"> --uniq-by-line Make issues output unique by line (default true) +</span></span></span><span class="line"><span class="cl"><span class="go"> -n, --new Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed. +</span></span></span><span class="line"><span class="cl"><span class="go"> It&#39;s a super-useful option for integration of golangci-lint into existing large codebase. +</span></span></span><span class="line"><span class="cl"><span class="go"> It&#39;s not practical to fix all existing issues at the moment of integration: much better to not allow issues in new code. +</span></span></span><span class="line"><span class="cl"><span class="go"> For CI setups, prefer --new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate unstaged files before golangci-lint runs. +</span></span></span><span class="line"><span class="cl"><span class="go"> --new-from-rev REV Show only new issues created after git revision REV +</span></span></span><span class="line"><span class="cl"><span class="go"> --new-from-patch PATH Show only new issues created in git patch with file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --new-from-merge-base string Show only new issues created after the best common ancestor (merge-base against HEAD) +</span></span></span><span class="line"><span class="cl"><span class="go"> --whole-files Show issues in any part of update files (requires new-from-rev or new-from-patch) +</span></span></span><span class="line"><span class="cl"><span class="go"> --fix Fix found issues (if it&#39;s supported by the linter) +</span></span></span><span class="line"><span class="cl"><span class="go"> --cpu-profile-path string Path to CPU profile output file +</span></span></span><span class="line"><span class="cl"><span class="go"> --mem-profile-path string Path to memory profile output file +</span></span></span><span class="line"><span class="cl"><span class="go"> --trace-path string Path to trace output file +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>When the <code>--cpu-profile-path</code> or <code>--mem-profile-path</code> arguments are specified, +golangci-lint writes runtime profiling data in the format expected by the <a href="https://github.com/google/pprof"target="_blank" rel="noopener">pprof</a> visualization tool.</p> +<p>When the <code>--trace-path</code> argument is specified, <code>golangci-lint</code> writes runtime tracing data in the format expected by +the <code>go tool trace</code> command and visualization tool.</p> +<h2>fmt<span class="hx:absolute hx:-mt-20" id="fmt"></span> +<a href="#fmt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 3;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Formatters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/configuration/file/#formatters-configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Global Configuration</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters/configuration/" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Formatter Settings</span></a> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint fmt -h +</span></span><span class="line"><span class="cl"><span class="go">Format Go source files. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint fmt [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific formatter +</span></span></span><span class="line"><span class="cl"><span class="go"> -d, --diff Display diffs instead of rewriting files +</span></span></span><span class="line"><span class="cl"><span class="go"> --diff-colored Display diffs instead of rewriting files (with colors) +</span></span></span><span class="line"><span class="cl"><span class="go"> --stdin Use standard input for piping source files +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>migrate</code><span class="hx:absolute hx:-mt-20" id="migrate"></span> +<a href="#migrate" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint migrate -h +</span></span><span class="line"><span class="cl"><span class="go">Migrate configuration file from v1 to v2. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint migrate [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --format string Output file format. +</span></span></span><span class="line"><span class="cl"><span class="go"> By default, the format of the input configuration file is used. +</span></span></span><span class="line"><span class="cl"><span class="go"> It can be &#39;yml&#39;, &#39;yaml&#39;, &#39;toml&#39;, or &#39;json&#39;. +</span></span></span><span class="line"><span class="cl"><span class="go"> --skip-validation Skip validation of the configuration file against the JSON Schema for v1. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>formatters</code><span class="hx:absolute hx:-mt-20" id="formatters"></span> +<a href="#formatters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint formatters -h +</span></span><span class="line"><span class="cl"><span class="go">List current formatters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint formatters [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific formatter +</span></span></span><span class="line"><span class="cl"><span class="go"> --json Display as JSON +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>help</code><span class="hx:absolute hx:-mt-20" id="help"></span> +<a href="#help" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint <span class="nb">help</span> -h +</span></span><span class="line"><span class="cl"><span class="go">Display extra help +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint help [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint help [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> formatters Display help for formatters. +</span></span></span><span class="line"><span class="cl"><span class="go"> linters Display help for linters. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint help [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>linters</code><span class="hx:absolute hx:-mt-20" id="linters"></span> +<a href="#linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint linters -h +</span></span><span class="line"><span class="cl"><span class="go">List current linters configuration. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint linters [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --default string Default set of linters to enable (default &#34;standard&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -D, --disable strings Disable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> -E, --enable strings Enable specific linter +</span></span></span><span class="line"><span class="cl"><span class="go"> --enable-only strings Override linters configuration section to only run the specific linter(s) +</span></span></span><span class="line"><span class="cl"><span class="go"> --fast-only Filter enabled linters to run only fast linters +</span></span></span><span class="line"><span class="cl"><span class="go"> --json Display as JSON +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>cache</code><span class="hx:absolute hx:-mt-20" id="cache"></span> +<a href="#cache" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Golangci-lint stores its cache in the subdirectory <code>golangci-lint</code> inside the <a href="https://pkg.go.dev/os#UserCacheDir"target="_blank" rel="noopener">default user cache directory</a>.</p> +<p>You can override the default cache directory with the environment variable <code>GOLANGCI_LINT_CACHE</code>; the path must be absolute.</p> +<p>The cache is only used by <code>golangci-lint run</code> (linters).</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint cache -h +</span></span><span class="line"><span class="cl"><span class="go">Cache control and information. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint cache [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint cache [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> clean Clean cache +</span></span></span><span class="line"><span class="cl"><span class="go"> status Show cache status +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint cache [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>config</code><span class="hx:absolute hx:-mt-20" id="config"></span> +<a href="#config" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint config -h +</span></span><span class="line"><span class="cl"><span class="go">Configuration file information and verification. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint config [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint config [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> path Print used configuration path. +</span></span></span><span class="line"><span class="cl"><span class="go"> verify Verify configuration against JSON schema. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint config [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>custom</code><span class="hx:absolute hx:-mt-20" id="custom"></span> +<a href="#custom" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint custom -h +</span></span><span class="line"><span class="cl"><span class="go">Build a version of golangci-lint with custom linters. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint custom [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>version</code><span class="hx:absolute hx:-mt-20" id="version"></span> +<a href="#version" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint version -h +</span></span><span class="line"><span class="cl"><span class="go">Display the golangci-lint version. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint version [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --debug Add build information +</span></span></span><span class="line"><span class="cl"><span class="go"> --json Display as JSON +</span></span></span><span class="line"><span class="cl"><span class="go"> --short Display only the version number +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>completion</code><span class="hx:absolute hx:-mt-20" id="completion"></span> +<a href="#completion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint completion -h +</span></span><span class="line"><span class="cl"><span class="go">Generate the autocompletion script for golangci-lint for the specified shell. +</span></span></span><span class="line"><span class="cl"><span class="go">See each sub-command&#39;s help for details on how to use the generated script. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint completion [command] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Available Commands: +</span></span></span><span class="line"><span class="cl"><span class="go"> bash Generate the autocompletion script for bash +</span></span></span><span class="line"><span class="cl"><span class="go"> fish Generate the autocompletion script for fish +</span></span></span><span class="line"><span class="cl"><span class="go"> powershell Generate the autocompletion script for powershell +</span></span></span><span class="line"><span class="cl"><span class="go"> zsh Generate the autocompletion script for zsh +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Use &#34;golangci-lint completion [command] --help&#34; for more information about a command. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Installhttps://golangci-lint.run/docs/welcome/install/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/install/ +<h2>CI installation<span class="hx:absolute hx:-mt-20" id="ci-installation"></span> +<a href="#ci-installation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Most installations of golangci-lint are performed for CI.</p> +<p>It&rsquo;s important to have reproducible CI: don&rsquo;t start to fail all builds at the same time. +With golangci-lint this can happen if you use option <code>linters.default: all</code> and a new linter is added +or even without <code>linters.default: all</code> when one upstream linter is upgraded.</p> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-purple-200 hx:bg-purple-100 hx:text-purple-900 hx:dark:border-purple-200/30 hx:dark:bg-purple-900/30 hx:dark:text-purple-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>Important</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>It&rsquo;s highly recommended installing a specific version of golangci-lint available on the <a href="https://github.com/golangci/golangci-lint/releases"target="_blank" rel="noopener">releases page</a>.</p></div> +</div> +</div> +<h3>GitHub Actions<span class="hx:absolute hx:-mt-20" id="github-actions"></span> +<a href="#github-actions" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>We recommend using <a href="https://github.com/golangci/golangci-lint-action"target="_blank" rel="noopener">our GitHub Action</a> for running golangci-lint in CI for GitHub projects.</p> +<p>It&rsquo;s <a href="https://github.com/golangci/golangci-lint-action#performance"target="_blank" rel="noopener">fast and uses smart caching</a> inside, +and it can be much faster than the simple binary installation.</p> +<p>Also, the action creates GitHub annotations for found issues (you don&rsquo;t need to dig into build log to see found by golangci-lint issues).</p> +<div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<div class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden"> +<img class="hextra-card-image" src="https://golangci-lint.run/images/colored-line-number.png" alt="Console Output" title="Console Output"/> +</div> +<div class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden"> +<img class="hextra-card-image" src="https://golangci-lint.run/images/annotations.png" alt="Annotations" title="Annotations"/> +</div> +</div> +<h3>GitLab CI<span class="hx:absolute hx:-mt-20" id="gitlab-ci"></span> +<a href="#gitlab-ci" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>GitLab provides a <a href="https://docs.gitlab.com/ci/testing/code_quality/#golangci-lint"target="_blank" rel="noopener">guide for integrating golangci-lint into the Code Quality widget</a>. +A simple quickstart is their <a href="https://gitlab.com/explore/catalog/components/code-quality-oss/codequality-os-scanners-integration"target="_blank" rel="noopener">CI component</a>, which can be used like this:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.gitlab-ci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">include</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">component</span><span class="p">:</span><span class="w"> </span><span class="l">$CI_SERVER_FQDN/components/code-quality-oss/codequality-os-scanners-integration/golangci@1.0.1</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Note that you <a href="https://docs.gitlab.com/ci/components/#use-a-component"target="_blank" rel="noopener">can only reference components in the same GitLab instance as your project</a></p> +<h3>Other CI<span class="hx:absolute hx:-mt-20" id="other-ci"></span> +<a href="#other-ci" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Here is the other way to install golangci-lint:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># binary will be $(go env GOPATH)/bin/golangci-lint</span> +</span></span><span class="line"><span class="cl">curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s -- -b <span class="k">$(</span>go env GOPATH<span class="k">)</span>/bin v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># or install it into ./bin/</span> +</span></span><span class="line"><span class="cl">curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># In Alpine Linux (as it does not come with curl by default)</span> +</span></span><span class="line"><span class="cl">wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">golangci-lint --version</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>It is advised that you periodically update the version of golangci-lint as the project is under active development and is constantly being improved. +For any problems with golangci-lint, check out recent <a href="https://github.com/golangci/golangci-lint/issues"target="_blank" rel="noopener">GitHub issues</a> and update if needed.</p> +<h2>Local Installation<span class="hx:absolute hx:-mt-20" id="local-installation"></span> +<a href="#local-installation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><a href="https://repology.org/project/golangci-lint/versions"target="_blank" rel="noopener"><img src="https://repology.org/badge/vertical-allrepos/golangci-lint.svg" alt="Packaging status" loading="lazy" /></a></p> +<h3>Binaries<span class="hx:absolute hx:-mt-20" id="binaries"></span> +<a href="#binaries" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># binary will be $(go env GOPATH)/bin/golangci-lint</span> +</span></span><span class="line"><span class="cl">curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s -- -b <span class="k">$(</span>go env GOPATH<span class="k">)</span>/bin v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">golangci-lint --version</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>On Windows, you can run the above commands with Git Bash, which comes with <a href="https://git-scm.com/download/win"target="_blank" rel="noopener">Git for Windows</a>.</p> +<h3>Linux<span class="hx:absolute hx:-mt-20" id="linux"></span> +<a href="#linux" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Golangci-lint is available inside the majority of the package managers.</p> +<h3>macOS<span class="hx:absolute hx:-mt-20" id="macos"></span> +<a href="#macos" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4>Homebrew<span class="hx:absolute hx:-mt-20" id="homebrew"></span> +<a href="#homebrew" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Note: Homebrew can use an unexpected version of Go to build the binary, +so we recommend either using our binaries or ensuring the version of Go used to build.</p> +<p>You can install a binary release on macOS using <a href="https://brew.sh/"target="_blank" rel="noopener">brew</a>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew install golangci-lint +</span></span><span class="line"><span class="cl">brew upgrade golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Note: Previously, we used a <a href="https://github.com/golangci/homebrew-tap"target="_blank" rel="noopener">Homebrew tap</a>. +We recommend using the <a href="https://formulae.brew.sh/formula/golangci-lint"target="_blank" rel="noopener">official formula</a> instead of the tap, +but sometimes the most recent release isn&rsquo;t immediately available via Homebrew core due to manual updates that need to occur from Homebrew core maintainers. +In this case, the tap formula, which is updated automatically, +can be used to install the latest version of golangci-lint:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew tap golangci/tap +</span></span><span class="line"><span class="cl">brew install golangci/tap/golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h4>MacPorts<span class="hx:absolute hx:-mt-20" id="macports"></span> +<a href="#macports" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>It can also be installed through <a href="https://www.macports.org/"target="_blank" rel="noopener">MacPorts</a> +The MacPorts installation mode is community-driven and not officially maintained by the golangci team.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo port install golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Windows<span class="hx:absolute hx:-mt-20" id="windows"></span> +<a href="#windows" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4>Chocolatey<span class="hx:absolute hx:-mt-20" id="chocolatey"></span> +<a href="#chocolatey" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>You can install a binary on Windows using <a href="https://community.chocolatey.org/packages/golangci-lint"target="_blank" rel="noopener">chocolatey</a>.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">choco install golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h4>Scoop<span class="hx:absolute hx:-mt-20" id="scoop"></span> +<a href="#scoop" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>You can install a binary on Windows using <a href="https://scoop.sh/"target="_blank" rel="noopener">scoop</a>.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">scoop install main/golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The scoop package is not officially maintained by golangci team.</p> +<h3>Docker<span class="hx:absolute hx:-mt-20" id="docker"></span> +<a href="#docker" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Colored output:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -t --rm -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Preserving caches between consecutive runs:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -t -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/app -w /app <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>--user <span class="k">$(</span>id -u<span class="k">)</span>:<span class="k">$(</span>id -g<span class="k">)</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>-v <span class="k">$(</span>go env GOCACHE<span class="k">)</span>:/.cache/go-build -e <span class="nv">GOCACHE</span><span class="o">=</span>/.cache/go-build <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>-v <span class="k">$(</span>go env GOMODCACHE<span class="k">)</span>:/.cache/mod -e <span class="nv">GOMODCACHE</span><span class="o">=</span>/.cache/mod <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>-v ~/.cache/golangci-lint:/.cache/golangci-lint -e <span class="nv">GOLANGCI_LINT_CACHE</span><span class="o">=</span>/.cache/golangci-lint <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>golangci/golangci-lint:v2.5.0 golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Install from Sources<span class="hx:absolute hx:-mt-20" id="install-from-sources"></span> +<a href="#install-from-sources" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg>Warning</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>Using <code>go install</code>/<code>go get</code>, &ldquo;tools pattern&rdquo;, and <code>tool</code> command/directives installations aren&rsquo;t guaranteed to work.<br> +We recommend using binary installation.</p></div> +</div> +</div> +<p>These installations aren&rsquo;t recommended because of the following points:</p> +<ol> +<li>These installations compile golangci-lint locally. The Go version used to build will depend on your local Go version.</li> +<li>Some users use the <code>-u</code> flag for <code>go get</code>, which upgrades our dependencies. The resulting binary was not tested and is not guaranteed to work.</li> +<li>When using the &ldquo;tools pattern&rdquo; or <code>tool</code> command/directives, the dependencies of a tool can modify the dependencies of another tool or your project. The resulting binary was not tested and is not guaranteed to work.</li> +<li>We&rsquo;ve encountered issues with Go module hashes due to the unexpected recreation of dependency tags.</li> +<li><code>go.mod</code> replacement directives don&rsquo;t apply transitively. It means a user will be using a patched version of golangci-lint if we use such replacements.</li> +<li>It allows installation from the main branch, which can&rsquo;t be considered stable.</li> +<li>It&rsquo;s slower than binary installation.</li> +</ol> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg"><code>go tool</code> usage recommendations</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg>Warning</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>We don&rsquo;t recommend using <code>go tool</code>.</p></div> +</div> +</div> +<p>But if you want to use <code>go tool</code> to install and run golangci-lint (<strong>once again we don&rsquo;t recommend that</strong>), +the best approach is to use a dedicated module or module file to isolate golangci-lint from other tools or dependencies.</p> +<p>This approach avoids modifying your project dependencies and the golangci-lint dependencies.</p> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-red-200 hx:bg-red-100 hx:text-red-900 hx:dark:border-red-200/30 hx:dark:bg-red-900/30 hx:dark:text-red-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>Caution</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>You should never update golangci-lint dependencies manually.</p></div> +</div> +</div> +<p><strong>Method 1: dedicated module file</strong></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Create a dedicated module file</span> +</span></span><span class="line"><span class="cl">go mod init -modfile<span class="o">=</span>golangci-lint.mod &lt;your_module_path&gt;/golangci-lint +</span></span><span class="line"><span class="cl"><span class="c1"># Example: go mod init -modfile=golangci-lint.mod github.com/org/repo/golangci-lint</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Add golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Run golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go tool -modfile<span class="o">=</span>golangci-lint.mod golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Update golangci-lint</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p><strong>Method 2: dedicated module</strong></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Create a dedicated directory</span> +</span></span><span class="line"><span class="cl">mkdir golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Create a dedicated module file</span> +</span></span><span class="line"><span class="cl">go mod init -modfile<span class="o">=</span>tools/go.mod &lt;your_module_path&gt;/golangci-lint +</span></span><span class="line"><span class="cl"><span class="c1"># Example: go mod init -modfile=golangci-lint/go.mod github.com/org/repo/golangci-lint</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Setup a Go workspace</span> +</span></span><span class="line"><span class="cl">go work init . golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Add golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Run golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go tool golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Update golangci-lint</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</details>Module Plugin Systemhttps://golangci-lint.run/docs/plugins/module-plugins/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/plugins/module-plugins/ +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg>Tip</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>An example linter can be found at <a href="https://github.com/golangci/example-plugin-module-linter"target="_blank" rel="noopener">here</a>.</p></div> +</div> +</div> +<h2>The Automatic Way<span class="hx:absolute hx:-mt-20" id="the-automatic-way"></span> +<a href="#the-automatic-way" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul> +<li>Define your building configuration into <code>.custom-gcl.yml</code>.</li> +<li>Run the command <code>golangci-lint custom</code> (or <code>golangci-lint custom -v</code> to have logs).</li> +<li>Define the plugin inside the <code>linters.settings.custom</code> section with the type <code>module</code>.</li> +<li>Run the resulting custom binary of golangci-lint (<code>./custom-gcl</code> by default).</li> +</ul> +<p>Requirements:</p> +<ul> +<li>Go</li> +<li>git</li> +</ul> +<h3>Configuration Example<span class="hx:absolute hx:-mt-20" id="configuration-example"></span> +<a href="#configuration-example" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.custom-gcl.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v2.5.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">plugins</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from a Go proxy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/golangci/plugin1&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/golangci/plugin1/foo&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v1.0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/golangci/plugin2&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my/local/path/plugin2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.golangci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">none</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">foo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;module&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">This is an example usage of a plugin linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="l">hello</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>The Manual Way<span class="hx:absolute hx:-mt-20" id="the-manual-way"></span> +<a href="#the-manual-way" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul> +<li>Add a blank-import of your module inside <code>cmd/golangci-lint/plugins.go</code>.</li> +<li>Run <code>go mod tidy</code> (the module containing the plugin will be imported).</li> +<li>Run <code>make build</code>.</li> +<li>Define the plugin inside the <code>linters.settings.custom</code> section with the type <code>module</code>.</li> +<li>Run your custom version of golangci-lint.</li> +</ul> +<h3>Configuration Example<span class="hx:absolute hx:-mt-20" id="configuration-example-1"></span> +<a href="#configuration-example-1" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.golangci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">none</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">foo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;module&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">This is an example usage of a plugin linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="l">hello</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Reference<span class="hx:absolute hx:-mt-20" id="reference"></span> +<a href="#reference" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The configuration file can be validated with the JSON Schema: <a href="https://golangci-lint.run/jsonschema/custom-gcl.jsonschema.json"target="_blank" rel="noopener">custom-gcl.jsonschema.json</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.custom-gcl.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="c"># The golangci-lint version used to build the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Required.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v2.0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The name of the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Default: custom-gcl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">custom-golangci-lint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The directory path used to store the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Default: .</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">destination</span><span class="p">:</span><span class="w"> </span><span class="l">./my/path/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The list of the plugins to integrate inside the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">plugins</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from a Go proxy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin3&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v1.2.3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from a Go proxy (with a specific import path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin4&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin4/foo&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v1.0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source (with absolute path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin2&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my/local/path/plugin2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source (with relative path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin1&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./my/local/path/plugin1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source (with absolute path and a specific import path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin2&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin4/foo&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my/local/path/plugin2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Thankshttps://golangci-lint.run/docs/product/thanks/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/thanks/ +<h2>❤️<span class="hx:absolute hx:-mt-20" id="heading"></span> +<a href="#heading" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Thanks to developers and authors of used linters<span class="hx:absolute hx:-mt-20" id="thanks-to-developers-and-authors-of-used-linters"></span> +<a href="#thanks-to-developers-and-authors-of-used-linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="author-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 7;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/4meepo" +target="_blank" rel="noreferrer"><img +alt="4meepo" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/4meepo.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">4meepo</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>tagalign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Abirdcfly" +target="_blank" rel="noreferrer"><img +alt="Abirdcfly" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Abirdcfly.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Abirdcfly</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>dupword</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/AdminBenni" +target="_blank" rel="noreferrer"><img +alt="AdminBenni" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/AdminBenni.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">AdminBenni</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>iotamixing</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/alecthomas" +target="_blank" rel="noreferrer"><img +alt="alecthomas" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/alecthomas.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">alecthomas</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gochecksumtype</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/alexkohler" +target="_blank" rel="noreferrer"><img +alt="alexkohler" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/alexkohler.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">alexkohler</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>dogsled</code><br><code>nakedret</code><br><code>prealloc</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/alingse" +target="_blank" rel="noreferrer"><img +alt="alingse" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/alingse.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">alingse</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>asasalint</code><br><code>nilnesserr</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/AlwxSin" +target="_blank" rel="noreferrer"><img +alt="AlwxSin" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/AlwxSin.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">AlwxSin</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>noinlineerr</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Antonboom" +target="_blank" rel="noreferrer"><img +alt="Antonboom" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Antonboom.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Antonboom</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>errname</code><br><code>nilnil</code><br><code>testifylint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ashanbrown" +target="_blank" rel="noreferrer"><img +alt="ashanbrown" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ashanbrown.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ashanbrown</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>forbidigo</code><br><code>makezero</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/babakks" +target="_blank" rel="noreferrer"><img +alt="babakks" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/babakks.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">babakks</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>godoclint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/bkielbasa" +target="_blank" rel="noreferrer"><img +alt="bkielbasa" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/bkielbasa.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">bkielbasa</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>cyclop</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/blizzy78" +target="_blank" rel="noreferrer"><img +alt="blizzy78" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/blizzy78.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">blizzy78</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>varnamelen</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/bombsimon" +target="_blank" rel="noreferrer"><img +alt="bombsimon" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/bombsimon.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">bombsimon</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>wsl</code><br><code>wsl_v5</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://gitlab.com/bosi" +target="_blank" rel="noreferrer"><img +alt="bosi" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/bosix.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">bosi</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>decorder</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/breml" +target="_blank" rel="noreferrer"><img +alt="breml" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/breml.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">breml</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>bidichk</code><br><code>errchkjson</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/butuzov" +target="_blank" rel="noreferrer"><img +alt="butuzov" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/butuzov.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">butuzov</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>ireturn</code><br><code>mirror</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/catenacyber" +target="_blank" rel="noreferrer"><img +alt="catenacyber" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/catenacyber.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">catenacyber</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>perfsprint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/charithe" +target="_blank" rel="noreferrer"><img +alt="charithe" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/charithe.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">charithe</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>durationcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/chokoswitch" +target="_blank" rel="noreferrer"><img +alt="chokoswitch" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/chokoswitch.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">chokoswitch</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>reassign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ckaznocha" +target="_blank" rel="noreferrer"><img +alt="ckaznocha" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ckaznocha.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ckaznocha</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>intrange</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/client9" +target="_blank" rel="noreferrer"><img +alt="client9" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/client9.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">client9</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>misspell</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Crocmagnon" +target="_blank" rel="noreferrer"><img +alt="Crocmagnon" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Crocmagnon.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Crocmagnon</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>arangolint</code><br><code>fatcontext</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/daixiang0" +target="_blank" rel="noreferrer"><img +alt="daixiang0" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/daixiang0.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">daixiang0</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gci</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/denis-tingaikin" +target="_blank" rel="noreferrer"><img +alt="denis-tingaikin" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/denis-tingaikin.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">denis-tingaikin</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>goheader</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/dixonwille" +target="_blank" rel="noreferrer"><img +alt="dixonwille" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/dixonwille.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">dixonwille</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>depguard</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Djarvur" +target="_blank" rel="noreferrer"><img +alt="Djarvur" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Djarvur.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Djarvur</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>err113</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/dominikh" +target="_blank" rel="noreferrer"><img +alt="dominikh" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/dominikh.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">dominikh</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>staticcheck</code><br><code>unused</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/firefart" +target="_blank" rel="noreferrer"><img +alt="firefart" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/firefart.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">firefart</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nonamedreturns</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/fzipp" +target="_blank" rel="noreferrer"><img +alt="fzipp" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/fzipp.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">fzipp</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocyclo</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ghostiam" +target="_blank" rel="noreferrer"><img +alt="ghostiam" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ghostiam.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ghostiam</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>protogetter</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/go-critic" +target="_blank" rel="noreferrer"><img +alt="go-critic" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/go-critic.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">go-critic</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocritic</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/golang" +target="_blank" rel="noreferrer"><img +alt="golang" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/golang.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">golang</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gofmt</code><br><code>goimports</code><br><code>govet</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/gordonklaus" +target="_blank" rel="noreferrer"><img +alt="gordonklaus" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/gordonklaus.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">gordonklaus</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>ineffassign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/jgautheron" +target="_blank" rel="noreferrer"><img +alt="jgautheron" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/jgautheron.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">jgautheron</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>goconst</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/jingyugao" +target="_blank" rel="noreferrer"><img +alt="jingyugao" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/jingyugao.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">jingyugao</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>rowserrcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/jjti" +target="_blank" rel="noreferrer"><img +alt="jjti" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/jjti.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">jjti</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>spancheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/julz" +target="_blank" rel="noreferrer"><img +alt="julz" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/julz.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">julz</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>importas</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/karamaru-alpha" +target="_blank" rel="noreferrer"><img +alt="karamaru-alpha" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/karamaru-alpha.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">karamaru-alpha</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>copyloopvar</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kisielk" +target="_blank" rel="noreferrer"><img +alt="kisielk" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kisielk.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kisielk</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>errcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kkHAIKE" +target="_blank" rel="noreferrer"><img +alt="kkHAIKE" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kkHAIKE.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kkHAIKE</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>contextcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kulti" +target="_blank" rel="noreferrer"><img +alt="kulti" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kulti.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kulti</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>thelper</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kunwardeep" +target="_blank" rel="noreferrer"><img +alt="kunwardeep" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kunwardeep.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kunwardeep</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>paralleltest</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/lasiar" +target="_blank" rel="noreferrer"><img +alt="lasiar" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/lasiar.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">lasiar</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>canonicalheader</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ldez" +target="_blank" rel="noreferrer"><img +alt="ldez" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ldez.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ldez</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>exptostd</code><br><code>gomoddirectives</code><br><code>tagliatelle</code><br><code>usetesting</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/leighmcculloch" +target="_blank" rel="noreferrer"><img +alt="leighmcculloch" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/leighmcculloch.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">leighmcculloch</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocheckcompilerdirectives</code><br><code>gochecknoglobals</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/leonklingele" +target="_blank" rel="noreferrer"><img +alt="leonklingele" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/leonklingele.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">leonklingele</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>grouper</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/macabu" +target="_blank" rel="noreferrer"><img +alt="macabu" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/macabu.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">macabu</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>inamedparam</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/manuelarte" +target="_blank" rel="noreferrer"><img +alt="manuelarte" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/manuelarte.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">manuelarte</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>embeddedstructfieldcheck</code><br><code>funcorder</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/maratori" +target="_blank" rel="noreferrer"><img +alt="maratori" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/maratori.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">maratori</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>testableexamples</code><br><code>testpackage</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/matoous" +target="_blank" rel="noreferrer"><img +alt="matoous" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/matoous.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">matoous</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>godox</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mdempsky" +target="_blank" rel="noreferrer"><img +alt="mdempsky" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mdempsky.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mdempsky</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>unconvert</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mgechev" +target="_blank" rel="noreferrer"><img +alt="mgechev" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mgechev.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mgechev</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>revive</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mibk" +target="_blank" rel="noreferrer"><img +alt="mibk" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mibk.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mibk</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>dupl</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/MirrexOne" +target="_blank" rel="noreferrer"><img +alt="MirrexOne" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/MirrexOne.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">MirrexOne</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>unqueryvet</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/moricho" +target="_blank" rel="noreferrer"><img +alt="moricho" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/moricho.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">moricho</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>tparallel</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mvdan" +target="_blank" rel="noreferrer"><img +alt="mvdan" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mvdan.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mvdan</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gofumpt</code><br><code>unparam</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/nakabonne" +target="_blank" rel="noreferrer"><img +alt="nakabonne" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/nakabonne.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">nakabonne</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nestif</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/nishanths" +target="_blank" rel="noreferrer"><img +alt="nishanths" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/nishanths.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">nishanths</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>exhaustive</code><br><code>predeclared</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/nunnatsa" +target="_blank" rel="noreferrer"><img +alt="nunnatsa" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/nunnatsa.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">nunnatsa</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>ginkgolinter</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/polyfloyd" +target="_blank" rel="noreferrer"><img +alt="polyfloyd" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/polyfloyd.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">polyfloyd</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>errorlint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/raeperd" +target="_blank" rel="noreferrer"><img +alt="raeperd" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/raeperd.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">raeperd</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>recvcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ryancurrah" +target="_blank" rel="noreferrer"><img +alt="ryancurrah" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ryancurrah.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ryancurrah</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gomodguard</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ryanrolds" +target="_blank" rel="noreferrer"><img +alt="ryanrolds" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ryanrolds.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ryanrolds</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>sqlclosecheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sanposhiho" +target="_blank" rel="noreferrer"><img +alt="sanposhiho" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sanposhiho.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sanposhiho</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>wastedassign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sashamelentyev" +target="_blank" rel="noreferrer"><img +alt="sashamelentyev" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sashamelentyev.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sashamelentyev</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>interfacebloat</code><br><code>usestdlibvars</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/securego" +target="_blank" rel="noreferrer"><img +alt="securego" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/securego.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">securego</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gosec</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/segmentio" +target="_blank" rel="noreferrer"><img +alt="segmentio" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/segmentio.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">segmentio</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>golines</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sivchari" +target="_blank" rel="noreferrer"><img +alt="sivchari" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sivchari.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sivchari</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>containedctx</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sonatard" +target="_blank" rel="noreferrer"><img +alt="sonatard" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sonatard.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sonatard</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>noctx</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ssgreg" +target="_blank" rel="noreferrer"><img +alt="ssgreg" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ssgreg.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ssgreg</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nlreturn</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/stbenjam" +target="_blank" rel="noreferrer"><img +alt="stbenjam" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/stbenjam.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">stbenjam</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nosprintfhostport</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/swaggo" +target="_blank" rel="noreferrer"><img +alt="swaggo" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/swaggo.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">swaggo</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>swaggo</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tenntenn" +target="_blank" rel="noreferrer"><img +alt="tenntenn" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tenntenn.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tenntenn</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>forcetypeassert</code><br><code>nilerr</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tetafro" +target="_blank" rel="noreferrer"><img +alt="tetafro" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tetafro.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tetafro</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>godot</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/timakin" +target="_blank" rel="noreferrer"><img +alt="timakin" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/timakin.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">timakin</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>bodyclose</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/timonwong" +target="_blank" rel="noreferrer"><img +alt="timonwong" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/timonwong.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">timonwong</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>loggercheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tmzane" +target="_blank" rel="noreferrer"><img +alt="tmzane" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tmzane.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tmzane</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>musttag</code><br><code>sloglint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tomarrell" +target="_blank" rel="noreferrer"><img +alt="tomarrell" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tomarrell.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tomarrell</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>wrapcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tommy-muehle" +target="_blank" rel="noreferrer"><img +alt="tommy-muehle" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tommy-muehle.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tommy-muehle</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>mnd</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ultraware" +target="_blank" rel="noreferrer"><img +alt="ultraware" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ultraware.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ultraware</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>funlen</code><br><code>whitespace</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/uudashr" +target="_blank" rel="noreferrer"><img +alt="uudashr" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/uudashr.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">uudashr</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocognit</code><br><code>iface</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/xen0n" +target="_blank" rel="noreferrer"><img +alt="xen0n" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/xen0n.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">xen0n</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gosmopolitan</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/xobotyi" +target="_blank" rel="noreferrer"><img +alt="xobotyi" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/xobotyi.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">xobotyi</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>exhaustruct</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/yagipy" +target="_blank" rel="noreferrer"><img +alt="yagipy" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/yagipy.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">yagipy</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>maintidx</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/yeya24" +target="_blank" rel="noreferrer"><img +alt="yeya24" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/yeya24.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">yeya24</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>promlinter</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ykadowak" +target="_blank" rel="noreferrer"><img +alt="ykadowak" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ykadowak.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ykadowak</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>zerologlint</code></div></a> +</div> +<h3>Thanks to all contributors<span class="hx:absolute hx:-mt-20" id="thanks-to-all-contributors"></span> +<a href="#thanks-to-all-contributors" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/golangci/golangci-lint/graphs/contributors"target="_blank" rel="noopener"><img src="https://opencollective.com/golangci-lint/contributors.svg?width=890&amp;button=false&amp;skip=golangcidev,CLAassistant,renovate,fossabot,golangcibot,kortschak,golangci-releaser,dependabot%5Bbot%5D" alt="golangci-lint contributors" loading="lazy" /></a></p> +<h3>Special thanks<span class="hx:absolute hx:-mt-20" id="special-thanks"></span> +<a href="#special-thanks" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Thanks to <a href="https://github.com/alecthomas/gometalinter"target="_blank" rel="noopener">alecthomas/gometalinter</a> for inspiration and amazing work.</p> +<p>Thanks to <a href="https://github.com/bradleyfalzon/revgrep"target="_blank" rel="noopener">bradleyfalzon/revgrep</a> for cool diff tool.</p> +<p>The golangci-lint logo is inspired by the Go gopher designed by Renee French <a href="https://creativecommons.org/licenses/by/3.0/"target="_blank" rel="noopener">CC BY 3.0</a>.</p>Changeloghttps://golangci-lint.run/docs/product/changelog/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/changelog/ +<p>Follow the news and releases on <a href="https://fosstodon.org/@golangcilint"target="_blank" rel="noopener">Mastodon</a> and on <a href="https://bsky.app/profile/golangci-lint.run"target="_blank" rel="noopener">Bluesky</a>.</p> +<p><code>golangci-lint</code> is a free and open-source project built by volunteers.</p> +<p>If you value it, consider supporting us, we appreciate it!</p> +<div class="hx:mt-6 hx:mb-6"> +<a +href="https://golangci-lint.run/docs/donate" +class="not-prose hx:font-medium hx:cursor-pointer hx:px-6 hx:py-3 hx:rounded-full hx:text-center hx:text-white hx:inline-block hx:bg-primary-600 hx:hover:bg-primary-700 hx:focus:outline-hidden hx:focus:ring-4 hx:focus:ring-primary-300 hx:dark:bg-primary-600 hx:dark:hover:bg-primary-700 hx:dark:focus:ring-primary-800 hx:transition-all hx:ease-in hx:duration-200" +>Donate ❤️</a> +</div> +<h2>v2.5.0<span class="hx:absolute hx:-mt-20" id="v250"></span> +<a href="#v250" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li>Add <code>godoclint</code> linter <a href="https://github.com/godoc-lint/godoc-lint"target="_blank" rel="noopener">https://github.com/godoc-lint/godoc-lint</a></li> +<li>Add <code>unqueryvet</code> linter <a href="https://github.com/MirrexOne/unqueryvet"target="_blank" rel="noopener">https://github.com/MirrexOne/unqueryvet</a></li> +<li>Add <code>iotamixing</code> linter <a href="https://github.com/AdminBenni/iota-mixing"target="_blank" rel="noopener">https://github.com/AdminBenni/iota-mixing</a></li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>embeddedstructfieldcheck</code>: from 0.3.0 to 0.4.0 (new option: <code>empty-line</code>)</li> +<li><code>err113</code>: from aea10b59be24 to 0.1.1 (skip internals of <code>Is</code> methods for <code>error</code> type)</li> +<li><code>ginkgolinter</code>: from 0.20.0 to 0.21.0 (new option: <code>force-tonot</code>)</li> +<li><code>gofumpt</code>: from 0.8.0 to 0.9.1 (new rule is to &ldquo;clothe&rdquo; naked returns for the sake of clarity)</li> +<li><code>ineffassign</code>: from 0.1.0 to 0.2.0 (new option: <code>check-escaping-errors</code>)</li> +<li><code>musttag</code>: from 0.13.1 to 0.14.0 (support interface methods)</li> +<li><code>revive</code>: from 1.11.0 to 1.12.0 (new options: <code>identical-ifelseif-branches</code>, <code>identical-ifelseif-conditions</code>, <code>identical-switch-branches</code>, <code>identical-switch-conditions</code>, <code>package-directory-mismatch</code>, <code>unsecure-url-scheme</code>, <code>use-waitgroup-go</code>, <code>useless-fallthrough</code>)</li> +<li><code>thelper</code>: from 0.6.3 to 0.7.1 (skip <code>t.Helper</code> in functions passed to <code>synctest.Test</code>)</li> +<li><code>wsl</code>: from 5.1.1 to 5.2.0 (improvements related to subexpressions)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.4.1 to 0.5.0</li> +<li><code>errname</code>: from 1.1.0 to 1.1.1</li> +<li><code>fatcontext</code>: from 0.8.0 to 0.8.1</li> +<li><code>go-printf-func-name</code>: from 0.1.0 to 0.1.1</li> +<li><code>godot</code>: from 1.5.1 to 1.5.4</li> +<li><code>gosec</code>: from 2.22.7 to 2.22.8</li> +<li><code>nilerr</code>: from 0.1.1 to a temporary fork</li> +<li><code>nilnil</code>: from 1.1.0 to 1.1.1</li> +<li><code>protogetter</code>: from 0.3.15 to 0.3.16</li> +<li><code>tagliatelle</code>: from 0.7.1 to 0.7.2</li> +<li><code>testifylint</code>: from 1.6.1 to 1.6.4</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: &ldquo;no export data&rdquo; errors are now handled as a standard typecheck error</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve nolint section about syntax</li> +</ul> +</li> +</ol> +<h2>v2.4.0<span class="hx:absolute hx:-mt-20" id="v240"></span> +<a href="#v240" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>🎉 go1.25 support</li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>exhaustruct</code>: from v3.3.1 to 4.0.0 (new options: <code>allow-empty</code>, <code>allow-empty-rx</code>, <code>allow-empty-returns</code>, <code>allow-empty-declarations</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>godox</code>: trim filepath from report messages</li> +<li><code>staticcheck</code>: allow empty options</li> +<li><code>tagalign</code>: from 1.4.2 to 1.4.3</li> +</ul> +</li> +<li>Documentation +<ul> +<li>🌟 New website (with a search engine)</li> +</ul> +</li> +</ol> +<h2>v2.3.1<span class="hx:absolute hx:-mt-20" id="v231"></span> +<a href="#v231" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gci</code>: from 0.13.6 to 0.13.7</li> +<li><code>gosec</code>: from 2.22.6 to 2.22.7</li> +<li><code>noctx</code>: from 0.3.5 to 0.4.0</li> +<li><code>wsl</code>: from 5.1.0 to 5.1.1</li> +<li>tagliatelle: force upper case for custom initialisms</li> +</ul> +</li> +</ol> +<h2>v2.3.0<span class="hx:absolute hx:-mt-20" id="v230"></span> +<a href="#v230" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters new features or changes +<ul> +<li><code>ginkgolinter</code>: from 0.19.1 to 0.20.0 (new option: <code>force-assertion-description</code>)</li> +<li><code>iface</code>: from 1.4.0 to 1.4.1 (report message improvements)</li> +<li><code>noctx</code>: from 0.3.4 to 0.3.5 (new detections: <code>log/slog</code>, <code>exec</code>, <code>crypto/tls</code>)</li> +<li><code>revive</code>: from 1.10.0 to 1.11.0 (new rule: <code>enforce-switch-style</code>)</li> +<li><code>wsl</code>: from 5.0.0 to 5.1.0</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>gosec</code>: from 2.22.5 to 2.22.6</li> +<li><code>noinlineerr</code>: from 1.0.4 to 1.0.5</li> +<li><code>sloglint</code>: from 0.11.0 to 0.11.1</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: panic close of closed channel</li> +</ul> +</li> +</ol> +<h2>v2.2.2<span class="hx:absolute hx:-mt-20" id="v222"></span> +<a href="#v222" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>noinlineerr</code>: from 1.0.3 to 1.0.4</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve debug keys documentation</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: panic close of closed channel</li> +<li>godot: add noinline value into the JSONSchema</li> +</ul> +</li> +</ol> +<h2>v2.2.1<span class="hx:absolute hx:-mt-20" id="v221"></span> +<a href="#v221" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes</li> +</ol> +<ul> +<li><code>varnamelen</code>: fix configuration</li> +</ul> +<h2>v2.2.0<span class="hx:absolute hx:-mt-20" id="v220"></span> +<a href="#v220" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li>Add <code>arangolint</code> linter <a href="https://github.com/Crocmagnon/arangolint"target="_blank" rel="noopener">https://github.com/Crocmagnon/arangolint</a></li> +<li>Add <code>embeddedstructfieldcheck</code> linter <a href="https://github.com/manuelarte/embeddedstructfieldcheck"target="_blank" rel="noopener">https://github.com/manuelarte/embeddedstructfieldcheck</a></li> +<li>Add <code>noinlineerr</code> linter <a href="https://github.com/AlwxSin/noinlineerr"target="_blank" rel="noopener">https://github.com/AlwxSin/noinlineerr</a></li> +<li>Add <code>swaggo</code> formatter <a href="https://github.com/golangci/swaggoswag"target="_blank" rel="noopener">https://github.com/golangci/swaggoswag</a></li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>errcheck</code>: add <code>verbose</code> option</li> +<li><code>funcorder</code>: from 0.2.1 to 0.5.0 (new option <code>alphabetical</code>)</li> +<li><code>gomoddirectives</code>: from 0.6.1 to 0.7.0 (new option <code>ignore-forbidden</code>)</li> +<li><code>iface</code>: from 1.3.1 to 1.4.0 (new option <code>unexported</code>)</li> +<li><code>noctx</code>: from 0.1.0 to 0.3.3 (new report messages, and new rules related to <code>database/sql</code>)</li> +<li><code>noctx</code>: from 0.3.3 to 0.3.4 (new SQL functions detection)</li> +<li><code>revive</code>: from 1.9.0 to 1.10.0 (new rules: <code>time-date</code>, <code>unnecessary-format</code>, <code>use-fmt-print</code>)</li> +<li><code>usestdlibvars</code>: from 1.28.0 to 1.29.0 (new option <code>time-date-month</code>)</li> +<li><code>wsl</code>: deprecation</li> +<li><code>wsl_v5</code>: from 4.7.0 to 5.0.0 (major version with new configuration)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>dupword</code>: from 0.1.3 to 0.1.6</li> +<li><code>exptostd</code>: from 0.4.3 to 0.4.4</li> +<li><code>forbidigo</code>: from 1.6.0 to 2.1.0</li> +<li><code>gci</code>: consistently format the code</li> +<li><code>go-spancheck</code>: from 0.6.4 to 0.6.5</li> +<li><code>goconst</code>: from 1.8.1 to 1.8.2</li> +<li><code>gosec</code>: from 2.22.3 to 2.22.4</li> +<li><code>gosec</code>: from 2.22.4 to 2.22.5</li> +<li><code>makezero</code>: from 1.2.0 to 2.0.1</li> +<li><code>misspell</code>: from 0.6.0 to 0.7.0</li> +<li><code>usetesting</code>: from 0.4.3 to 0.5.0</li> +</ul> +</li> +<li>Misc. +<ul> +<li>exclusions: fix <code>path-expect</code></li> +<li>formatters: write the input to <code>stdout</code> when using <code>stdin</code> and there are no changes</li> +<li>migration: improve the error message when trying to migrate a migrated config</li> +<li><code>typecheck</code>: deduplicate errors</li> +<li><code>typecheck</code>: stops the analysis after the first error</li> +<li>Deprecate <code>print-resources-usage</code> flag</li> +<li>Unique version per custom build</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improves typecheck FAQ</li> +<li>Adds plugin systems recommendations</li> +<li>Add description for <code>linters.default</code> sets</li> +</ul> +</li> +</ol> +<h2>v2.1.6<span class="hx:absolute hx:-mt-20" id="v216"></span> +<a href="#v216" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>godot</code>: from 1.5.0 to 1.5.1</li> +<li><code>musttag</code>: from 0.13.0 to 0.13.1</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add note about golangci-lint v2 integration in VS Code</li> +</ul> +</li> +</ol> +<h2>v2.1.5<span class="hx:absolute hx:-mt-20" id="v215"></span> +<a href="#v215" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Due to an error related to Snapcraft, some artifacts of the v2.1.4 release have not been published.</p> +<p>This release contains the same things as v2.1.3.</p> +<h2>v2.1.4<span class="hx:absolute hx:-mt-20" id="v214"></span> +<a href="#v214" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Due to an error related to Snapcraft, some artifacts of the v2.1.3 release have not been published.</p> +<p>This release contains the same things as v2.1.3.</p> +<h2>v2.1.3<span class="hx:absolute hx:-mt-20" id="v213"></span> +<a href="#v213" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>fatcontext</code>: from 0.7.2 to 0.8.0</li> +</ul> +</li> +<li>Misc. +<ul> +<li>migration: fix <code>nakedret.max-func-lines: 0</code></li> +<li>migration: fix order of <code>staticcheck</code> settings</li> +<li>fix: add <code>go.mod</code> hash to the cache salt</li> +<li>fix: use diagnostic position for related information position</li> +</ul> +</li> +</ol> +<h2>v2.1.2<span class="hx:absolute hx:-mt-20" id="v212"></span> +<a href="#v212" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>exptostd</code>: from 0.4.2 to 0.4.3</li> +<li><code>gofumpt</code>: from 0.7.0 to 0.8.0</li> +<li><code>protogetter</code>: from 0.3.13 to 0.3.15</li> +<li><code>usetesting</code>: from 0.4.2 to 0.4.3</li> +</ul> +</li> +</ol> +<h2>v2.1.1<span class="hx:absolute hx:-mt-20" id="v211"></span> +<a href="#v211" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The release process of v2.1.0 failed due to a regression inside goreleaser.</p> +<p>The binaries of v2.1.0 have been published, but not the other artifacts (AUR, Docker, etc.).</p> +<h2>v2.1.0<span class="hx:absolute hx:-mt-20" id="v210"></span> +<a href="#v210" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add an option to display absolute paths (<code>--path-mode=abs</code>)</li> +<li>Add configuration path placeholder (<code>${config-path}</code>)</li> +<li>Add <code>warn-unused</code> option for <code>fmt</code> command</li> +<li>Colored diff for <code>fmt</code> command (<code>golangci-lint fmt --diff-colored</code>)</li> +</ul> +</li> +<li>New linters +<ul> +<li>Add <code>funcorder</code> linter <a href="https://github.com/manuelarte/funcorder"target="_blank" rel="noopener">https://github.com/manuelarte/funcorder</a></li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>go-errorlint</code>: from 1.7.1 to 1.8.0 (automatic error comparison and type assertion fixes)</li> +<li>⚠️ <code>goconst</code>: <code>ignore-strings</code> is deprecated and replaced by <code>ignore-string-values</code></li> +<li><code>goconst</code>: from 1.7.1 to 1.8.1 (new options: <code>find-duplicates</code>, <code>eval-const-expressions</code>)</li> +<li><code>govet</code>: add <code>httpmux</code> analyzer</li> +<li><code>nilnesserr</code>: from 0.1.2 to 0.2.0 (detect more cases)</li> +<li><code>paralleltest</code>: from 1.0.10 to 1.0.14 (checks only <code>_test.go</code> files)</li> +<li><code>revive</code>: from 1.7.0 to 1.9.0 (support kebab case for setting names)</li> +<li><code>sloglint</code>: from 0.9.0 to 0.11.0 (autofix, new option <code>msg-style</code>, suggest <code>slog.DiscardHandler</code>)</li> +<li><code>wrapcheck</code>: from 2.10.0 to 2.11.0 (new option <code>report-internal-errors</code>)</li> +<li><code>wsl</code>: from 4.6.0 to 4.7.0 (cgo files are always excluded)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>fatcontext</code>: from 0.7.1 to 0.7.2</li> +<li><code>gocritic</code>: fix <code>importshadow</code> checker</li> +<li><code>gosec</code>: from 2.22.2 to 2.22.3</li> +<li><code>ireturn</code>: from 0.3.1 to 0.4.0</li> +<li><code>loggercheck</code>: from 0.10.1 to 0.11.0</li> +<li><code>nakedret</code>: from 2.0.5 to 2.0.6</li> +<li><code>nonamedreturns</code>: from 1.0.5 to 1.0.6</li> +<li><code>protogetter</code>: from 0.3.12 to 0.3.13</li> +<li><code>testifylint</code>: from 1.6.0 to 1.6.1</li> +<li><code>unconvert</code>: update to HEAD</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Fixes memory leaks when using go1.(N) with golangci-lint built with go1.(N-X)</li> +<li>Adds <code>golangci-lint-fmt</code> pre-commit hook</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improvements</li> +<li>Updates section about vscode integration</li> +</ul> +</li> +</ol> +<h2>v2.0.2<span class="hx:absolute hx:-mt-20" id="v202"></span> +<a href="#v202" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Misc. +<ul> +<li>Fixes flags parsing for formatters</li> +<li>Fixes the filepath used by the exclusion <code>source</code> option</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Adds a section about flags migration</li> +<li>Cleaning pages with v1 options</li> +</ul> +</li> +</ol> +<h2>v2.0.1<span class="hx:absolute hx:-mt-20" id="v201"></span> +<a href="#v201" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters/formatters bug fixes +<ul> +<li><code>golines</code>: fix settings during linter load</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Validates the <code>version</code> field before the configuration</li> +<li><code>forbidigo</code>: fix migration</li> +</ul> +</li> +</ol> +<h2>v2.0.0<span class="hx:absolute hx:-mt-20" id="v200"></span> +<a href="#v200" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>🌟 New <code>golangci-lint fmt</code> command with dedicated <a href="https://golangci-lint.run/docs/welcome/quick-start/#formatting"target="_blank" rel="noopener">formatter configuration</a></li> +<li>♻️ New <code>golangci-lint migrate</code> command to help migration from v1 to v2 (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#command-migrate"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>⚠️ New default values (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>⚠️ No exclusions by default (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#issuesexclude-use-default"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>⚠️ New default sort order (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#outputsort-order"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New option <code>run.relative-path-mode</code> (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#runrelative-path-mode"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New linters configuration (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#linters"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New output format configuration (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#output"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New <code>--fast-only</code> flag (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#lintersfast"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New option <code>linters.exclusions.warn-unused</code> to log a warning if an exclusion rule is unused.</li> +</ul> +</li> +<li>New linters/formatters +<ul> +<li>Add <code>golines</code> formatter <a href="https://github.com/segmentio/golines"target="_blank" rel="noopener">https://github.com/segmentio/golines</a></li> +</ul> +</li> +<li>Linters new features +<ul> +<li>⚠️ Merge <code>staticcheck</code>, <code>stylecheck</code>, <code>gosimple</code> into one linter (<code>staticcheck</code>) (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#lintersenablestylecheckgosimplestaticcheck"target="_blank" rel="noopener">Migration guide</a>)</li> +<li><code>go-critic</code>: from 0.12.0 to 0.13.0</li> +<li><code>gomodguard</code>: from 1.3.5 to 1.4.1 (block explicit indirect dependencies)</li> +<li><code>nilnil</code>: from 1.0.1 to 1.1.0 (new option: <code>only-two</code>)</li> +<li><code>perfsprint</code>: from 0.8.2 to 0.9.1 (checker name in the diagnostic message)</li> +<li><code>staticcheck</code>: new <code>quickfix</code> set of rules</li> +<li><code>testifylint</code>: from 1.5.2 to 1.6.0 (new options: <code>equal-values</code>, <code>suite-method-signature</code>, <code>require-string-msg</code>)</li> +<li><code>wsl</code>: from 4.5.0 to 4.6.0 (new option: <code>allow-cuddle-used-in-block</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>bidichk</code>: from 0.3.2 to 0.3.3</li> +<li><code>errchkjson</code>: from 0.4.0 to 0.4.1</li> +<li><code>errname</code>: from 1.0.0 to 1.1.0</li> +<li><code>funlen</code>: fix <code>ignore-comments</code> option</li> +<li><code>gci</code>: from 0.13.5 to 0.13.6</li> +<li><code>gosmopolitan</code>: from 1.2.2 to 1.3.0</li> +<li><code>inamedparam</code>: from 0.1.3 to 0.2.0</li> +<li><code>intrange</code>: from 0.3.0 to 0.3.1</li> +<li><code>protogetter</code>: from 0.3.9 to 0.3.12</li> +<li><code>unparam</code>: from 8a5130ca722f to 0df0534333a4</li> +</ul> +</li> +<li>Misc. +<ul> +<li>🧹 Configuration options renaming (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove options (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove flags (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove alternative names (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#alternative-linter-names"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove or replace deprecated elements (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>Adds an option to display some commands as JSON: +<ul> +<li><code>golangci-lint config path --json</code></li> +<li><code>golangci-lint help linters --json</code></li> +<li><code>golangci-lint help formatters --json</code></li> +<li><code>golangci-lint linters --json</code></li> +<li><code>golangci-lint formatters --json</code></li> +<li><code>golangci-lint version --json</code></li> +</ul> +</li> +</ul> +</li> +<li>Documentation +<ul> +<li><a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a></li> +</ul> +</li> +</ol> +<h2>v1.64.8<span class="hx:absolute hx:-mt-20" id="v1648"></span> +<a href="#v1648" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul> +<li>Detects use of configuration files from golangci-lint v2</li> +</ul> +<h2>v1.64.7<span class="hx:absolute hx:-mt-20" id="v1647"></span> +<a href="#v1647" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>depguard</code>: from 2.2.0 to 2.2.1</li> +<li><code>dupl</code>: from 3e9179ac440a to f665c8d69b32</li> +<li><code>gosec</code>: from 2.22.1 to 2.22.2</li> +<li><code>staticcheck</code>: from 0.6.0 to 0.6.1</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add GitLab documentation</li> +</ul> +</li> +</ol> +<h2>v1.64.6<span class="hx:absolute hx:-mt-20" id="v1646"></span> +<a href="#v1646" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.4.0 to 0.4.1</li> +<li><code>contextcheck</code>: from 1.1.5 to 1.1.6</li> +<li><code>errcheck</code>: from 1.8.0 to 1.9.0</li> +<li><code>exptostd</code>: from 0.4.1 to 0.4.2</li> +<li><code>ginkgolinter</code>: from 0.19.0 to 0.19.1</li> +<li><code>go-exhaustruct</code>: from 3.3.0 to 3.3.1</li> +<li><code>gocheckcompilerdirectives</code>: from 1.2.1 to 1.3.0</li> +<li><code>godot</code>: from 1.4.20 to 1.5.0</li> +<li><code>perfsprint</code>: from 0.8.1 to 0.8.2</li> +<li><code>revive</code>: from 1.6.1 to 1.7.0</li> +<li><code>tagalign</code>: from 1.4.1 to 1.4.2</li> +</ul> +</li> +</ol> +<h2>v1.64.5<span class="hx:absolute hx:-mt-20" id="v1645"></span> +<a href="#v1645" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Bug fixes +<ul> +<li>Add missing flag <code>new-from-merge-base-flag</code></li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.3.0 to 0.4.0</li> +<li><code>forcetypeassert</code>: from 0.1.0 to 0.2.0</li> +<li><code>gosec</code>: from 2.22.0 to 2.22.1</li> +</ul> +</li> +</ol> +<h2>v1.64.4<span class="hx:absolute hx:-mt-20" id="v1644"></span> +<a href="#v1644" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gci</code>: fix standard packages list for go1.24</li> +</ul> +</li> +</ol> +<h2>v1.64.3<span class="hx:absolute hx:-mt-20" id="v1643"></span> +<a href="#v1643" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>ginkgolinter</code>: from 0.18.4 to 0.19.0</li> +<li><code>go-critic</code>: from 0.11.5 to 0.12.0</li> +<li><code>revive</code>: from 1.6.0 to 1.6.1</li> +<li><code>gci</code>: fix standard packages list for go1.24</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Build Docker images with go1.24</li> +</ul> +</li> +</ol> +<h2>v1.64.2<span class="hx:absolute hx:-mt-20" id="v1642"></span> +<a href="#v1642" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is the last minor release of golangci-lint v1. +The next release will be golangci-lint <a href="https://github.com/golangci/golangci-lint/issues/5300"target="_blank" rel="noopener">v2</a>.</p> +<ol> +<li>Enhancements +<ul> +<li>🎉 go1.24 support</li> +<li>New <code>issues.new-from-merge-base</code> option</li> +<li>New <code>run.relative-path-mode</code> option</li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>copyloopvar</code>: from 1.1.0 to 1.2.1 (support suggested fixes)</li> +<li><code>exptostd</code>: from 0.3.1 to 0.4.1 (handles <code>golang.org/x/exp/constraints.Ordered</code>)</li> +<li><code>fatcontext</code>: from 0.5.3 to 0.7.1 (new option: <code>check-struct-pointers</code>)</li> +<li><code>perfsprint</code>: from 0.7.1 to 0.8.1 (new options: <code>integer-format</code>, <code>error-format</code>, <code>string-format</code>, <code>bool-format</code>, and <code>hex-format</code>)</li> +<li><code>revive</code>: from 1.5.1 to 1.6.0 (new rules: <code>redundant-build-tag</code>, <code>use-errors-new</code>. New option <code>early-return.early-return</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>go-errorlint</code>: from 1.7.0 to 1.7.1</li> +<li><code>gochecknoglobals</code>: from 0.2.1 to 0.2.2</li> +<li><code>godox</code>: from 006bad1f9d26 to 1.1.0</li> +<li><code>gosec</code>: from 2.21.4 to 2.22.0</li> +<li><code>iface</code>: from 1.3.0 to 1.3.1</li> +<li><code>nilnesserr</code>: from 0.1.1 to 0.1.2</li> +<li><code>protogetter</code>: from 0.3.8 to 0.3.9</li> +<li><code>sloglint</code>: from 0.7.2 to 0.9.0</li> +<li><code>spancheck</code>: fix default <code>StartSpanMatchersSlice</code> values</li> +<li><code>staticcheck</code>: from 0.5.1 to 0.6.0</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>tenv</code> is deprecated and replaced by <code>usetesting.os-setenv: true</code>.</li> +<li>⚠️ <code>exportloopref</code> deprecation step 2</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Sanitize severities by output format</li> +<li>Avoid panic with plugin without description</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Clarify <code>depguard</code> configuration</li> +</ul> +</li> +</ol> +<h2>v1.64.1<span class="hx:absolute hx:-mt-20" id="v1641"></span> +<a href="#v1641" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to CI failure.</p> +<h2>v1.64.0<span class="hx:absolute hx:-mt-20" id="v1640"></span> +<a href="#v1640" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to CI failure.</p> +<h2>v1.63.4<span class="hx:absolute hx:-mt-20" id="v1634"></span> +<a href="#v1634" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>dupl</code>, <code>gomodguard</code>, <code>revive</code>: keep only Go-files.</li> +</ul> +</li> +</ol> +<h2>v1.63.3<span class="hx:absolute hx:-mt-20" id="v1633"></span> +<a href="#v1633" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gofmt</code>, <code>gofumpt</code>, <code>goimports</code>, <code>gci</code>: panic with several trailing EOL</li> +<li><code>goheader</code>: skip issues with invalid positions</li> +</ul> +</li> +</ol> +<h2>v1.63.2<span class="hx:absolute hx:-mt-20" id="v1632"></span> +<a href="#v1632" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gofmt</code>, <code>gofumpt</code>, <code>goimports</code>, <code>gci</code>: panic with missing trailing EOL</li> +</ul> +</li> +</ol> +<h2>v1.63.1<span class="hx:absolute hx:-mt-20" id="v1631"></span> +<a href="#v1631" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>cgi</code>: invalid reports with cgo</li> +<li><code>gofumpt</code>: panic with autofix and cgo</li> +</ul> +</li> +</ol> +<h2>v1.63.0<span class="hx:absolute hx:-mt-20" id="v1630"></span> +<a href="#v1630" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add support for SuggestedFixes 🎉 (35 linters can &ldquo;autofix&rdquo; reports).</li> +<li>Formatters (<code>gofmt</code>, <code>goimports</code>, <code>gofumpt</code>, <code>gci</code>) are applied after the suggested fixes.</li> +</ul> +</li> +<li>New linters +<ul> +<li>Add <code>exptostd</code> linter <a href="https://github.com/ldez/exptostd"target="_blank" rel="noopener">https://github.com/ldez/exptostd</a></li> +<li>Add <code>nilnesserr</code> linter <a href="https://github.com/alingse/nilnesserr"target="_blank" rel="noopener">https://github.com/alingse/nilnesserr</a></li> +<li>Add <code>usetesting</code> linter <a href="https://github.com/ldez/usetesting"target="_blank" rel="noopener">https://github.com/ldez/usetesting</a></li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>gci</code>: new options: <code>no-inline-comments</code>, <code>no-prefix-comments</code></li> +<li><code>gomoddirectives</code>: from 0.2.4 to 0.6.0 (new options: <code>go-version-pattern</code>, <code>toolchain-pattern</code>,<code>toolchain-forbidden</code>, <code>tool-forbidden</code>, <code>go-debug-forbidden</code>)</li> +<li><code>govet</code>: new <code>stdversion</code>, <code>waitgroup</code> analyzers</li> +<li><code>importas</code>: allow multiple empty aliases</li> +<li><code>loggercheck</code>: new <code>slog</code> option</li> +<li><code>recvcheck</code>: from 0.1.2 to 0.2.0 (new options: <code>disable-builtin</code>, <code>exclusions</code>)</li> +<li><code>tagliatelle</code>: from 0.5.0 to 0.7.1 (new options: <code>ignored-fields</code>, <code>extended-rules</code>,<code>overrides</code>, <code>pkg</code>, <code>ignore</code>)</li> +<li><code>usestdlibvars</code>: from 1.27.0 to 1.28.0 (autofix)</li> +<li><code>wrapcheck</code>: from 2.9.0 to 2.10.0 (new option: <code>extra-ignore-sigs</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.2.0 to 0.3.0</li> +<li><code>bodyclose</code>: from 574207250966 to ed6a65f985e</li> +<li><code>funlen</code>: from 0.1.0 to 0.2.0</li> +<li><code>ginkgolinter</code>: from 0.18.3 to 0.18.4</li> +<li><code>gochecksumtype</code>: from 0.2.0 to 0.3.1</li> +<li><code>gocognit</code>: from 1.1.3 to 1.2.0</li> +<li><code>godot</code>: from 1.4.18 to 1.4.20</li> +<li><code>goheader</code>: report position improvement</li> +<li><code>gosec</code>: handling of global nosec option when it is false</li> +<li><code>iface</code>: from 1.2.1 to 1.3.0</li> +<li><code>importas</code>: from 0.1.0 to 0.2.0</li> +<li><code>intrange</code>: from 0.2.1 to 0.3.0</li> +<li><code>makezero</code>: from 1.1.1 to 1.2.0</li> +<li><code>mirror</code>: from 1.2.0 to 1.3.0</li> +<li><code>nilnil</code>: from 1.0.0 to 1.0.1</li> +<li><code>nosprintfhostport</code>: from 0.1.1 to 0.2.0</li> +<li><code>reassign</code>: from 0.2.0 to 0.3.0</li> +<li><code>spancheck</code>: from 0.6.2 to 0.6.4</li> +<li><code>tagalign</code>: from 1.3.4 to 1.4.1</li> +<li><code>wastedassign</code>: from 2.0.7 to 2.1.0</li> +<li><code>whitespace</code>: from 0.1.1 to 0.2.0</li> +<li><code>wsl</code>: from 4.4.1 to 4.5.0</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>output.uniq-by-line</code> is deprecated and replaced by <code>issues.uniq-by-line</code>.</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Improvements of the help command (color and JSON support).</li> +<li>Removes <code>decoder</code>, <code>sloglint</code>, <code>tagalign</code> from <code>format</code> preset.</li> +<li>Enables paths with junction inside Windows.</li> +<li>The timeout is disabled if <code>run.timeout</code> &lt;= 0.</li> +</ul> +</li> +</ol> +<h2>v1.62.2<span class="hx:absolute hx:-mt-20" id="v1622"></span> +<a href="#v1622" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>fatcontext</code>: from 0.5.2 to 0.5.3</li> +<li><code>ginkgolinter</code>: from 0.18.0 to 0.18.3</li> +<li><code>errorlint</code>: from 1.6.0 to 1.7.0</li> +<li><code>iface</code>: from 1.2.0 to 1.2.1</li> +<li><code>revive</code>: from 1.5.0 to 1.5.1</li> +<li><code>testifylint</code>: from 1.5.0 to 1.5.2</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: ignore cache error when file not found</li> +</ul> +</li> +</ol> +<h2>v1.62.1<span class="hx:absolute hx:-mt-20" id="v1621"></span> +<a href="#v1621" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to CI failure.</p> +<h2>v1.62.0<span class="hx:absolute hx:-mt-20" id="v1620"></span> +<a href="#v1620" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li>Add <code>recvcheck</code> linter <a href="https://github.com/raeperd/recvcheck"target="_blank" rel="noopener">https://github.com/raeperd/recvcheck</a></li> +<li>Add <code>iface</code> linter <a href="https://github.com/uudashr/iface"target="_blank" rel="noopener">https://github.com/uudashr/iface</a></li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>ginkgolinter</code>: from 0.17.0 to 0.18.0 (new option: <code>force-succeed</code>)</li> +<li><code>gochecksumtype</code>: from 0.1.4 to 0.2.0 (new option: <code>default-signifies-exhaustive</code>)</li> +<li><code>loggercheck</code>: from 0.9.4 to 0.10.1 (<code>log/slog</code> support)</li> +<li><code>nilnil</code>: from 0.1.9 to 1.0.0 (new option: <code>detect-opposite</code>)</li> +<li><code>revive</code>: from 1.3.9 to 1.5.0 (new rules: <code>filename-format</code>, and <code>file-length-limit</code>)</li> +<li><code>tenv</code>: from 1.10.0 to 1.12.1 (handle dot import)</li> +<li><code>testifylint</code>: from 1.4.3 to 1.5.0 (new checkers: <code>contains</code>, <code>encoded-compare</code>, <code>regexp</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>bidichk</code>: from 0.2.7 to 0.3.2 (important performance improvement)</li> +<li><code>canonicalheader</code>: from 1.1.1 to 1.1.2</li> +<li><code>cyclop</code>: from 1.2.1 to 1.2.3</li> +<li><code>dupword</code>: from 0.1.1 to 0.1.3</li> +<li><code>errcheck</code>: from 1.7.0 to 1.8.0</li> +<li><code>errchkjson</code>: from 0.3.6 to 0.4.0</li> +<li><code>errname</code>: from 0.1.13 to 1.0.0</li> +<li><code>gocritic</code>: from 0.11.4 to 0.11.5</li> +<li><code>goprintffuncname</code>: from 7558a9eaa5af to v0.1.0</li> +<li><code>godot</code>: from 1.4.17 to 1.4.18</li> +<li><code>gosec</code>: from 2.21.2 to 2.21.4</li> +<li><code>intrange</code>: from 0.2.0 to 0.2.1</li> +<li><code>musttag</code>: from 0.12.2 to 0.13.0</li> +<li><code>nakedret</code>: from 2.0.4 to 2.0.5</li> +<li><code>noctx</code>: from 0.0.2 to 0.1.0</li> +<li><code>protogetter</code>: from 0.3.6 to 0.3.8</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>execinquery</code>: deprecation step 2</li> +<li>⚠️ <code>gomnd</code>: deprecation step 2 (replaced by <code>mnd</code>)</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Type sizing when cross-compiling (32-bit).</li> +<li>code-climate: add check_name field</li> +<li>Improve Go version detection</li> +<li>Fix Go version propagation</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Adds a section about <code>exclude-dirs-use-default</code></li> +<li>Improve &lsquo;install from sources&rsquo; section</li> +<li>Improve FAQ about Go versions</li> +<li>Improve linter/rule/check docs</li> +<li>Improve new linter section</li> +<li>Improve <code>forbidigo</code> pattern examples for built-in functions</li> +</ul> +</li> +</ol> +<h2>v1.61.0<span class="hx:absolute hx:-mt-20" id="v1610"></span> +<a href="#v1610" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add <code>junit-xml-extended</code> format</li> +<li>Exclude Swagger Codegen files by default</li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>gci</code>: from 0.13.4 to 0.13.5 (new option <code>no-lex-order</code>)</li> +<li><code>nolintlint</code>: remove the empty line in the directive replacement</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>dupword</code>: from 0.0.14 to 0.1.1</li> +<li><code>fatcontext</code>: from 0.4.0 to 0.5.2</li> +<li><code>go-ruleguard</code>: from 0.4.2 to 0fe6f58b47b1 (fix panic with custom linters)</li> +<li><code>godot</code>: from 1.4.16 to 1.4.17</li> +<li><code>gomodguard</code>: from 1.3.3 to 1.3.5</li> +<li><code>gosec</code>: disable temporarily <code>G407</code></li> +<li><code>gosec</code>: from ab3f6c1c83a0 to 2.21.2 (partially fix <code>G115</code>)</li> +<li><code>intrange</code>: from 0.1.2 to 0.2.0</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Improve runtime version parsing</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add additional info about <code>typecheck</code></li> +</ul> +</li> +</ol> +<h2>v1.60.3<span class="hx:absolute hx:-mt-20" id="v1603"></span> +<a href="#v1603" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>gosec</code>: from 81cda2f91fbe to ab3f6c1c83a0 (fix <code>G115</code> false positives)</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Check that the Go version use to build is greater or equals to the Go version of the project</li> +</ul> +</li> +</ol> +<h2>v1.60.2<span class="hx:absolute hx:-mt-20" id="v1602"></span> +<a href="#v1602" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters new features +<ul> +<li><code>gosec</code>: from 5f0084eb01a9 to 81cda2f91fbe (adds <code>G115</code>, <code>G405</code>, <code>G406</code>, <code>G506</code>, <code>G507</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>gofmt</code>: update to HEAD (go1.22)</li> +<li><code>gofumpt</code>: from 0.6.0 to 0.7.0</li> +<li><code>gosec</code>: fix G602 analyzer</li> +<li><code>staticcheck</code>: from 0.5.0 to 0.5.1</li> +<li><code>staticcheck</code>: propagate Go version</li> +<li><code>wrapcheck</code>: from 2.8.3 to 2.9.0</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>exportloopref</code>: deprecation</li> +</ul> +</li> +</ol> +<h2>v1.60.1<span class="hx:absolute hx:-mt-20" id="v1601"></span> +<a href="#v1601" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Misc. +<ul> +<li>🎉 go1.23 support</li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>exhaustruct</code>: from 3.2.0 to 3.3.0 (recognize custom error values in return)</li> +<li><code>govet</code> (<code>printf</code>): report non-constant format, no args</li> +<li><code>lll</code>: advertise max line length instead of just reporting failure</li> +<li><code>revive</code>: from 1.3.7 to 1.3.9 (new rule: <code>comments-density</code>)</li> +<li><code>staticcheck</code>: from 0.4.7 to 0.5.0</li> +<li><code>testifylint</code>: from 1.3.1 to 1.4.3 (new options: <code>formatter</code>, <code>suite-broken-parallel</code>, <code>suite-subtest-run</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>errorlint</code>: from 1.5.2 to 1.6.0</li> +<li><code>fatcontext</code>: from 0.2.2 to 0.4.0 (fix false positives for context stored in structs)</li> +<li><code>gocognit</code>: from 1.1.2 to 1.1.3</li> +<li><code>gomodguard</code>: from 1.3.2 to 1.3.3</li> +<li><code>sloglint</code>: from 0.7.1 to 0.7.2</li> +<li><code>spancheck</code>: from 0.6.1 to 0.6.2</li> +<li><code>tenv</code>: from 1.7.1 to 1.10.0 (remove reports on fuzzing)</li> +<li><code>tparallel</code>: from 0.3.1 to 0.3.2</li> +<li><code>usestdlibvars</code>: from 1.26.0 to 1.27.0 (fix false-positive with number used inside a mathematical operations)</li> +<li><code>wsl</code>: from 4.2.1 to 4.4.1</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>️⚠️ <code>unused</code>: remove <code>exported-is-used</code> option</li> +</ul> +</li> +<li>Fixes +<ul> +<li>SARIF: sanitize level property</li> +<li>️⚠️ <code>typecheck</code> issues should never be ignored</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add link on linter without configuration</li> +<li>Remove &rsquo;trusted by&rsquo; page</li> +<li><code>wsl</code> update documentation of the configuration</li> +</ul> +</li> +</ol> +<h2>v1.60.0<span class="hx:absolute hx:-mt-20" id="v1600"></span> +<a href="#v1600" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to a CI problem.</p> +<h2>v1.59.1<span class="hx:absolute hx:-mt-20" id="v1591"></span> +<a href="#v1591" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>errorlint</code>: from 1.5.1 to 1.5.2</li> +<li><code>gomnd</code>: deprecated configuration compatibility</li> +<li><code>intrange</code>: add <code>style</code> preset</li> +<li><code>misspell</code>: from 0.5.1 to 0.6.0</li> +<li><code>sloglint</code>: from 0.7.0 to 0.7.1</li> +<li><code>testifylint</code>: from 1.3.0 to 1.3.1</li> +<li><code>unparam</code>: bump to HEAD</li> +<li><code>usestdlibvars</code>: from 1.25.0 to 1.26.0</li> +</ul> +</li> +<li>Fixes +<ul> +<li>SARIF: init empty result slice</li> +<li>SARIF: issue column &gt;= 1</li> +</ul> +</li> +<li>Documentation +<ul> +<li><code>revive</code>: update documentation of the configuration</li> +</ul> +</li> +</ol> +<h2>v1.59.0<span class="hx:absolute hx:-mt-20" id="v1590"></span> +<a href="#v1590" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add SARIF output format</li> +<li>Allow the analysis of generated files (<code>issues.exclude-generated: disable</code>)</li> +</ul> +</li> +<li>Updated linters +<ul> +<li><code>errcheck</code>: fix deprecation warning</li> +<li><code>gocritic</code>: from 0.11.3 to 0.11.4</li> +<li><code>gosec</code>: from 2.20.0 to 5f0084eb01a9 (fix G601 and G113 performance issues)</li> +<li><code>sloglint</code>: from 0.6.0 to 0.7.0 (new option <code>forbidden-keys</code>)</li> +<li><code>testifylint</code>: from 1.2.0 to 1.3.0 (new checker <code>negative-positive</code> and new option <code>go-require.ignore-http-handlers</code>)</li> +</ul> +</li> +<li>Misc. +<ul> +<li>️️⚠️ Deprecate <code>github-action</code> output format</li> +<li>️️⚠️ Deprecate <code>issues.exclude-generated-strict</code> option (replaced by <code>issues.exclude-generated: strict</code>)</li> +<li>️️⚠️ Add warning about disabled and deprecated linters (level 2)</li> +</ul> +</li> +</ol> +<h2>v1.58.2<span class="hx:absolute hx:-mt-20" id="v1582"></span> +<a href="#v1582" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>canonicalheader</code>: from 1.0.6 to 1.1.1</li> +<li><code>gosec</code>: from 2.19.0 to 2.20.0</li> +<li><code>musttag</code>: from 0.12.1 to 0.12.2</li> +<li><code>nilnil</code>: from 0.1.8 to 0.1.9</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve integrations and install pages</li> +</ul> +</li> +</ol> +<h2>v1.58.1<span class="hx:absolute hx:-mt-20" id="v1581"></span> +<a href="#v1581" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>tagalign</code>: from 1.3.3 to 1.3.4</li> +<li><code>protogetter</code>: from 0.3.5 to 0.3.6</li> +<li><code>gochecknoinits</code>: fix analyzer name</li> +</ul> +</li> +<li>Fixes +<ul> +<li>Restores previous <code>github-actions</code> output format (removes GitHub Action problem matchers)</li> +</ul> +</li> +</ol> +<h2>v1.58.0<span class="hx:absolute hx:-mt-20" id="v1580"></span> +<a href="#v1580" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li><code>fatcontext</code>: <a href="https://github.com/Crocmagnon/fatcontext"target="_blank" rel="noopener">https://github.com/Crocmagnon/fatcontext</a></li> +<li><code>canonicalheader</code>: <a href="https://github.com/lasiar/canonicalheader"target="_blank" rel="noopener">https://github.com/lasiar/canonicalheader</a></li> +</ul> +</li> +<li>Updated linters +<ul> +<li><code>copyloopvar</code>: from 1.0.10 to 1.1.0 (<code>ignore-alias</code> is replaced by <code>check-alias</code> with the opposite behavior)</li> +<li><code>decorder</code>: from 0.4.1 to 0.4.2</li> +<li><code>errname</code>: from 0.1.12 to 0.1.13</li> +<li><code>errorlint</code>: from 1.4.8 to 1.5.1 (new options <code>allowed-errors</code> and <code>allowed-errors-wildcard</code>)</li> +<li><code>execinquery</code>: deprecate linter ⚠️</li> +<li><code>gci</code>: from 0.12.3 to 0.13.4 (new section <code>localModule</code>)</li> +<li><code>gocritic</code>: from 0.11.2 to 0.11.3</li> +<li><code>spancheck</code>: from 0.5.3 to 0.6.1</li> +<li><code>goerr113</code> is replaced by <code>err113</code> ⚠️</li> +<li><code>gomnd</code> is replaced by <code>mnd</code> ⚠️</li> +<li><code>gomodguard</code>: from 1.3.1 to 1.3.2</li> +<li><code>grouper</code>: from 1.1.1 to 1.1.2</li> +<li><code>intrange</code>: from 0.1.1 to 0.1.2</li> +<li><code>mirror</code>: from 1.1.0 to 1.2.0</li> +<li><code>misspell</code>: from 0.4.1 to 0.5.1</li> +<li><code>musttag</code>: from 0.9.0 to 0.12.1</li> +<li><code>nilnil</code>: from 0.1.7 to 0.1.8</li> +<li><code>nonamedreturns</code>: from 1.0.4 to 1.0.5</li> +<li><code>promlinter</code>: from 0.2.0 to 0.3.0</li> +<li><code>sloglint</code>: from 0.5.0 to 0.6.0</li> +<li><code>unparam</code>: bump to HEAD (063aff900ca150b80930c8de76f11d7e6488222f)</li> +<li><code>whitespace</code>: from 0.1.0 to 0.1.1</li> +</ul> +</li> +<li>Enhancements +<ul> +<li>Speed up &ldquo;fast&rdquo; linters when only &ldquo;fast&rdquo; linters are run: between 40% and 80% faster at first run (i.e. without cache)</li> +</ul> +</li> +<li>Fixes +<ul> +<li>Use version with module plugins</li> +<li>Skip <code>go.mod</code> report inside autogenerated processor</li> +<li>Keep only <code>typecheck</code> issues when needed</li> +<li>Don&rsquo;t hide <code>typecheck</code> errors inside diff processor</li> +</ul> +</li> +<li>Misc. +<ul> +<li>⚠️ log an error when using previously deprecated linters (<a href="https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle"target="_blank" rel="noopener">Linter Deprecation Cycle</a>) +<ul> +<li><a href="https://github.com/remyoudompheng/go-misc/tree/HEAD/deadcode"target="_blank" rel="noopener"><code>deadcode</code></a>: deprecated since v1.49.0 (2022-08-23).</li> +<li><a href="https://github.com/mbilski/exhaustivestruct"target="_blank" rel="noopener"><code>exhaustivestruct</code></a>: deprecated since v1.46.0 (2022-05-08).</li> +<li><a href="https://github.com/golang/lint"target="_blank" rel="noopener"><code>golint</code></a>: deprecated since v1.41.0 (2021-06-15).</li> +<li><a href="https://github.com/esimonov/ifshort"target="_blank" rel="noopener"><code>ifshort</code></a>: deprecated since v1.48.0 (2022-08-04).</li> +<li><a href="https://github.com/mvdan/interfacer"target="_blank" rel="noopener"><code>interfacer</code></a>: deprecated since v1.38.0 (2021-03-03).</li> +<li><a href="https://github.com/mdempsky/maligned"target="_blank" rel="noopener"><code>maligned</code></a>: deprecated since v1.38.0 (2021-03-03).</li> +<li><a href="https://github.com/sivchari/nosnakecase"target="_blank" rel="noopener"><code>nosnakecase</code></a>: deprecated since v1.48.0 (2022-08-04).</li> +<li><a href="https://github.com/kyoh86/scopelint"target="_blank" rel="noopener"><code>scopelint</code></a>: deprecated since v1.39.0 (2021-03-25).</li> +<li><a href="https://github.com/opennota/check"target="_blank" rel="noopener"><code>structcheck</code></a>: deprecated since v1.49.0 (2022-08-23).</li> +<li><a href="https://github.com/opennota/check"target="_blank" rel="noopener"><code>varcheck</code></a>: deprecated since v1.49.0 (2022-08-23).</li> +</ul> +</li> +<li>⚠️ Deprecate usage of linter alternative names</li> +<li>Remove help display on errors with <code>config verify</code> command</li> +<li>Add <code>pre-commit</code> hook to run <code>config verify</code></li> +<li>Improve <code>github-action</code> output</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Remove deprecated Atom from Editor Integrations</li> +</ul> +</li> +</ol> +<p>GitHub Action (v5.1.0) for golangci-lint:</p> +<ul> +<li>supports for <code>pull</code>, <code>pull_request_target</code>, and <code>merge_group</code> events with the option <code>only-new-issues</code>.</li> +<li>️️⚠️ <code>skip-pkg-cache</code> and <code>skip-build-cache</code> have been removed because the cache related to Go itself is already handled by <code>actions/setup-go</code>.</li> +<li>with golangci-lint v1.58, the file information (path and position) will be displayed on the log.</li> +</ul> +<h2>v1.57.2<span class="hx:absolute hx:-mt-20" id="v1572"></span> +<a href="#v1572" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>contextcheck</code>: from 1.1.4 to 1.1.5</li> +<li><code>copyloopvar</code>: from 1.0.8 to 1.0.10</li> +<li><code>ginkgolinter</code>: from 0.16.1 to 0.16.2</li> +<li><code>goconst</code>: from 1.7.0 to 1.7.1</li> +<li><code>gomoddirectives</code>: from 0.2.3 to 0.2.4</li> +<li><code>intrange</code>: from 0.1.0 to 0.1.1</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Display warnings on deprecated linter options</li> +<li>Fix missing <code>colored-tab</code> output format</li> +<li>Fix TeamCity <code>inspectionType</code> service message</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Remove invalid example about mixing files and directory</li> +<li>Improve linters page</li> +</ul> +</li> +</ol> +<h2>v1.57.1<span class="hx:absolute hx:-mt-20" id="v1571"></span> +<a href="#v1571" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Fixes +<ul> +<li>Ignore issues with invalid position (e.g. <code>contextcheck</code>).</li> +</ul> +</li> +</ol> +<h2>v1.57.0<span class="hx:absolute hx:-mt-20" id="v1570"></span> +<a href="#v1570" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li><code>copyloopvar</code>: <a href="https://github.com/karamaru-alpha/copyloopvar"target="_blank" rel="noopener">https://github.com/karamaru-alpha/copyloopvar</a></li> +<li><code>intrange</code>: <a href="https://github.com/ckaznocha/intrange"target="_blank" rel="noopener">https://github.com/ckaznocha/intrange</a></li> +</ul> +</li> +<li>Updated linters +<ul> +<li><code>dupword</code>: from 0.0.13 to 0.0.14</li> +<li><code>gci</code>: from 0.12.1 to 0.12.3</li> +<li><code>ginkgolinter</code>: from 0.15.2 to 0.16.1 (new option <code>force-expect-to</code>, <code>validate-async-intervals</code>, and <code>forbid-spec-pollution</code>)</li> +<li><code>go-critic</code>: from 0.11.1 to 0.11.2</li> +<li><code>go-critic</code>: support of <code>enable-all</code> and <code>disable-all</code> options</li> +<li><code>go-spancheck</code>: from 0.5.2 to 0.5.3</li> +<li><code>gomodguard</code>: from 1.3.0 to 1.3.1</li> +<li><code>govet</code>: deprecation of <code>check-shadowing</code> ⚠️</li> +<li><code>govet</code>: disable temporarily <code>httpresponse</code> because of a bug <a href="https://github.com/golang/go/issues/66259"target="_blank" rel="noopener">https://github.com/golang/go/issues/66259</a></li> +<li><code>misspell</code>: add <code>extra-words</code></li> +<li><code>musttag</code>: from 0.8.0 to 0.9.0</li> +<li><code>nakedret</code>: from 2.0.2 to 2.0.4</li> +<li><code>paralleltest</code>: from 1.0.9 to 1.0.10</li> +<li><code>perfsprint</code>: from 0.6.0 to 0.7.1 (new option <code>strconcat</code>)</li> +<li><code>protogetter</code>: from 0.3.4 to 0.3.5</li> +<li><code>revive</code>: add <code>exclude</code> option</li> +<li><code>sloglint</code>: from 0.4.0 to 0.5.0 (new option <code>no-global</code>)</li> +<li><code>staticcheck</code>: from 0.4.6 to 0.4.7</li> +<li><code>testifylint</code>: from 1.1.2 to 1.2.0 (new option <code>bool-compare</code>)</li> +<li><code>unconvert</code>: to HEAD (new options <code>fast-math</code> and <code>safe</code>)</li> +<li><code>wrapcheck</code>: from 2.8.1 to 2.8.3</li> +<li>Disable <code>copyloopvar</code> and <code>intrange</code> on Go &lt; 1.22</li> +</ul> +</li> +<li>Enhancements +<ul> +<li>🧩New custom linters system <a href="https://golangci-lint.run/docs/plugins/module-plugins/"target="_blank" rel="noopener">https://golangci-lint.run/docs/plugins/module-plugins/</a></li> +<li>Allow running only a specific linter without modifying the file configuration (<code>--enable-only</code>)</li> +<li>Allow custom sort order for the reports (<code>output.sort-order</code>)</li> +<li>Automatically adjust the maximum concurrency to the container CPU quota if <code>run.concurrency=0</code></li> +<li>Add <code>config verify</code> command to check the configuration against the JSON Schema</li> +<li>Option to strictly follow Go generated file convention (<code>issues.exclude-generated-strict</code>)</li> +<li>Syntax to not override <code>severity</code> from linters (<code>@linter</code>)</li> +<li>Use severities from <code>gosec</code></li> +<li>Create automatically directory related to <code>output.formats.path</code></li> +<li>Use the first issue without inline on <code>mergeLineIssues</code> on multiple issues</li> +</ul> +</li> +<li>Misc. +<ul> +<li>⚠️ Inactivate deprecated linters (<code>deadcode</code>, <code>exhaustivestruct</code>, <code>golint</code>, <code>ifshort</code>, <code>interfacer</code>, <code>maligned</code>, <code>nosnakecase</code>, <code>scopelint</code>, <code>structcheck</code>, <code>varcheck</code>)</li> +<li>⚠️ Deprecated CLI flags have been removed (deprecated since 2018)</li> +<li>⚠️ Move <code>show-stats</code> option from <code>run</code> to <code>output</code> configuration section</li> +<li>⚠️ Replace <code>run.skip-xxx</code> options by <code>issues.exclude-xxx</code> options</li> +<li>⚠️ Replace <code>output.format</code> by <code>output.formats</code> with a new file configuration syntax</li> +<li>Internal rewrite of the CLI</li> +<li>Improve &rsquo;no go files to analyze&rsquo; message</li> +<li>Use <code>GOTOOLCHAIN=auto</code> inside the Docker images</li> +</ul> +</li> +<li>Documentation +<ul> +<li>⚠️ Define the linter deprecation cycle <a href="https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle"target="_blank" rel="noopener">https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle</a></li> +<li>🎉Use information from the previous release to create linter pages</li> +<li>Publish JSON schema on <a href="https://golangci-lint.run/jsonschema/golangci.jsonschema.json"target="_blank" rel="noopener">https://golangci-lint.run/jsonschema/golangci.jsonschema.json</a></li> +<li>Reorganize documentation pages</li> +<li>Add an explanation about the configuration file inside golangci-lint repository</li> +</ul> +</li> +</ol> +<p><strong>⚠️ Important ⚠️</strong></p> +<ol> +<li>Deprecated linters are inactivated, you still need to disable them if you are using <code>enable-all</code>.</li> +<li>Deprecated CLI flags (about linter settings and <code>deadline</code>) have been removed.</li> +</ol> +<h2>v1.56.2<span class="hx:absolute hx:-mt-20" id="v1562"></span> +<a href="#v1562" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>go-critic</code>: from 0.11.0 to 0.11.1</li> +<li><code>gosec</code>: from 2.18.2 to 2.19.0</li> +<li><code>testifylint</code>: from 1.1.1 to 1.1.2</li> +<li><code>usestdlibvars</code>: from 1.24.0 to 1.25.0</li> +<li><code>wsl</code>: from 4.2.0 to 4.2.1</li> +</ul> +</li> +<li>misc. +<ul> +<li>Fix missing version in Docker image</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Explain the limitation of <code>new-from-rev</code> and <code>new-from-patch</code></li> +</ul> +</li> +</ol> +<h2>v1.56.1<span class="hx:absolute hx:-mt-20" id="v1561"></span> +<a href="#v1561" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>errcheck</code>: from 1.6.3 to 1.7.0</li> +<li><code>govet</code>: disable <code>loopclosure</code> with go1.22</li> +<li><code>revive</code>: from 1.3.6 to 1.3.7</li> +<li><code>testifylint</code>: from 1.1.0 to 1.1.1</li> +</ul> +</li> +</ol> +<h2>v1.56.0<span class="hx:absolute hx:-mt-20" id="v1560"></span> +<a href="#v1560" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>spancheck</code>: <a href="https://github.com/jjti/go-spancheck"target="_blank" rel="noopener">https://github.com/jjti/go-spancheck</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>depguard</code>: from 2.1.0 to 2.2.0</li> +<li><code>exhaustive</code>: from 0.11.0 to 0.12.0</li> +<li><code>exhaustruct</code>: from 3.1.0 to 3.2.0</li> +<li><code>gci</code>: from 0.11.2 to 0.12.1</li> +<li><code>ginkgolinter</code>: from 0.14.1 to 0.15.2</li> +<li><code>go-check-sumtype</code>: from 0.1.3 to 0.1.4</li> +<li><code>go-critic</code>: from 0.9.0 to 0.11.0</li> +<li><code>go-errorlint</code>: from 1.4.5 to 1.4.8</li> +<li><code>go-spancheck</code>: from 0.4.2 to 0.5.2</li> +<li><code>goconst</code>: from 1.6.0 to 1.7.0</li> +<li><code>godot</code>: from 1.4.15 to 1.4.16</li> +<li><code>gofumpt</code>: from 0.5.0 to 0.6.0</li> +<li><code>inamedparam</code>: from 0.1.2 to 0.1.3</li> +<li><code>ineffassign</code>: from 0.0.0-20230610083614-0e73809eb601 to 0.1.0</li> +<li><code>ireturn</code>: from 0.2.2 to 0.3.0</li> +<li><code>misspell</code>: add mode option</li> +<li><code>musttag</code>: from v0.7.2 to v0.8.0</li> +<li><code>paralleltest</code>: from 1.0.8 to 1.0.9</li> +<li><code>perfsprint</code>: from 0.2.0 to 0.6.0</li> +<li><code>protogetter</code>: from 0.2.3 to 0.3.4</li> +<li><code>revive</code>: from 1.3.4 to 1.3.6</li> +<li><code>sloglint</code>: add static-msg option</li> +<li><code>sloglint</code>: from 0.1.2 to 0.4.0</li> +<li><code>testifylint</code>: from 0.2.3 to 1.1.0</li> +<li><code>unparam</code>: from 20221223090309-7455f1af531d to 20240104100049-c549a3470d14</li> +<li><code>whitespace</code>: update after moving to the <code>analysis</code> package</li> +<li><code>wsl</code>: from 3.4.0 to 4.2.0</li> +<li><code>zerologlint</code>: from 0.1.3 to 0.1.5</li> +</ul> +</li> +<li>misc. +<ul> +<li>🎉 go1.22 support</li> +<li>Implement stats per linter with a flag</li> +<li>Make versioning inside Docker image consistent with binaries</li> +<li>Parse Go RC version</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Fix <code>noctx</code> description</li> +<li>Add missing fields to <code>.golangci.reference.yml</code></li> +<li>Improve <code>.golangci.reference.yml</code> defaults</li> +<li><code>typecheck</code>: improve FAQ</li> +<li><code>exhaustruct</code>: note that struct regular expressions are expected to match the entire <code>package/name/structname</code></li> +<li><code>wrapcheck</code>: adjust <code>ignoreSigs</code> to new defaults</li> +</ul> +</li> +</ol> +<p><strong>Important</strong></p> +<p><code>testifylint</code> has <a href="https://github.com/Antonboom/testifylint/releases/tag/v1.0.0"target="_blank" rel="noopener">breaking changes</a> about enabling/disabling checks:</p> +<ul> +<li> +<p>If you were using the option <code>enable</code> with a filtered list of checks, you should either add <code>disable-all: true</code> (1) or use <code>disable</code> field (2).</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example (1)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testifylint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bool-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">compares</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-is-as</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-nil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expected-actual</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go-require</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">float-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nil-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - suite-dont-use-pkg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-extra-assert-call</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-thelper</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example (2)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testifylint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-dont-use-pkg</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</li> +</ul> +<h2>v1.55.2<span class="hx:absolute hx:-mt-20" id="v1552"></span> +<a href="#v1552" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>ireturn</code>: from 0.2.1 to 0.2.2</li> +<li><code>ginkgolinter</code>: from 0.14.0 to 0.14.1</li> +</ul> +</li> +</ol> +<h2>v1.55.1<span class="hx:absolute hx:-mt-20" id="v1551"></span> +<a href="#v1551" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>gosec</code>: from 2.18.1 to 2.18.2</li> +</ul> +</li> +<li>misc. +<ul> +<li><code>revgrep</code>: from v0.5.0 to v0.5.2 (support git &lt; 2.41.0)</li> +<li>output: convert backslashes to forward slashes for GitHub Action annotations printer</li> +</ul> +</li> +</ol> +<h2>v1.55.0<span class="hx:absolute hx:-mt-20" id="v1550"></span> +<a href="#v1550" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>gochecksumtype</code>: <a href="https://github.com/alecthomas/go-check-sumtype"target="_blank" rel="noopener">https://github.com/alecthomas/go-check-sumtype</a></li> +<li><code>inamedparam</code>: <a href="https://github.com/macabu/inamedparam"target="_blank" rel="noopener">https://github.com/macabu/inamedparam</a></li> +<li><code>perfsprint</code>: <a href="https://github.com/catenacyber/perfsprint"target="_blank" rel="noopener">https://github.com/catenacyber/perfsprint</a></li> +<li><code>protogetter</code>: <a href="https://github.com/ghostiam/protogetter"target="_blank" rel="noopener">https://github.com/ghostiam/protogetter</a></li> +<li><code>sloglint</code>: <a href="https://github.com/go-simpler/sloglint"target="_blank" rel="noopener">https://github.com/go-simpler/sloglint</a></li> +<li><code>testifylint</code>: <a href="https://github.com/Antonboom/testifylint"target="_blank" rel="noopener">https://github.com/Antonboom/testifylint</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>bidichk</code>: from 0.2.4 to 0.2.7</li> +<li><code>decorder</code>: from 0.4.0 to 0.4.1</li> +<li><code>dupword</code>: from 0.0.12 to 0.0.13</li> +<li><code>errchkjson</code>: from 0.3.1 to 0.3.6</li> +<li><code>gci</code>: from 0.11.0 to 0.11.2</li> +<li><code>ginkgolinter</code>: from 0.13.5 to 0.14.0</li> +<li><code>go-errorlint</code>: from 1.4.4 to 1.4.5</li> +<li><code>gocognit</code>: from 1.0.7 to 1.1.0</li> +<li><code>goconst</code>: from 1.5.1 to 1.6.0</li> +<li><code>godot</code>: from 1.4.14 to 1.4.15</li> +<li><code>gofmt</code>: update to HEAD</li> +<li><code>goimports</code>: update to HEAD</li> +<li><code>gosec</code>: from 2.17.0 to 2.18.1</li> +<li><code>gosmopolitan</code>: from 1.2.1 to 1.2.2</li> +<li><code>govet</code>: add <code>appends</code> analyzer</li> +<li><code>ireturn</code>: from 0.2.0 to 0.2.1</li> +<li><code>protogetter</code>: from 0.2.2 to 0.2.3</li> +<li><code>revgrep</code>: from 745bb2f7c2e6 to v0.5.0</li> +<li><code>revive</code>: from 1.3.2 to 1.3.4</li> +<li><code>sqlclosecheck</code>: from 0.4.0 to 0.5.1</li> +<li><code>staticcheck</code>: from 0.4.5 to 0.4.6</li> +<li><code>tagalign</code>: from 1.3.2 to 1.3.3</li> +<li><code>unused</code>: support passing in options</li> +</ul> +</li> +<li>misc. +<ul> +<li>Add a pre-commit hook to check all files</li> +</ul> +</li> +<li>Documentation +<ul> +<li>add source options to exclude-rules docs</li> +<li><code>gosec</code>: add G602 to includes/excludes inside .golangci.reference.yml</li> +</ul> +</li> +</ol> +<h2>v1.54.2<span class="hx:absolute hx:-mt-20" id="v1542"></span> +<a href="#v1542" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>errname</code>: from 0.1.10 to 0.1.12</li> +<li><code>ginkgolinter</code>: from 0.13.3 to 0.13.5</li> +<li><code>go-errorlint</code>: from 1.4.3 to 1.4.4</li> +<li><code>godot</code>: from 1.4.11 to 1.4.14</li> +<li><code>gosec</code>: from 2.16.0 to 2.17.0</li> +<li><code>musttag</code>: from 0.7.1 to 0.7.2</li> +<li><code>nilnil</code>: from 0.1.5 to 0.1.7</li> +<li><code>staticcheck</code>: from 0.4.3 to 0.4.5</li> +<li><code>usestdlibvars</code>: from 1.23.0 to 1.24.0</li> +<li><code>govet</code>: add missing <code>directive</code> and <code>slog</code> passes</li> +</ul> +</li> +</ol> +<h2>v1.54.1<span class="hx:absolute hx:-mt-20" id="v1541"></span> +<a href="#v1541" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>go-critic</code>: from 0.8.2 to 0.9.0</li> +</ul> +</li> +<li>misc. +<ul> +<li>plugin: temporarily hide warning about using plugins using the old API</li> +</ul> +</li> +</ol> +<h2>v1.54.0<span class="hx:absolute hx:-mt-20" id="v1540"></span> +<a href="#v1540" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>decorder</code>: from 0.2.3 to 0.4.0</li> +<li><code>dupword</code>: from 0.0.11 to 0.0.12</li> +<li><code>errorlint</code>: from 1.4.2 to 1.4.3</li> +<li><code>exhaustruct</code>: from 2.3.0 to 3.1.0</li> +<li><code>forbidigo</code>: from 1.5.3 to 1.6.0</li> +<li><code>funlen</code>: from 0.0.3 to 0.1.0</li> +<li><code>gci</code>: from 0.10.1 to 0.11.0</li> +<li><code>ginkgolinter</code>: from 0.12.1 to 0.13.3</li> +<li><code>go-critic</code>: from 0.8.1 to 0.8.2</li> +<li><code>go-errorlint</code>: from 1.4.2 to 1.4.3</li> +<li><code>go-exhaustruct</code>: from 2.3.0 to 3.1.0</li> +<li><code>gocognit</code>: from 1.0.6 to 1.0.7</li> +<li><code>gocritic</code>: from 0.8.1 to 0.8.2</li> +<li><code>gofmt</code>: autofix missing newline at EOF</li> +<li><code>misspell</code>: 0.4.0 to 0.4.1</li> +<li><code>musttag</code>: from 0.7.0 to 0.7.1</li> +<li><code>paralleltest</code>: from 1.0.7 to 1.0.8</li> +<li><code>tagalign</code>: from 1.2.2 to 1.3.2</li> +<li><code>typecheck</code>: explain it and remove it from the linter list</li> +<li><code>zerologlint</code>: from 0.1.2 to 0.1.3</li> +</ul> +</li> +<li>misc. +<ul> +<li>🎉 go1.21 support</li> +<li>plugin: include custom linters in <code>enable-all</code></li> +<li>plugin: allow to use settings for plugins</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add linter descriptions.</li> +</ul> +</li> +</ol> +<p><strong>Important</strong></p> +<p><code>ruleguard</code> (a &ldquo;rule&rdquo; inside <code>gocritic</code>) was disabled in this release (v1.54.0) and was enabled again in the next release (v1.54.1).</p> +<p><code>exhaustruct</code> has breaking changes with regular expressions, more details <a href="https://github.com/GaijinEntertainment/go-exhaustruct/releases/tag/v3.0.0"target="_blank" rel="noopener">here</a>.</p> +<h2>v1.53.3<span class="hx:absolute hx:-mt-20" id="v1533"></span> +<a href="#v1533" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>cyclop</code>: from 1.2.0 to 1.2.1</li> +<li><code>exhaustive</code>: from 0.10.0 to 0.11.0</li> +<li><code>forbidigo</code>: from 1.5.1 to 1.5.3</li> +<li><code>ginkgolinter</code>: from 0.12.2 to 0.12.1</li> +<li><code>ineffassign</code>: bump to HEAD</li> +<li><code>nakedret</code>: from 2.0.1 to 2.0.2</li> +<li><code>zerologlint</code>: from 0.1.1 to 0.1.2</li> +</ul> +</li> +<li>misc. +<ul> +<li>codeclimate: reduce memory allocation</li> +<li>support illumos/amd64</li> +</ul> +</li> +</ol> +<h2>v1.53.2<span class="hx:absolute hx:-mt-20" id="v1532"></span> +<a href="#v1532" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>depguard</code>: from v2.0.1 to 2.1.0</li> +</ul> +</li> +<li>misc. +<ul> +<li><code>depguard</code>: throw error only when the linter is called</li> +</ul> +</li> +</ol> +<h2>v1.53.1<span class="hx:absolute hx:-mt-20" id="v1531"></span> +<a href="#v1531" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>misc. +<ul> +<li><code>depguard</code>: fix GOROOT detection</li> +<li><code>importas</code>: fix duplication detection when aliases use regular expression replacement pattern</li> +</ul> +</li> +</ol> +<h2>v1.53.0<span class="hx:absolute hx:-mt-20" id="v1530"></span> +<a href="#v1530" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>gosmopolitan</code>: <a href="https://github.com/xen0n/gosmopolitan"target="_blank" rel="noopener">https://github.com/xen0n/gosmopolitan</a></li> +<li><code>mirror</code>: <a href="https://github.com/butuzov/mirror"target="_blank" rel="noopener">https://github.com/butuzov/mirror</a></li> +<li><code>tagalign</code>: <a href="https://github.com/4meepo/tagalign"target="_blank" rel="noopener">https://github.com/4meepo/tagalign</a></li> +<li><code>zerologlint</code>: <a href="https://github.com/ykadowak/zerologlint"target="_blank" rel="noopener">https://github.com/ykadowak/zerologlint</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>bodyclose</code>: bump to HEAD</li> +<li><code>containedctx</code>: from 1.0.2 to 1.0.3</li> +<li><code>depguard</code>: migrate to v2</li> +<li><code>errname</code>: from 0.1.9 to 0.1.10</li> +<li><code>exhaustive</code>: from 0.9.5 to 0.10.0</li> +<li><code>forbidigo</code>: better support for configuring complex rules</li> +<li><code>gci</code>: improve error message</li> +<li><code>ginkgolinter</code>: add suppress-async-assertion option</li> +<li><code>ginkgolinter</code>: from 0.9.0 to 0.12.0</li> +<li><code>go-critic</code>: from 0.7.0 to 0.8.1</li> +<li><code>go-errorlint</code>: from 1.4.0 to 1.4.2</li> +<li><code>gofumpt</code>: from 0.4.0 to 0.5.0</li> +<li><code>gosec</code>: convert global settings as map with proper key type</li> +<li><code>gosec</code>: from 2.15.0 to 2.16.0</li> +<li><code>importas</code>: detect duplicate alias or package in the configuration</li> +<li><code>importas</code>: fix typo in logs</li> +<li><code>ireturn</code>: from 0.1.1 to 0.2.0</li> +<li><code>musttag</code>: from 0.5.0 to 0.7.0</li> +<li><code>nakedret</code>: to 2.0.1</li> +<li><code>nilnil</code>: from 0.1.3 to 0.1.5</li> +<li><code>paralleltest</code>: from 1.0.6 to 1.0.7</li> +<li><code>revive</code>: from 1.3.1 to 1.3.2</li> +<li><code>tagliatelle</code>: from 0.4.0 to 0.5.0</li> +<li><code>usestdlibvars</code>: fix configuration</li> +</ul> +</li> +<li>misc. +<ul> +<li><code>golang.org/x/tools</code>: from 0.7.0 to 0.9.2</li> +<li>add loongarch64 to the install script</li> +<li>output: add colored-tab</li> +<li>remove warning when the config file is explicitly stdin</li> +<li>rules: support inverted path match</li> +</ul> +</li> +<li>Documentation +<ul> +<li><code>mnd</code>: clarify ignore usage examples to be regexps</li> +<li><code>tagliatelle</code>: update documentation</li> +<li>improve features section</li> +<li>update supported Go versions FAQ</li> +</ul> +</li> +</ol> +<h2>v1.52.2<span class="hx:absolute hx:-mt-20" id="v1522"></span> +<a href="#v1522" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>tparallel</code>: from 0.3.0 to 0.3.1</li> +</ul> +</li> +<li>misc. +<ul> +<li>fix: pre-commit <code>require_serial</code> and <code>pass_filenames</code></li> +</ul> +</li> +</ol> +<h2>v1.52.1<span class="hx:absolute hx:-mt-20" id="v1521"></span> +<a href="#v1521" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>misc. +<ul> +<li>fix: improve panic management</li> +<li>fix: the combination of &ndash;fix and &ndash;path-prefix</li> +</ul> +</li> +</ol> +<h2>v1.52.0<span class="hx:absolute hx:-mt-20" id="v1520"></span> +<a href="#v1520" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>asciicheck</code>: from 0.1.1 to 0.2.0</li> +<li><code>bidichk</code>: from 0.2.3 to 0.2.4</li> +<li><code>contextcheck</code>: from 1.1.3 to 1.1.4</li> +<li><code>dupword</code>: from 0.0.9 to 0.0.11</li> +<li><code>durationcheck</code>: from 0.0.9 to 0.0.10</li> +<li><code>errchkjson</code>: from 0.3.0 to 0.3.1</li> +<li><code>errname</code>: from 0.1.7 to 0.1.9</li> +<li><code>forbidigo</code>: from 1.4.0 to 1.5.1</li> +<li><code>gci</code>: from 0.9.1 to 0.10.1</li> +<li><code>ginkgolinter</code>: from 0.8.1 to 0.9.0</li> +<li><code>go-critic</code>: from 0.6.7 to 0.7.0</li> +<li><code>go-errorlint</code>: from 1.1.0 to 1.4.0</li> +<li><code>godox</code>: bump to HEAD</li> +<li><code>lll</code>: skip go command</li> +<li><code>loggercheck</code>: from 0.9.3 to 0.9.4</li> +<li><code>musttag</code>: from 0.4.5 to 0.5.0</li> +<li><code>nilnil</code>: from 0.1.1 to 0.1.3</li> +<li><code>noctx</code>: from 0.0.1 to 0.0.2</li> +<li><code>revive</code>: from 1.2.5 to 1.3.1</li> +<li><code>rowserrcheck</code>: remove limitation related to generics support</li> +<li><code>staticcheck</code>: from 0.4.2 to 0.4.3</li> +<li><code>testpackage</code>: from 1.1.0 to 1.1.1</li> +<li><code>tparallel</code>: from 0.2.1 to 0.3.0</li> +<li><code>wastedassign</code>: remove limitation related to generics support</li> +<li><code>wrapcheck</code>: from 2.8.0 to 2.8.1</li> +</ul> +</li> +<li>misc. +<ul> +<li>Add TeamCity output format</li> +<li>Consider path prefix when matching path patterns</li> +<li>Add Go version to version information</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add Tekton in Trusted By page</li> +<li>Clarify that custom linters are not enabled by default</li> +<li>Remove description for deprecated &ldquo;go&rdquo; option</li> +</ul> +</li> +</ol> +<h2>v1.51.2<span class="hx:absolute hx:-mt-20" id="v1512"></span> +<a href="#v1512" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>forbidigo</code>: from 1.3.0 to 1.4.0</li> +<li><code>gci</code>: from 0.9.0 to 0.9.1</li> +<li><code>go-critic</code>: from 0.6.5 to 0.6.7</li> +<li><code>go-errorlint</code>: from 1.0.6 to 1.1.0</li> +<li><code>gosec</code>: from 2.14.0 to 2.15.0</li> +<li><code>musttag</code>: from 0.4.4 to 0.4.5</li> +<li><code>staticcheck</code>: from 0.4.0 to 0.4.2</li> +<li><code>tools</code>: from 0.5.0 to 0.6.0</li> +<li><code>usestdlibvars</code>: from 1.21.1 to 1.23.0</li> +<li><code>wsl</code>: from 3.3.0 to 3.4.0</li> +<li><code>govet</code>: enable <code>timeformat</code> by default</li> +</ul> +</li> +<li>misc. +<ul> +<li>fix: cache status size calculation</li> +<li>add new source archive</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve installation section</li> +<li>Replace links to godoc.org with pkg.go.dev</li> +</ul> +</li> +</ol> +<h2>v1.51.1<span class="hx:absolute hx:-mt-20" id="v1511"></span> +<a href="#v1511" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>ginkgolinter</code>: from 0.7.1 to 0.8.1</li> +<li><code>ineffassign</code>: bump to HEAD</li> +<li><code>musttag</code>: from 0.4.3 to 0.4.4</li> +<li><code>sqlclosecheck</code>: from 0.3.0 to 0.4.0</li> +<li><code>staticcheck</code>: bump to v0.4.0</li> +<li><code>wastedassign</code>: from 2.0.6 to 2.0.7</li> +<li><code>wrapcheck</code>: from 2.7.0 to 2.8.0</li> +</ul> +</li> +</ol> +<h2>v1.51.0<span class="hx:absolute hx:-mt-20" id="v1510"></span> +<a href="#v1510" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>ginkgolinter</code>: <a href="https://github.com/nunnatsa/ginkgolinter"target="_blank" rel="noopener">https://github.com/nunnatsa/ginkgolinter</a></li> +<li><code>musttag</code>: <a href="https://github.com/tmzane/musttag"target="_blank" rel="noopener">https://github.com/tmzane/musttag</a></li> +<li><code>gocheckcompilerdirectives</code>: <a href="https://github.com/leighmcculloch/gocheckcompilerdirectives"target="_blank" rel="noopener">https://github.com/leighmcculloch/gocheckcompilerdirectives</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>bodyclose</code>: to HEAD</li> +<li><code>dupword</code>: from 0.0.7 to 0.0.9</li> +<li><code>errcheck</code>: from 1.6.2 to 1.6.3</li> +<li><code>exhaustive</code>: from 0.8.3 to 0.9.5</li> +<li><code>exportloopref</code>: from 0.1.8 to 0.1.11</li> +<li><code>gci</code>: from 0.8.1 to 0.9.0</li> +<li><code>ginkgolinter</code>: from 0.6.0 to 0.7.1</li> +<li><code>go-errorlint</code>: from 1.0.5 to 1.0.6</li> +<li><code>go-ruleguard</code>: from 0.3.21 to 0.3.22</li> +<li><code>gocheckcompilerdirectives</code>: from 1.1.0 to 1.2.1</li> +<li><code>gochecknoglobals</code>: from 0.1.0 to 0.2.1</li> +<li><code>gomodguard</code>: from 1.2.4 to 1.3.0</li> +<li><code>gosec</code>: from 2.13.1 to 2.14.0</li> +<li><code>govet</code>: Add <code>timeformat</code> to analysers</li> +<li><code>grouper</code>: from 1.1.0 to 1.1.1</li> +<li><code>musttag</code>: from 0.4.1 to 0.4.3</li> +<li><code>revive</code>: from 1.2.4 to 1.2.5</li> +<li><code>tagliatelle</code>: from 0.3.1 to 0.4.0</li> +<li><code>tenv</code>: from 1.7.0 to 1.7.1</li> +<li><code>unparam</code>: bump to HEAD</li> +<li><code>usestdlibvars</code>: from 1.20.0 to 1.21.1</li> +<li><code>wsl</code>: fix <code>force-err-cuddling</code> flag</li> +</ul> +</li> +<li>misc. +<ul> +<li>go1.20 support</li> +<li>remove deprecated linters from presets</li> +<li>Build NetBSD binaries</li> +<li>Build loong64 binaries</li> +</ul> +</li> +<li>Documentation +<ul> +<li><code>goimport</code>: improve documentation for local-prefixes</li> +<li><code>gomnd</code>: add missing always ignored functions</li> +<li><code>nolint</code>: fix typo</li> +<li><code>tagliatelle</code> usage typo</li> +<li>add note about binary requirement for plugin</li> +<li>cache preserving and colored output on docker runs</li> +<li>improve documentation about debugging.</li> +<li>improve Editor Integration section</li> +<li>More specific default cache directory</li> +<li>update output example to use valid checkstyle example; add json example</li> +</ul> +</li> +</ol> +<h2>v1.50.1<span class="hx:absolute hx:-mt-20" id="v1501"></span> +<a href="#v1501" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>contextcheck</code>: from 1.1.2 to 1.1.3</li> +<li><code>go-mnd</code>: from 2.5.0 to 2.5.1</li> +<li><code>wrapcheck</code>: from 2.6.2 to 2.7.0</li> +<li><code>revive</code>: fix configuration parsing</li> +<li><code>lll</code>: skip imports</li> +</ul> +</li> +<li>misc. +<ul> +<li>windows: remove redundant character escape &lsquo;/&rsquo;</li> +<li>code-climate: add default severity</li> +</ul> +</li> +</ol> +<h2>v1.50.0<span class="hx:absolute hx:-mt-20" id="v1500"></span> +<a href="#v1500" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>dupword</code>: <a href="https://github.com/Abirdcfly/dupword"target="_blank" rel="noopener">https://github.com/Abirdcfly/dupword</a></li> +<li><code>testableexamples</code>: <a href="https://github.com/maratori/testableexamples"target="_blank" rel="noopener">https://github.com/maratori/testableexamples</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>contextcheck</code>: change owner</li> +<li><code>contextcheck</code>: from 1.0.6 to 1.1.2</li> +<li><code>depguard</code>: from 1.1.0 to 1.1.1</li> +<li><code>exhaustive</code>: add missing config</li> +<li><code>exhaustive</code>: from 0.8.1 to 0.8.3</li> +<li><code>gci</code>: from 0.6.3 to 0.8.0</li> +<li><code>go-critic</code>: from 0.6.4 to 0.6.5</li> +<li><code>go-errorlint</code>: from 1.0.2 to 1.0.5</li> +<li><code>go-reassign</code>: v0.1.2 to v0.2.0</li> +<li><code>gofmt</code>: add option <code>rewrite-rules</code></li> +<li><code>gofumpt</code> from 0.3.1 to 0.4.0</li> +<li><code>goimports</code>: update to HEAD</li> +<li><code>interfacebloat</code>: fix configuration loading</li> +<li><code>logrlint</code>: rename <code>logrlint</code> to <code>loggercheck</code></li> +<li><code>paralleltest</code>: add tests of the ignore-missing option</li> +<li><code>revive</code>: from 1.2.3 to 1.2.4</li> +<li><code>usestdlibvars</code>: from 1.13.0 to 1.20.0</li> +<li><code>wsl</code>: support all configs and update docs</li> +</ul> +</li> +<li>misc. +<ul> +<li>Normalize <code>exclude-rules</code> paths for Windows</li> +<li>add riscv64 to the install script</li> +</ul> +</li> +<li>Documentation +<ul> +<li>cli: remove reference to old service</li> +</ul> +</li> +</ol> +<h2>v1.49.0<span class="hx:absolute hx:-mt-20" id="v1490"></span> +<a href="#v1490" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>IMPORTANT: <code>varcheck</code> and <code>deadcode</code> has been removed of default linters.</p> +<ol> +<li>new linters +<ul> +<li><code>interfacebloat</code>: <a href="https://github.com/sashamelentyev/interfacebloat"target="_blank" rel="noopener">https://github.com/sashamelentyev/interfacebloat</a></li> +<li><code>logrlint</code>: <a href="https://github.com/timonwong/logrlint"target="_blank" rel="noopener">https://github.com/timonwong/logrlint</a></li> +<li><code>reassign</code>: <a href="https://github.com/curioswitch/go-reassign"target="_blank" rel="noopener">https://github.com/curioswitch/go-reassign</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>go-colorable</code>: from 0.1.12 to 0.1.13</li> +<li><code>go-critic</code>: from 0.6.3 to 0.6.4</li> +<li><code>go-errorlint</code>: from 1.0.0 to 1.0.2</li> +<li><code>go-exhaustruct</code>: from 2.2.2 to 2.3.0</li> +<li><code>gopsutil</code>: from 3.22.6 to 3.22.7</li> +<li><code>gosec</code>: from 2.12.0 to 2.13.1</li> +<li><code>revive</code>: from 1.2.1 to 1.2.3</li> +<li><code>usestdlibvars</code>: from 1.8.0 to 1.13.0</li> +<li><code>contextcheck</code>: from v1.0.4 to v1.0.6 &amp;&amp; re-enable</li> +<li><code>nosnakecase</code>: This linter is deprecated.</li> +<li><code>varcheck</code>: This linter is deprecated use <code>unused</code> instead.</li> +<li><code>deadcode</code>: This linter is deprecated use <code>unused</code> instead.</li> +<li><code>structcheck</code>: This linter is deprecated use <code>unused</code> instead.</li> +</ul> +</li> +<li>documentation +<ul> +<li><code>revive</code>: fix wrong URL</li> +<li>Add a section about default exclusions</li> +<li><code>usestdlibvars</code>: fix typo in documentation</li> +<li><code>nolintlint</code>: remove allow-leading-space option</li> +<li>Update documentation and assets</li> +</ul> +</li> +<li>misc. +<ul> +<li>dev: rewrite the internal tests framework</li> +<li>fix: exit early on run &ndash;version</li> +<li>fix: set an explicit <code>GOROOT</code> in the Docker image for <code>go-critic</code></li> +</ul> +</li> +</ol> +<h2>v1.48.0<span class="hx:absolute hx:-mt-20" id="v1480"></span> +<a href="#v1480" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>usestdlibvars</code>:https://github.com/sashamelentyev/usestdlibvars</li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>contextcheck</code>: disable linter</li> +<li><code>errcheck</code>: from 1.6.1 to 1.6.2</li> +<li><code>gci</code>: add missing <code>custom-order</code> setting</li> +<li><code>gci</code>: from 0.5.0 to 0.6.0</li> +<li><code>ifshort</code>: deprecate linter</li> +<li><code>nolint</code>: drop allow-leading-space option and add &ldquo;nolint:all&rdquo;</li> +<li><code>revgrep</code>: bump to HEAD</li> +</ul> +</li> +<li>documentation +<ul> +<li>remove outdated info on source install</li> +</ul> +</li> +<li>misc +<ul> +<li>go1.19 support</li> +</ul> +</li> +</ol> +<h2>v1.47.3<span class="hx:absolute hx:-mt-20" id="v1473"></span> +<a href="#v1473" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li>remove some go1.18 limitations</li> +<li><code>asasalint</code>: from 0.0.10 to 0.0.11</li> +<li><code>decorder</code>: from 0.2.2 to v0.2.3</li> +<li><code>gci</code>: fix panic with invalid configuration option</li> +<li><code>gci</code>: from 0.4.3 to v0.5.0</li> +<li><code>go-exhaustruct</code>: from 2.2.0 to 2.2.2</li> +<li><code>gomodguard</code>: from 1.2.3 to 1.2.4</li> +<li><code>nosnakecase</code>: from 1.5.0 to 1.7.0</li> +<li><code>honnef.co/go/tools</code>: from 0.3.2 to v0.3.3</li> +</ul> +</li> +<li>misc +<ul> +<li>cgo: fix linters ignoring CGo files</li> +</ul> +</li> +</ol> +<h2>v1.47.2<span class="hx:absolute hx:-mt-20" id="v1472"></span> +<a href="#v1472" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>revive</code>: ignore slow rules</li> +</ul> +</li> +</ol> +<h2>v1.47.1<span class="hx:absolute hx:-mt-20" id="v1471"></span> +<a href="#v1471" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>gci</code>: from 0.4.2 to 0.4.3</li> +<li><code>gci</code>: remove the use of stdin</li> +<li><code>gci</code>: fix options display</li> +<li><code>tenv</code>: from 1.6.0 to 1.7.0</li> +<li><code>unparam</code>: bump to HEAD</li> +</ul> +</li> +</ol> +<h2>v1.47.0<span class="hx:absolute hx:-mt-20" id="v1470"></span> +<a href="#v1470" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>asasalint</code>: <a href="https://github.com/alingse/asasalint"target="_blank" rel="noopener">https://github.com/alingse/asasalint</a></li> +<li><code>nosnakecase</code>: <a href="https://github.com/sivchari/nosnakecase"target="_blank" rel="noopener">https://github.com/sivchari/nosnakecase</a></li> +</ul> +</li> +<li>updated linters: +<ul> +<li><code>decorder</code>: from 0.2.1 to 0.2.2</li> +<li><code>errcheck</code>: from 1.6.0 to 1.6.1</li> +<li><code>errname</code>: from 0.1.6 to 0.1.7</li> +<li><code>exhaustive</code>: from 0.7.11 to 0.8.1</li> +<li><code>gci</code>: fix issues and re-enable autofix</li> +<li><code>gci</code>: from 0.3.4 to 0.4.2</li> +<li><code>go-exhaustruct</code>: from 2.1.0 to 2.2.0</li> +<li><code>go-ruleguard</code>: from 0.3.19 to 0.3.21</li> +<li><code>gocognit</code>: from 1.0.5 to 1.0.6</li> +<li><code>gocyclo</code>: from 0.5.1 to 0.6.0</li> +<li><code>golang.org/x/tools</code>: bump to HEAD</li> +<li><code>gosec</code>: allow <code>global</code> config</li> +<li><code>gosec</code>: from 2.11.0 to 2.12.0</li> +<li><code>nonamedreturns</code>: from 1.0.1 to 1.0.4</li> +<li><code>paralleltest</code>: from 1.0.3 to 1.0.6</li> +<li><code>staticcheck</code>: fix generics</li> +<li><code>staticcheck</code>: from 0.3.1 to 0.3.2</li> +<li><code>tenv</code>: from 1.5.0 to 1.6.0</li> +<li><code>testpackage</code>: from 1.0.1 to 1.1.0</li> +<li><code>thelper</code>: from 0.6.2 to 0.6.3</li> +<li><code>wrapcheck</code>: from 2.6.1 to 2.6.2</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add thanks page</li> +<li>add a clear explanation about the <code>staticcheck</code> integration.</li> +<li><code>depguard</code>: add <code>ignore-file-rules</code></li> +<li><code>depguard</code>: adjust phrasing</li> +<li><code>gocritic</code>: add <code>enable</code> and <code>disable</code> ruleguard settings</li> +<li><code>gomnd</code>: fix typo</li> +<li><code>gosec</code>: add configs for all existing rules</li> +<li><code>govet</code>: add settings for <code>shadow</code> and <code>unusedresult</code></li> +<li><code>thelper</code>: add <code>fuzz</code> config and description</li> +<li>linters: add defaults</li> +</ul> +</li> +</ol> +<h2>v1.46.2<span class="hx:absolute hx:-mt-20" id="v1462"></span> +<a href="#v1462" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>execinquery</code>: bump from v1.2.0 to v1.2.1</li> +<li><code>errorlint</code>: bump to v1.0.0</li> +<li><code>thelper</code>: allow to disable one option</li> +</ul> +</li> +<li>documentation: +<ul> +<li>rename <code>.golangci.example.yml</code> to <code>.golangci.reference.yml</code></li> +<li>add <code>containedctx</code> linter to the list of available linters</li> +</ul> +</li> +</ol> +<h2>v1.46.1<span class="hx:absolute hx:-mt-20" id="v1461"></span> +<a href="#v1461" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>execinquery</code>: bump from v0.6.0 to v0.6.1</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add missing linters</li> +</ul> +</li> +</ol> +<h2>v1.46.0<span class="hx:absolute hx:-mt-20" id="v1460"></span> +<a href="#v1460" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>execinquery</code>: <a href="https://github.com/lufeee/execinquery"target="_blank" rel="noopener">https://github.com/lufeee/execinquery</a></li> +<li><code>nonamedreturns</code>: <a href="https://github.com/firefart/nonamedreturns"target="_blank" rel="noopener">https://github.com/firefart/nonamedreturns</a></li> +<li><code>nosprintfhostport</code>: <a href="https://github.com/stbenjam/no-sprintf-host-port"target="_blank" rel="noopener">https://github.com/stbenjam/no-sprintf-host-port</a></li> +<li><code>exhaustruct</code>: <a href="https://github.com/GaijinEntertainment/go-exhaustruct"target="_blank" rel="noopener">https://github.com/GaijinEntertainment/go-exhaustruct</a></li> +</ul> +</li> +<li>updated linters: +<ul> +<li><code>bidichk</code>: from 0.2.2 to 0.2.3</li> +<li><code>deadcode</code>: bump to HEAD</li> +<li><code>errchkjson</code>: from 0.2.3 to 0.3.0</li> +<li><code>errname</code>: from 0.1.5 to 0.1.6</li> +<li><code>go-critic</code>: from 0.6.2 to 0.6.3</li> +<li><code>gocyclo</code>: from 0.4.0 to 0.5.1</li> +<li><code>gofumpt</code> from 0.3.0 to 0.3.1</li> +<li><code>gomoddirectives</code>: from 0.2.2 to 0.2.3</li> +<li><code>gosec</code>: from 2.10.0 to 2.11.0</li> +<li><code>honnef.co/go/tools</code>: from 0.2.2to 0.3.1 (go1.18 support)</li> +<li><code>nilnil</code>: from 0.1.0 to 0.1.1</li> +<li><code>nonamedreturns</code>: bump from 1.0.0 to 1.0.1</li> +<li><code>predeclared</code>: from 0.2.1 to 0.2.2</li> +<li><code>promlinter</code>: bump to v0.2.0</li> +<li><code>revive</code>: from 1.1.4 to 1.2.1</li> +<li><code>tenv</code>: from 1.4.7 to 1.5.0</li> +<li><code>thelper</code>: from 0.5.1 to 0.6.2</li> +<li><code>unused</code>: fix false-positive</li> +<li><code>varnamelen</code>: bump to v0.8.0</li> +<li><code>wrapcheck</code>: from 2.5.0 to 2.6.1</li> +<li><code>exhaustivestruct</code>: This linter is deprecated use <code>exhaustruct</code> instead.</li> +</ul> +</li> +<li>documentation: +<ul> +<li>Update &ldquo;Shell Completion&rdquo; instruction on Linux</li> +<li>Update FAQ page</li> +</ul> +</li> +<li>misc: +<ul> +<li>log: enable override coloring based on <code>CLICOLOR</code> and <code>CLICOLOR_FORCE</code></li> +</ul> +</li> +</ol> +<h2>v1.45.2<span class="hx:absolute hx:-mt-20" id="v1452"></span> +<a href="#v1452" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>misc: +<ul> +<li>fix: help command</li> +</ul> +</li> +</ol> +<h2>v1.45.1<span class="hx:absolute hx:-mt-20" id="v1451"></span> +<a href="#v1451" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>interfacer</code>: inactivate with go1.18</li> +<li><code>govet</code>: inactivate unsupported analyzers (go1.18)</li> +<li><code>depguard</code>: reduce requirements</li> +<li><code>structcheck</code>: inactivate with go1.18</li> +<li><code>varnamelen</code>: bump from v0.6.0 to v0.6.1</li> +</ul> +</li> +<li>misc: +<ul> +<li>Automatic Go version detection 🎉 (go1.18)</li> +<li>docker: update base images (go1.18)</li> +</ul> +</li> +</ol> +<h2>v1.45.0<span class="hx:absolute hx:-mt-20" id="v1450"></span> +<a href="#v1450" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>cobra</code>: from 1.3.0 to 1.4.0</li> +<li><code>containedctx</code>: from 1.0.1 to 1.0.2</li> +<li><code>errcheck</code>: add an option to remove default exclusions</li> +<li><code>gci</code>: from 0.3.1 to 0.3.2</li> +<li><code>go-header</code>: from 0.4.2 to 0.4.3</li> +<li><code>gofumpt</code>: add module-path setting</li> +<li><code>gofumpt</code>: from 0.2.1 to 0.3.0</li> +<li><code>gopsutil</code>: from 3.22.1 to 3.22.2</li> +<li><code>gosec</code>: from 2.9.6 to 2.10.0</li> +<li><code>makezero</code>: from 1.1.0 to 1.1.1</li> +<li><code>revive</code>: fix default values</li> +<li><code>wrapcheck</code>: from 2.4.0 to 2.5.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>docs: add &ldquo;back to the top&rdquo; button</li> +<li>docs: add <code>forbidigo</code> example that uses comments</li> +<li>docs: improve linters page</li> +</ul> +</li> +<li>misc: +<ul> +<li>go1.18 support 🎉</li> +<li>Add an option to manage the targeted version of Go</li> +<li>Default to YAML when config file has no extension</li> +</ul> +</li> +</ol> +<h2>v1.44.2<span class="hx:absolute hx:-mt-20" id="v1442"></span> +<a href="#v1442" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>gci</code>: bump to HEAD</li> +<li><code>gci</code>: restore defaults for sections</li> +<li><code>whitespace</code>: from 0.0.4 to 0.0.5</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add link to configuration in the linters list</li> +</ul> +</li> +</ol> +<h2>v1.44.1<span class="hx:absolute hx:-mt-20" id="v1441"></span> +<a href="#v1441" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>bidichk</code>: from 0.2.1 to 0.2.2</li> +<li><code>errchkjson</code>: from 0.2.1 to 0.2.3</li> +<li><code>thelper</code>: from 0.5.0 to 0.5.1</li> +<li><code>tagliatelle</code>: from 0.3.0 to 0.3.1</li> +<li><code>gopsutil</code>: from 3.21.12 to 3.22.1</li> +<li><code>gci</code>: from 0.2.9 to 0.3.0</li> +<li><code>revive</code>: from v1.1.3 to v1.1.4</li> +<li><code>varnamelen</code>: from v0.5.0 to v0.6.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>linters: improve configuration pages</li> +<li><code>decorder</code>: fix <code>disable-init-func-first-check: false</code> elaboration</li> +</ul> +</li> +<li>misc: +<ul> +<li>fix debug output</li> +</ul> +</li> +</ol> +<h2>v1.44.0<span class="hx:absolute hx:-mt-20" id="v1440"></span> +<a href="#v1440" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>containedctx</code>: <a href="https://github.com/sivchari/containedctx"target="_blank" rel="noopener">https://github.com/sivchari/containedctx</a></li> +<li><code>decorder</code>: <a href="https://gitlab.com/bosi/decorder"target="_blank" rel="noopener">https://gitlab.com/bosi/decorder</a></li> +<li><code>errchkjson</code>: <a href="https://github.com/breml/errchkjson"target="_blank" rel="noopener">https://github.com/breml/errchkjson</a></li> +<li><code>maintidx</code>: <a href="https://github.com/yagipy/maintidx"target="_blank" rel="noopener">https://github.com/yagipy/maintidx</a></li> +<li><code>grouper</code>: <a href="https://github.com/leonklingele/grouper"target="_blank" rel="noopener">https://github.com/leonklingele/grouper</a></li> +</ul> +</li> +<li>updated linters: +<ul> +<li><code>asciicheck</code>: bump to v0.1.1</li> +<li><code>bidichk</code>: from 0.1.1 to 0.2.1</li> +<li><code>bodyclose</code>: bump to HEAD</li> +<li><code>decorder</code>: from 0.2.0 to 0.2.1</li> +<li><code>depguard</code>: from 1.0.1 to 1.1.0</li> +<li><code>errchkjson</code>: from 0.2.0 to 0.2.1</li> +<li><code>errorlint</code>: bump to HEAD</li> +<li><code>exhaustive</code>: drop deprecated/unused settings</li> +<li><code>exhaustive</code>: from v0.2.3 to 0.7.11</li> +<li><code>forbidigo</code>: from 1.2.0 to 1.3.0</li> +<li><code>forcetypeassert</code>: bump to v0.1.0</li> +<li><code>gocritic</code>: from 0.6.1 to 0.6.2</li> +<li><code>gocritic</code>: support autofix</li> +<li><code>gocyclo</code>: from 0.3.1 to 0.4.0</li> +<li><code>godot</code>: add period option</li> +<li><code>gofumpt</code>: from 0.1.1 to 0.2.1</li> +<li><code>gomnd</code>: from 2.4.0 to 2.5.0</li> +<li><code>gomnd</code>: new configuration</li> +<li><code>gosec</code>: from 2.9.1 to 2.9.6</li> +<li><code>ifshort</code>: from 1.0.3 to 1.0.4</li> +<li><code>ineffassign</code>: bump to HEAD</li> +<li><code>makezero</code>: to v1.1.0</li> +<li><code>promlinter</code>: from v0.1.0 to HEAD</li> +<li><code>revive</code>: fix <code>enableAllRules</code></li> +<li><code>revive</code>: from 1.1.2 to 1.1.3</li> +<li><code>staticcheck</code>: from 0.2.1 to 0.2.2</li> +<li><code>tagliatelle</code>: from 0.2.0 to 0.3.0</li> +<li><code>thelper</code>: from 0.4.0 to 0.5.0</li> +<li><code>unparam</code>: bump to HEAD</li> +<li><code>varnamelen</code>: bump to v0.5.0</li> +<li><code>wrapcheck</code>: update configuration to include <code>ignoreSignRegexps</code></li> +</ul> +</li> +<li>documentation: +<ul> +<li>linters: improve pages about configuration</li> +<li>improve page about false-positive</li> +<li><code>nolintlint</code>: fix wrong default value in comment</li> +<li><code>revive</code>: add a more detailed configuration</li> +</ul> +</li> +<li>misc: +<ul> +<li>outputs: Add support for multiple outputs</li> +<li>outputs: Print error text in <code>&lt;failure&gt;</code> tag content for more readable JUnit output</li> +<li>outputs: ensure that the Issues key in JSON format is a list</li> +<li>Return error if any linter fails to run</li> +<li>cli: Show deprecated mark in the CLI linters help</li> +</ul> +</li> +</ol> +<h2>November 2021<span class="hx:absolute hx:-mt-20" id="november-2021"></span> +<a href="#november-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>bidichk</code>: <a href="https://github.com/breml/bidichk"target="_blank" rel="noopener">https://github.com/breml/bidichk</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>nestif</code>: from 0.3.0 to 0.3.1</li> +<li><code>rowserrcheck</code>: from 1.1.0 to 1.1.1</li> +<li><code>gopsutil</code>: from 3.21.9 to 3.21.10</li> +<li><code>wrapcheck</code>: from 2.3.1 to 2.4.0</li> +<li><code>gocritic</code>: add support for variable substitution in <code>ruleguard</code> path settings</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve <code>go-critic</code> documentation</li> +<li>improve <code>nolintlint</code> documentation</li> +</ul> +</li> +<li>Misc: +<ul> +<li>cli: don&rsquo;t hide <code>enable-all</code> option</li> +</ul> +</li> +</ol> +<h2>october 2021<span class="hx:absolute hx:-mt-20" id="october-2021"></span> +<a href="#october-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>contextcheck</code>: <a href="https://github.com/kkHAIKE/contextcheck"target="_blank" rel="noopener">https://github.com/kkHAIKE/contextcheck</a></li> +<li><code>varnamelen</code>: <a href="https://github.com/blizzy78/varnamelen"target="_blank" rel="noopener">https://github.com/blizzy78/varnamelen</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>gochecknoglobals</code>: to v0.1.0</li> +<li><code>gosec</code>: filter issues according to the severity and confidence</li> +<li><code>errcheck</code>: empty selector name.</li> +<li><code>ifshort</code>: from 1.0.2 to 1.0.3</li> +<li><code>go-critic</code>: from 0.5.6 to 0.6.0</li> +<li><code>gosec</code>: from 2.8.1 to 2.9.1</li> +<li><code>durationcheck</code>: from 0.0.8 to 0.0.9</li> +<li><code>wrapcheck</code>: from 2.3.0 to 2.3.1</li> +<li><code>revive</code>: from 1.1.1 to 1.1.2</li> +</ul> +</li> +</ol> +<h2>September 2021<span class="hx:absolute hx:-mt-20" id="september-2021"></span> +<a href="#september-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>ireturn</code>: <a href="https://github.com/butuzov/ireturn"target="_blank" rel="noopener">https://github.com/butuzov/ireturn</a></li> +<li><code>nilnil</code>: <a href="https://github.com/Antonboom/nilnil"target="_blank" rel="noopener">https://github.com/Antonboom/nilnil</a></li> +<li><code>tenv</code>: <a href="https://github.com/sivchari/tenv"target="_blank" rel="noopener">https://github.com/sivchari/tenv</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>errcheck</code>: update to HEAD</li> +<li><code>errname</code>: from 0.1.4 to 0.1.5</li> +<li><code>gci</code>: Parse the settings more similarly to the CLI</li> +<li><code>godot</code>: from 1.4.9 to 1.4.11</li> +<li><code>ireturn</code>: from 0.1.0 to 0.1.1</li> +<li><code>nlreturn</code>: add block-size option</li> +<li><code>paralleltest</code>: from 1.0.2 to 1.0.3</li> +</ul> +</li> +<li>Misc: +<ul> +<li>new-from-rev: add support for finding issues in entire files in a diff</li> +</ul> +</li> +</ol> +<h2>August 2021<span class="hx:absolute hx:-mt-20" id="august-2021"></span> +<a href="#august-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>errname</code>: <a href="https://github.com/Antonboom/errname"target="_blank" rel="noopener">https://github.com/Antonboom/errname</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>errname</code>: from 0.1.3 to 0.1.4</li> +<li><code>go-critic</code>: fix invalid type conversions.</li> +<li><code>godot</code>: from 1.4.8 to 1.4.9</li> +<li><code>gomodguard</code>: from 1.2.2 to 1.2.3</li> +<li><code>revive</code>: from 1.0.9 to 1.1.1</li> +<li><code>staticcheck</code>: bump to 2021.1.1 (v0.2.1)</li> +<li><code>wrapcheck</code>: bump to v2.3.0</li> +</ul> +</li> +<li>Misc: +<ul> +<li>build binaries and Docker images with go1.17</li> +</ul> +</li> +</ol> +<h2>July 2021<span class="hx:absolute hx:-mt-20" id="july-2021"></span> +<a href="#july-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>update linters: +<ul> +<li><code>errcheck</code>: allow exclude config without extra file</li> +<li><code>exhaustive</code>: from 0.1.0 to 0.2.3</li> +<li><code>gocognit</code>: from 1.0.1 to 1.0.5</li> +<li><code>godot</code>: from 1.4.7 to 1.4.8</li> +<li><code>gomoddirectives</code>: from 0.2.1 to 0.2.2</li> +<li><code>revive</code>: from 1.0.8 to 1.0.9</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve <code>goconst</code> documentation</li> +<li>improve <code>goimports</code> description</li> +</ul> +</li> +</ol> +<h2>June 2021<span class="hx:absolute hx:-mt-20" id="june-2021"></span> +<a href="#june-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>update linters: +<ul> +<li><code>durationcheck</code>: from 0.0.7 to 0.0.8</li> +<li><code>gci</code>: from 0.2.8 to 0.2.9</li> +<li><code>goconst</code>: from 0.5.6 to 0.5.7</li> +<li><code>gofumpt</code>: Add lang-version option</li> +<li><code>gomodguard</code>: from 1.2.1 to 1.2.2</li> +<li><code>gosec</code>: from 2.8.0 to 2.8.1</li> +<li><code>revive</code>: add enable-all-rules.</li> +<li><code>revive</code>: allow to disable rule</li> +<li><code>revive</code>: fix exclude comment rule for const block</li> +<li><code>revive</code>: from 1.0.7 to 1.0.8</li> +<li><code>wrapcheck</code>: from 2.1.0 to 2.2.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add all integrations to docs introduction page</li> +</ul> +</li> +<li>Misc: +<ul> +<li>🎉 Un-deprecate enable-all option</li> +<li>output: generate HTML report</li> +<li>Support RISV64</li> +</ul> +</li> +</ol> +<h2>May 2021<span class="hx:absolute hx:-mt-20" id="may-2021"></span> +<a href="#may-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>tagliatelle</code>: <a href="https://github.com/ldez/tagliatelle"target="_blank" rel="noopener">https://github.com/ldez/tagliatelle</a></li> +<li><code>promlinter</code>: <a href="https://github.com/yeya24/promlinter"target="_blank" rel="noopener">https://github.com/yeya24/promlinter</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>durationcheck</code>: from 0.0.6 to 0.0.7</li> +<li><code>errorlint</code>: bump to HEAD</li> +<li><code>forbidigo</code>: from 1.1.0 to 1.2.0</li> +<li><code>go-critic</code>: from 0.5.5 to 0.5.6</li> +<li><code>godot</code>: from 1.4.6 to 1.4.7</li> +<li>⚠ <code>golint</code>: deprecated</li> +<li><code>gomnd</code>: from 2.3.2 to 2.4.0</li> +<li><code>gomodguard</code>: fix problem where duplicate issues were reported</li> +<li><code>gosec</code>: from 2.7.0 to 2.8.0</li> +<li><code>govet</code>: fix <code>sigchanyzer</code></li> +<li><code>govet</code>: Update vet passes</li> +<li><code>importas</code>: allow repeated aliases</li> +<li><code>importas</code>: bump to HEAD</li> +<li><code>makezero</code>: bump to HEAD</li> +<li><code>nolintlint</code>: fix false positive</li> +<li><code>revive</code>: convert hard coded excludes into default exclude patterns</li> +<li><code>revive</code>: fix add-constant rule support</li> +<li><code>revive</code>: fix excludes</li> +<li><code>revive</code>: from 1.0.6 to 1.0.7</li> +<li><code>revive</code>: improve &rsquo;exported&rsquo; rule output</li> +<li><code>rowserrcheck</code>: bump to v1.1.0</li> +<li><code>staticcheck</code>: configuration for <code>staticcheck</code>, <code>gosimple</code>, <code>stylecheck</code></li> +<li><code>staticcheck</code>: from 0.1.3 to 0.1.4</li> +<li><code>staticcheck</code>: from v0.1.4 to v0.2.0</li> +<li><code>wastedassign</code>: from 0.2.0 to 1.0.0</li> +<li><code>wastedassign</code>: from 1.0.0 to v2.0.6</li> +<li><code>wrapcheck</code>: from 1.2.0 to 2.1.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve linters page</li> +<li><code>exhaustivestruct</code> example explanation</li> +<li>fix pattern of <code>forbidigo</code> in example config yaml</li> +<li>bump documentation dependencies</li> +<li>fix typos</li> +</ul> +</li> +<li>Misc: +<ul> +<li>set the minimum Go version to go1.15</li> +<li>non-zero exit code when a linter produces a panic</li> +</ul> +</li> +</ol> +<h2>April 2021<span class="hx:absolute hx:-mt-20" id="april-2021"></span> +<a href="#april-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>tagliatelle</code>: <a href="https://github.com/ldez/tagliatelle"target="_blank" rel="noopener">https://github.com/ldez/tagliatelle</a></li> +<li><code>promlinter</code>: <a href="https://github.com/yeya24/promlinter"target="_blank" rel="noopener">https://github.com/yeya24/promlinter</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>godot</code>: from 1.4.4 to 1.4.6</li> +<li><code>wrapcheck</code>: from 1.0.0 to 1.2.0</li> +<li><code>go-mnd</code>: from 2.3.1 to 2.3.2</li> +<li><code>wsl</code>: from 3.2.0 to 3.3.0</li> +<li><code>revive</code>: from 1.0.5 to 1.0.6</li> +<li><code>importas</code>: bump to HEAD</li> +<li><code>staticcheck</code>: configurable Go version</li> +<li><code>gosec</code>: add configuration</li> +<li><code>typecheck</code>: improve error stack parsing</li> +</ul> +</li> +<li>documentation: +<ul> +<li>bump documentation dependencies</li> +<li>fix typos</li> +</ul> +</li> +<li>Misc: +<ul> +<li>fix: comma in exclude pattern leads to unexpected results</li> +</ul> +</li> +</ol> +<h2>March 2021<span class="hx:absolute hx:-mt-20" id="march-2021"></span> +<a href="#march-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>gomoddirectives</code>: <a href="https://github.com/ldez/gomoddirectives"target="_blank" rel="noopener">https://github.com/ldez/gomoddirectives</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>go-critic</code>: from 0.5.4 to 0.5.5</li> +<li><code>gofumpt</code>: from v0.1.0 to v0.1.1</li> +<li><code>gosec</code>: from 2.6.1 to 2.7.0</li> +<li><code>ifshort</code>: bump to v1.0.2</li> +<li><code>importas</code>: bump to HEAD</li> +<li><code>makezero</code>: bump to HEAD</li> +<li><code>nolintlint</code>: allow to fix //nolint lines</li> +<li><code>revive</code>: from 1.0.3 to 1.0.5</li> +<li><code>revive</code>: the default configuration is only applied when no dedicated configuration</li> +<li><code>rowserrcheck</code>: bump to HEAD</li> +<li>⚠ <code>scopelint</code>: deprecated</li> +<li><code>staticcheck</code>: from v0.1.2 (2020.2.2) to v0.1.3 (2020.2.3)</li> +<li>🎉 <code>typecheck</code>: display compilation errors as report instead of error</li> +<li><code>wastedassign</code>: bump to v0.2.0</li> +<li><code>wrapcheck</code>: bump to v1.0.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve <a href="https://golangci-lint.run/docs/linters/"target="_blank" rel="noopener">linters page</a> (versions, deprecation, and presets)</li> +<li>add <a href="https://golangci-lint.run/docs/configuration/cli/#cache"target="_blank" rel="noopener">cache directory</a> information</li> +<li>adding missing format options</li> +<li>fix typos</li> +</ul> +</li> +<li>Misc: +<ul> +<li>Set <code>version</code> command output to Stdout</li> +<li>fix linters load mode</li> +<li>Restore fast linters meaning</li> +</ul> +</li> +</ol> +<h2>February 2021<span class="hx:absolute hx:-mt-20" id="february-2021"></span> +<a href="#february-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>durationcheck</code>: <a href="https://github.com/charithe/durationcheck"target="_blank" rel="noopener">https://github.com/charithe/durationcheck</a></li> +<li><code>revive</code>: <a href="https://github.com/mgechev/revive"target="_blank" rel="noopener">https://github.com/mgechev/revive</a></li> +<li><code>cyclop</code>: <a href="https://github.com/bkielbasa/cyclop"target="_blank" rel="noopener">https://github.com/bkielbasa/cyclop</a></li> +<li><code>wastedassign</code>: <a href="https://github.com/sanposhiho/wastedassign"target="_blank" rel="noopener">https://github.com/sanposhiho/wastedassign</a></li> +<li><code>importas</code>: <a href="https://github.com/julz/importas"target="_blank" rel="noopener">https://github.com/julz/importas</a></li> +<li><code>nilerr</code>: <a href="https://github.com/gostaticanalysis/nilerr"target="_blank" rel="noopener">https://github.com/gostaticanalysis/nilerr</a></li> +<li><code>forcetypeassert</code>: <a href="https://github.com/gostaticanalysis/forcetypeassert"target="_blank" rel="noopener">https://github.com/gostaticanalysis/forcetypeassert</a></li> +<li><code>govet</code>: add <code>stringintconv</code> and <code>ifaceassert</code></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>prealloc</code>: Use upstream version</li> +<li><code>errcheck</code>: Use upstream version</li> +<li><code>ineffassign</code>: Use upstream version</li> +<li><code>gocyclo</code>: Use upstream version</li> +<li><code>godot</code> from 1.3.2 to 1.4.3</li> +<li><code>exhaustivestruct</code> from 1.1.0 to 1.2.0</li> +<li><code>forbidigo</code> from 1.0.0 to 1.1.0</li> +<li><code>thelper</code> from 0.2.1 to 0.3.1</li> +<li><code>ruleguard</code>: print error message and exit with non-zero status when parsing error occurs</li> +<li>fix wrong load mode for <code>asciicheck</code>, <code>exhaustivestruct</code>, <code>exportloopref</code>, and <code>makezero</code></li> +<li><code>wsl</code>: bump to v3.2.0</li> +<li><code>durationcheck</code>: from 0.0.4 to 0.0.6</li> +<li><code>staticcheck</code>: from 2020.1.6 to v0.1.2 (2020.2.2)</li> +<li><code>thelper</code> from 0.3.1 to 0.4.0</li> +<li><code>bodyclose</code>: bump to HEAD</li> +<li><code>go-err113</code>: bump to HEAD</li> +<li>⚠ <code>interfacer</code>: deprecated</li> +<li>⚠ <code>maligned</code>: deprecated (govet <code>fieldalignment</code> as replacement)</li> +<li><code>govet</code>: use same default linter as go vet</li> +<li><code>go-printf-func-name</code>: to <code>v0.0.0-20200119135958-7558a9eaa5af</code></li> +<li><code>godox</code>: to <code>v0.0.0-20210227103229-6504466cf951</code></li> +<li><code>asciicheck</code>: to <code>v0.0.0-20200416200610-e657995f937b</code></li> +<li><code>wrapcheck</code>: to <code>v0.0.0-20201130113247-1683564d9756</code></li> +<li><code>unparam</code>: to <code>v0.0.0-20210104141923-aac4ce9116a7</code></li> +</ul> +</li> +<li>CLI: truncate multiline descriptions</li> +<li>fix: new-from-rev for a large repository</li> +<li>Support RelatedInformation for analysis Diagnostic</li> +<li>use go1.16 to create binaries</li> +<li>fix: MIPS release</li> +<li>documentation: +<ul> +<li>bump documentation dependencies</li> +<li>fix <code>go-header</code> usage</li> +<li>improve <code>gocritic</code> description</li> +<li>update deprecated hyperlink for Sublime Text plugin</li> +<li>add docs on using homebrew tap</li> +</ul> +</li> +</ol> +<h2>January 2021<span class="hx:absolute hx:-mt-20" id="january-2021"></span> +<a href="#january-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>predeclared</code>: <a href="https://github.com/nishanths/predeclared"target="_blank" rel="noopener">https://github.com/nishanths/predeclared</a></li> +<li><code>ifshort</code>: <a href="https://github.com/esimonov/ifshort"target="_blank" rel="noopener">https://github.com/esimonov/ifshort</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>go-critic</code> from 0.5.2 to 0.5.3</li> +<li><code>thelper</code> from 0.1.0 to 0.2.1</li> +<li>Validate <code>go-critic</code> settings</li> +<li><code>gofumpt</code> to v0.1.0</li> +<li><code>gci</code> to v0.2.8</li> +<li><code>go-mnd</code> to v2.3.1</li> +<li><code>gosec</code> from 2.5.0 to 2.6.1</li> +<li><code>godot</code> from 1.3.2 to 1.4.3</li> +<li><code>ifshort</code> to v1.0.1</li> +<li><code>rowserrcheck</code>: fix reports false positive</li> +</ul> +</li> +<li>fix: modules-download-mode support</li> +<li>documentation: +<ul> +<li>bump documentation dependencies</li> +</ul> +</li> +</ol> +<h2>December 2020<span class="hx:absolute hx:-mt-20" id="december-2020"></span> +<a href="#december-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>forbidigo</code>: <a href="https://github.com/ashanbrown/forbidigo"target="_blank" rel="noopener">https://github.com/ashanbrown/forbidigo</a></li> +<li><code>makezero</code>: <a href="https://github.com/ashanbrown/makezero"target="_blank" rel="noopener">https://github.com/ashanbrown/makezero</a></li> +<li><code>thelper</code>: <a href="https://github.com/kulti/thelper"target="_blank" rel="noopener">https://github.com/kulti/thelper</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>go-header</code> from v0.3.1 to v0.4.2</li> +<li><code>go-mnd</code> from v2.0.0 to v2.2.0</li> +<li><code>godot</code> from v1.3.0 to v1.3.2</li> +<li><code>gci</code> from v0.2.4 to v0.2.7</li> +<li><code>gomodguard</code> from v1.1.0 to v1.2.0</li> +<li><code>go-errorlint</code> from v0.0.0-20201006195004-351e25ade6e3 to v0.0.0-20201127212506-19bd8db6546f</li> +<li><code>gofumpt</code> from v0.0.0-20200802201014-ab5a8192947d to v0.0.0-20201129102820-5c11c50e9475</li> +<li><code>nolintlint</code> fix comment analysis. (#1571)</li> +</ul> +</li> +<li>result/processors: treat all non-Go source as special autogenerated files</li> +<li>throw an error on panic. (#1540)</li> +<li>resolve custom linters&rsquo; path relative to config file directory (#1572)</li> +<li>treat all non-Go source as special autogenerated files</li> +<li>documentation: +<ul> +<li>add settings examples for <code>gocritic</code> (#1562)</li> +<li>removing reference to no-longer-existing linter-in-the-cloud (#1553)</li> +</ul> +</li> +<li>others: +<ul> +<li>bump <code>gopkg.in/yaml.v2</code> from 2.3.0 to 2.4.0 (#1528)</li> +<li>bump <code>gatsby-remark-responsive-iframe</code> in /docs (#1533)</li> +<li>bump <code>gatsby-remark-images</code> from 3.3.29 to 3.6.0 in /docs (#1531)</li> +<li>bump <code>ini</code> from 1.3.5 to 1.3.8 in /tools (#1560)</li> +<li>bump <code>react-headroom</code> from 3.0.0 to 3.0.1 in /docs (#1532)</li> +<li>bump <code>react-live</code> from 2.2.2 to 2.2.3 in /docs (#1534)</li> +<li>bump <code>react</code> from 16.13.1 to 16.14.0 in /docs (#1481)</li> +<li>Fix <code>forbidigo</code> linter name in reports (#1590)</li> +</ul> +</li> +</ol> +<h2>November 2020<span class="hx:absolute hx:-mt-20" id="november-2020"></span> +<a href="#november-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>paralleltest</code>: <a href="https://github.com/kunwardeep/paralleltest"target="_blank" rel="noopener">https://github.com/kunwardeep/paralleltest</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>godot</code> from v0.4.9 to v1.3.0</li> +<li><code>exportloopref</code> from v0.1.7 to v0.1.8</li> +<li><code>gosec</code> from 2.4.0 to 2.5.0</li> +<li><code>goconst</code> using upstream <a href="https://github.com/jgautheron/goconst"target="_blank" rel="noopener">https://github.com/jgautheron/goconst</a></li> +</ul> +</li> +<li><code>DefaultExcludePatterns</code> should only be used for specified linter (#1494)</li> +<li>unknown linter breaks //nolint (#1497)</li> +<li>report all unknown linters at once (#1477)</li> +<li>CI: +<ul> +<li>fix Docker tag for Alpine build</li> +</ul> +</li> +<li>documentation: +<ul> +<li>missing sort-results in the docs (#1514)</li> +<li>add description of Homebrew&rsquo;s official formula (#1421)</li> +</ul> +</li> +<li>others: +<ul> +<li>bump <code>golang.org/x/text</code> to v0.3.4 (#1293)</li> +<li>bump <code>github.com/fatih/color</code> to from 1.9.0 to 1.10.0 (#1485)</li> +<li>bump <code>lodash</code> from 4.17.15 to 4.17.19 in /.github/peril (#1252)</li> +<li>bump <code>polished</code> from 3.6.6 to 4.0.3 in /docs (#1482)</li> +<li>bump <code>gatsby-alias-imports</code> from 1.0.4 to 1.0.6 in /docs (#1479)</li> +<li>bump <code>puppeteer</code> from 5.3.1 to 5.4.1 in /docs (#1480)</li> +<li>bump <code>gatsby-remark-embedder</code> from 3.0.0 to 4.0.0 in /docs (#1478)</li> +</ul> +</li> +</ol> +<h2>October 2020<span class="hx:absolute hx:-mt-20" id="october-2020"></span> +<a href="#october-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>exhaustivestruct</code>: <a href="https://github.com/mbilski/exhaustivestruct"target="_blank" rel="noopener">https://github.com/mbilski/exhaustivestruct</a></li> +<li><code>go-errorlint</code>: <a href="https://github.com/polyfloyd/go-errorlint"target="_blank" rel="noopener">https://github.com/polyfloyd/go-errorlint</a></li> +<li><code>tparallel</code>: <a href="https://github.com/moricho/tparallel"target="_blank" rel="noopener">https://github.com/moricho/tparallel</a></li> +<li><code>wrapcheck</code>: <a href="https://github.com/tomarrell/wrapcheck"target="_blank" rel="noopener">https://github.com/tomarrell/wrapcheck</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>honnef.co/go/tools</code> from 2020.1.5 to 2020.1.6</li> +<li><code>exhaustivestruct</code> from v1.0.1 to v1.1.0</li> +<li><code>exhaustive</code> to v0.1.0</li> +<li><code>gochecknoglobals</code>: use <a href="https://github.com/leighmcculloch/gochecknoglobals"target="_blank" rel="noopener">https://github.com/leighmcculloch/gochecknoglobals</a></li> +</ul> +</li> +<li>add support for powershell completion (#1408)</li> +<li>add <code>.golangci.yaml</code> to list of configuration files searched on startup (#1364)</li> +<li>support for only specifying default severity (#1396)</li> +<li>documentation: +<ul> +<li>mention macports installation procedure on macOS (#1352)</li> +<li>sort linters (#1451)</li> +</ul> +</li> +<li>CI: +<ul> +<li>add codeQL scanning (#1405)</li> +<li>fix version details in Docker image (#1471)</li> +<li>releasing docker image for arm64 (#1383)</li> +<li>change interval for npm to monthly (#1424)</li> +</ul> +</li> +<li>others: +<ul> +<li>use tag version for cobra (#1458)</li> +<li>bump <code>nancy</code> to 1.0.1 (#1410)</li> +<li>bump <code>gatsby-plugin-catch-links</code> in /docs (#1415)</li> +<li>bump <code>gatsby-plugin-mdx</code> from 1.2.40 to 1.2.43 in /docs (#1419)</li> +<li>bump <code>gatsby-plugin-sharp</code> from 2.6.31 to 2.6.40 in /docs (#1423)</li> +<li>bump <code>gatsby-plugin-sitemap</code> from 2.4.12 to 2.4.14 in /docs (#1417)</li> +<li>bump <code>github.com/mattn/go-colorable</code> from 0.1.7 to 0.1.8 (#1413)</li> +<li>bump <code>github.com/sirupsen/logrus</code> from 1.6.0 to 1.7.0 (#1412)</li> +<li>bump <code>github.com/sourcegraph/go-diff</code> from 0.6.0 to 0.6.1 (#1414)</li> +<li>bump <code>golangci/golangci-lint-action</code> from v2 to v2.3.0 (#1447) (#1469)</li> +<li>bump <code>puppeteer</code> from 3.3.0 to 5.3.1 in /docs (#1418)</li> +</ul> +</li> +</ol> +<h2>September 2020<span class="hx:absolute hx:-mt-20" id="september-2020"></span> +<a href="#september-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>update linters: +<ul> +<li><code>godot</code> from 0.4.8 to 0.4.9</li> +<li><code>exhaustive</code> from v0.0.0-20200708172631-8866003e3856 to v0.0.0-20200811152831-6cf413ae40e0</li> +<li><code>gofumpt</code> from v0.0.0-20200709182408-4fd085cb6d5f to v0.0.0-20200802201014-ab5a8192947d</li> +</ul> +</li> +<li>add support for fish completion (#1201)</li> +<li>documentation: +<ul> +<li>fix typo in performance docs (#1350)</li> +</ul> +</li> +<li>CI: +<ul> +<li>prevent macos to be marked as passing upon failure (#1381)</li> +<li>check only for go.mod file (#1397)</li> +<li>check if go.mod and go.sum are up to dated (#1377)</li> +<li>trigger Netlify (#1358)</li> +</ul> +</li> +<li>others: +<ul> +<li>bump <code>github.com/sourcegraph/go-diff</code> from 0.5.3 to 0.6.0 (#1353)</li> +<li>bump <code>github.com/valyala/quicktemplate</code> from 1.6.2 to 1.6.3 (#1385)</li> +<li>ignore known dependency failure in nancy (#1378)</li> +<li>bump <code>@mdx-js/mdx</code> from 1.6.16 to 1.6.18 in /docs (#1401)</li> +<li>bump <code>gatsby</code> from 2.24.52 to 2.24.65 in /docs (#1400)</li> +<li>bump <code>gatsby-plugin-canonical-urls</code> in /docs (#1390)</li> +<li>bump <code>gatsby-plugin-google-analytics</code> in /docs (#1388)</li> +<li>bump <code>gatsby-plugin-manifest</code> from 2.4.23 to 2.4.27 in /docs (#1355)</li> +<li>bump <code>gatsby-plugin-mdx</code> from 1.2.35 to 1.2.40 in /docs (#1386)</li> +<li>bump <code>gatsby-plugin-offline</code> from 3.2.23 to 3.2.27 in /docs (#1368)</li> +<li>bump <code>gatsby-plugin-sharp</code> from 2.6.25 to 2.6.31 in /docs (#1354)</li> +<li>bump <code>gatsby-plugin-sitemap</code> from 2.4.11 to 2.4.12 in /docs (#1344)</li> +<li>bump <code>gatsby-remark-autolink-headers</code> in /docs (#1387)</li> +<li>bump <code>gatsby-remark-images</code> from 3.3.25 to 3.3.28 in /docs (#1345)</li> +<li>bump <code>gatsby-remark-images</code> from 3.3.28 to 3.3.29 in /docs (#1365)</li> +<li>bump <code>gatsby-remark-mermaid</code> from 2.0.0 to 2.1.0 in /docs (#1369)</li> +<li>bump <code>gatsby-source-filesystem</code> in /docs (#1366)</li> +<li>bump <code>gatsby-source-filesystem</code> in /docs (#1389)</li> +<li>bump <code>gatsby-transformer-sharp</code> in /docs (#1402)</li> +<li>bump <code>gatsby-transformer-yaml</code> from 2.4.10 to 2.4.11 in /docs (#1367)</li> +<li>bump <code>node-fetch</code> in /.github/contributors (#1363)</li> +<li>bump <code>polished</code> from 3.6.5 to 3.6.6 in /docs (#1347)</li> +</ul> +</li> +</ol> +<h2>August 2020<span class="hx:absolute hx:-mt-20" id="august-2020"></span> +<a href="#august-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new <code>nlreturn</code> linter: <a href="https://github.com/ssgreg/nlreturn"target="_blank" rel="noopener">https://github.com/ssgreg/nlreturn</a></li> +<li>new <code>gci</code> linter: <a href="https://github.com/daixiang0/gci"target="_blank" rel="noopener">https://github.com/daixiang0/gci</a></li> +<li>support <code>latest</code> version of golangci-lint in golangci-lint-action</li> +<li>update <code>gosec</code> linter from 2.3.0 to 2.4.0</li> +<li>update <code>godot</code> linter from 0.4.2 to 0.4.8</li> +<li>update <code>go-critic</code> from 0.5.0 to 0.5.2 (#1307)</li> +<li>update <code>nlreturn</code> from 2.0.1 to 2.0.2 (#1287), 2.0.2 to 2.1.0 (#1327)</li> +<li>update <code>gci</code> to v0.2.1 (#1292), to v0.2.2 (#1305), to v0.2.4 (#1337),</li> +<li>update <code>funlen</code> from 0.0.2 to 0.0.3 (#1341)</li> +<li>upgrade to golang 1.15 for smaller binary (#1303)</li> +<li>support short and json formats for version cmd (#1315)</li> +<li>add home directory to config file search paths (#1325)</li> +<li>allow for serializing multiple golangci-lint invocations (#1302)</li> +</ol> +<h2>July 2020<span class="hx:absolute hx:-mt-20" id="july-2020"></span> +<a href="#july-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li><code>gofumpt</code> linter: +<ul> +<li>update linter</li> +<li>add <code>extra-rules</code> option</li> +<li>support auto-fixing</li> +</ul> +</li> +<li>upgrade <code>exhaustive</code> linter</li> +<li>upgrade <code>exportloopref</code> linter</li> +<li>improve &rsquo;no such linter&rsquo; error message</li> +<li>sorting result.Issues implementation</li> +<li>enhancements in CI: +<ul> +<li>Run <code>nancy</code> validation for all dependencies</li> +<li>Move dependabot config to <code>.github</code> folder</li> +</ul> +</li> +<li>other +<ul> +<li>bump <code>lodash</code> from 4.17.15 to 4.17.19 in /tools</li> +<li>bump <code>golangci/golangci-lint-action</code> from v1.2.2 to v2</li> +<li>bump <code>github.com/valyala/quicktemplate</code> from 1.5.0 to 1.5.1</li> +</ul> +</li> +</ol> +<h2>June 2020<span class="hx:absolute hx:-mt-20" id="june-2020"></span> +<a href="#june-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add new linters: <code>gofumpt</code></li> +</ol> +<h2>May 2020<span class="hx:absolute hx:-mt-20" id="may-2020"></span> +<a href="#may-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add new linters: <code>nolintlint</code>, <code>goerr113</code></li> +<li>Updated linters: <code>godot</code>, <code>staticcheck</code></li> +<li>Launch a <a href="https://golangci-lint.run/"target="_blank" rel="noopener">website</a></li> +</ol> +<h2>April 2020<span class="hx:absolute hx:-mt-20" id="april-2020"></span> +<a href="#april-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add new linters: <code>testpackage</code>, <code>nestif</code>, <code>godot</code>, <code>gomodguard</code>, <code>asciicheck</code></li> +<li>Add GitHub Actions output format</li> +<li>Update linters: <code>wsl</code>, <code>gomodguard</code>, <code>gosec</code></li> +<li>Support <code>disabled-tags</code> setting for <code>gocritic</code></li> +<li>Mitigate OOM and &ldquo;failed prerequisites&rdquo;</li> +<li>Self-isolate due to unexpected pandemics</li> +<li>Support case-sensitive excludes</li> +<li>Allow granular re-enabling excludes by ID, e.g. <code>EXC0002</code></li> +</ol> +<h2>September 2019<span class="hx:absolute hx:-mt-20" id="september-2019"></span> +<a href="#september-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Support go1.13</li> +<li>Add new linters: <code>funlen</code>, <code>whitespace</code> (with auto-fix) and <code>godox</code></li> +<li>Update linters: <code>gochecknoglobals</code>, <code>scopelint</code>, <code>gosec</code></li> +<li>Provide pre-built binary for ARM and FreeBSD</li> +<li>Fix false-positives in <code>unused</code></li> +<li>Support <code>--skip-dirs-use-default</code></li> +<li>Add support for bash completions</li> +</ol> +<h2>July 2019<span class="hx:absolute hx:-mt-20" id="july-2019"></span> +<a href="#july-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Fix parallel writes race condition</li> +<li>Update bodyclose with fixed panic</li> +</ol> +<h2>June 2019<span class="hx:absolute hx:-mt-20" id="june-2019"></span> +<a href="#june-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Treat Go source files as a plain text by <code>misspell</code>: it allows detecting issues in strings, variable names, etc.</li> +<li>Implement richer and more stable auto-fix of <code>misspell</code> issues.</li> +</ol> +<h2>May 2019<span class="hx:absolute hx:-mt-20" id="may-2019"></span> +<a href="#may-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add <a href="https://github.com/timakin/bodyclose"target="_blank" rel="noopener">bodyclose</a> linter.</li> +<li>Support junit-xml output.</li> +</ol> +<h2>April 2019<span class="hx:absolute hx:-mt-20" id="april-2019"></span> +<a href="#april-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Update go-critic, new checkers were added: badCall, dupImports, evalOrder, newDeref</li> +<li>Fix staticcheck panic on packages that do not compile</li> +<li>Make install script work on Windows</li> +<li>Fix compatibility with the latest x/tools version and update golang.org/x/tools</li> +<li>Correct import path of module sourcegraph/go-diff</li> +<li>Fix <code>max-issues-per-linter</code> name</li> +<li>Fix linting of preprocessed files (e.g. <code>*.qtpl.go</code>, goyacc)</li> +<li>Enable auto-fixing when running via pre-commit</li> +</ol> +<h2>March 2019<span class="hx:absolute hx:-mt-20" id="march-2019"></span> +<a href="#march-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Support the newest <code>go vet</code> (with <code>go/analysis</code>)</li> +<li>Support configuration of <code>go vet</code>: e.g. you can set print functions by <code>linters-settings.govet.settings.printf.funcs</code></li> +<li>Update megacheck (staticcheck) to 2019.1.1</li> +<li>Add <a href="https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint"target="_blank" rel="noopener">information</a> about controlling space-time trade-off into README</li> +<li>Exclude issues by source code line regexp by <code>issues.exclude-rules[i].source</code></li> +<li>Build and test on go 1.12</li> +<li>Support <code>--color</code> option</li> +<li>Update x/tools to fix c++ issues</li> +<li>Include support for log level</li> +<li>Sort linters list in help commands</li> +</ol>Configuration Filehttps://golangci-lint.run/docs/configuration/file/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/configuration/file/ +<p>Golangci-lint looks for config files in the following paths from the current working directory:</p> +<ul> +<li><code>.golangci.yml</code></li> +<li><code>.golangci.yaml</code></li> +<li><code>.golangci.toml</code></li> +<li><code>.golangci.json</code></li> +</ul> +<p>Golangci-lint also searches for config files in all directories from the directory of the first analyzed path up to the root. +If no configuration file has been found, golangci-lint will try to find one in your home directory. +To see which config file is being used and where it was sourced from run golangci-lint with <code>-v</code> option.</p> +<p>Config options inside the file are identical to command-line options. +You can configure specific linters&rsquo; options only within the config file (not the command-line).</p> +<p>There is a <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.reference.yml"target="_blank" rel="noopener"><code>.golangci.reference.yml</code></a> file with all supported options, their descriptions, and default values. +This file is neither a working example nor a recommended configuration, +it&rsquo;s just a reference to display all the configuration options used to generate the documentation.</p> +<p>The configuration file can be validated with the JSON Schema: <a href="https://golangci-lint.run/jsonschema/golangci.jsonschema.json"target="_blank" rel="noopener">golangci.jsonschema.json</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># See the dedicated &#34;version&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;linters&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;formatters&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;issues&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Output configuration options.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;output&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Options for analysis running.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;run&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;severity&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>version</code> configuration<span class="hx:absolute hx:-mt-20" id="version-configuration"></span> +<a href="#version-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Defines the configuration version.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The only possible value is &#34;2&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>linters</code> configuration<span class="hx:absolute hx:-mt-20" id="linters-configuration"></span> +<a href="#linters-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Linters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/linters/configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Linters Settings</span></a> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default set of linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The value can be:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `all`: enables all linters by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `none`: disables all linters by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `fast`: enables only linters considered as &#34;fast&#34; (`golangci-lint help linters --json | jq &#39;[ .[] | select(.fast==true) ] | map(.name)&#39;`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: standard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable specific linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">arangolint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asasalint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asciicheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bidichk</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bodyclose</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">canonicalheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">containedctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contextcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copyloopvar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cyclop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">depguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dogsled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupword</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">durationcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">embeddedstructfieldcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errchkjson</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustruct</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exptostd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fatcontext</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forbidigo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forcetypeassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funcorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ginkgolinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocheckcompilerdirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoglobals</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoinits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecksumtype</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocognit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocritic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godoclint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godot</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godox</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomoddirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomodguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goprintffuncname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosmopolitan</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">govet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">grouper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inamedparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ineffassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">interfacebloat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">intrange</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iotamixing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ireturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loggercheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">maintidx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">makezero</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mirror</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">misspell</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">musttag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nakedret</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnesserr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nlreturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noinlineerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nolintlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nonamedreturns</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nosprintfhostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paralleltest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">perfsprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">prealloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">predeclared</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">promlinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">protogetter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">recvcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">revive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rowserrcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloglint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">spancheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlclosecheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagliatelle</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testableexamples</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testifylint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testpackage</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tparallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unconvert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unqueryvet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unused</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usestdlibvars</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usetesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">varnamelen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wastedassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl_v5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">zerologlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable specific linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">arangolint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asasalint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asciicheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bidichk</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bodyclose</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">canonicalheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">containedctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contextcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copyloopvar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cyclop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">depguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dogsled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupword</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">durationcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">embeddedstructfieldcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errchkjson</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exhaustruct</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exptostd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fatcontext</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forbidigo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forcetypeassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funcorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ginkgolinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocheckcompilerdirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoglobals</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecknoinits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gochecksumtype</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocognit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocritic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godoclint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godot</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">godox</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goheader</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomoddirectives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomodguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goprintffuncname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosmopolitan</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">govet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">grouper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inamedparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ineffassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">interfacebloat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">intrange</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iotamixing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ireturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loggercheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">maintidx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">makezero</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mirror</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">misspell</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">musttag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nakedret</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnesserr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilnil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nlreturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noctx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">noinlineerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nolintlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nonamedreturns</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nosprintfhostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paralleltest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">perfsprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">prealloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">predeclared</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">promlinter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">protogetter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">recvcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">revive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rowserrcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloglint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">spancheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlclosecheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tagliatelle</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testableexamples</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testifylint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testpackage</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tparallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unconvert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unqueryvet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unused</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usestdlibvars</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">usetesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">varnamelen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wastedassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wsl_v5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">zerologlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># All available settings of specific linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;linters.settings&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines a set of rules to ignore issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It does not skip the analysis, and so does not ignore &#34;typecheck&#34; errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mode of the generated files analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `strict`: sources are excluded by strictly following the Go generated file convention.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This line must appear before the first non-comment, non-blank text in the file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go.dev/s/generatedcode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `disable`: disable the generated files exclusion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: strict</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Log a warning if an exclusion rule is unused.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">warn-unused</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Predefined exclusion rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Excluding configuration per-path, per-linter, per-text and per-source.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude some linters from running on tests files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">_test\.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run some linter only for test files by excluding its issues for everything else.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="l">_test\.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">forbidigo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude known linters from partially hard-vendored code,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># which is impossible to exclude via `nolint` comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `/` will be replaced by the current OS file path separator to properly work on Windows.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">internal/hmac/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;weak cryptographic primitive&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude some `staticcheck` messages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;SA9003:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude `lll` issues for long lines with `go:generate`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^//go:generate &#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which file paths to exclude: they will be analyzed, but issues from them won&#39;t be reported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#34;/&#34; will be replaced by the current OS file path separator to properly work on Windows.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*\\.my\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which file paths to not exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths-except</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*\\.my\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>formatters</code> configuration<span class="hx:absolute hx:-mt-20" id="formatters-configuration"></span> +<a href="#formatters-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"/></svg>Formatters Overview</span></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/formatters/configuration" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4"/></svg>Formatters Settings</span></a> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable specific formatter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [] (uses standard Go formatting)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gci</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofumpt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goimports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">golines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">swaggo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Formatters settings.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the dedicated &#34;formatters.settings&#34; documentation section.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">option</span><span class="p">:</span><span class="w"> </span><span class="l">value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Log a warning if an exclusion path is unused.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">warn-unused</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mode of the generated files analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `strict`: sources are excluded by strictly following the Go generated file convention.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This line must appear before the first non-comment, non-blank text in the file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go.dev/s/generatedcode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `disable`: disable the generated files exclusion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: lax</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">strict</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which file paths to exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This option is ignored when using `--stdin` as the path is unknown.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*\\.my\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>issues</code> configuration<span class="hx:absolute hx:-mt-20" id="issues-configuration"></span> +<a href="#issues-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum issues count per one linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to 0 to disable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 50</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-issues-per-linter</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum count of issues with the same text.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to 0 to disable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-same-issues</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Make issues output unique by line.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uniq-by-line</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues: if there are unstaged changes or untracked files,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># only those changes are analyzed, else only changes in HEAD~ are analyzed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It&#39;s a super-useful option for integration of golangci-lint into existing large codebase.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It&#39;s not practical to fix all existing issues at the moment of integration:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># much better don&#39;t allow issues in new code.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues created after the best common ancestor (merge-base against HEAD).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new-from-merge-base</span><span class="p">:</span><span class="w"> </span><span class="l">main</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues created after git revision `REV`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new-from-rev</span><span class="p">:</span><span class="w"> </span><span class="l">HEAD</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show only new issues created in git patch with set file path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">new-from-patch</span><span class="p">:</span><span class="w"> </span><span class="l">path/to/patch/file</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show issues in any part of update files (requires new-from-rev or new-from-patch).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">whole-files</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Fix found issues (if it&#39;s supported by the linter).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fix</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>output</code> configuration<span class="hx:absolute hx:-mt-20" id="output-configuration"></span> +<a href="#output-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Output configuration options.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The formats used to render issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in a text format with colors, line number, and linter name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This format is the default format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Print linter name in the end of issue text.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Print lines of code with issue.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-issued-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use colors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in a JSON representation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in columns representation separated by tabulations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Print linter name in the end of issue text.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use colors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in an HTML page.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It uses the Cloudflare CDN (cdnjs) and React.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">html</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.html</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the Checkstyle format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkstyle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.xml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the Code Climate format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">code-climate</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the JUnit XML format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">junit-xml</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.xml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Support extra JUnit XML fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extended</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the TeamCity format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">teamcity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Prints issues in the SARIF format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sarif</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Output path can be either `stdout`, `stderr` or path to the file to write to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./path/to/output.json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Add a prefix to the output file references.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This option is ignored when using `output.path-mode: abs` mode.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path-prefix</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, the report are related to the path obtained by `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The mode `abs` allows to show absolute file paths instead of relative file paths.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The option `output.path-prefix` is ignored when using `abs` mode.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path-mode</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;abs&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Order to use when sorting results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Possible values: `file`, `linter`, and `severity`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If the severity values are inside the following list, they are ordered in this order:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 1. error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 2. warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 3. high</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 4. medium</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># 5. low</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Either they are sorted alphabetically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;linter&#34;, &#34;file&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sort-order</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">linter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">severity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">file</span><span class="w"> </span><span class="c"># filepath, line, and column.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show statistics per linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-stats</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>run</code> configuration<span class="hx:absolute hx:-mt-20" id="run-configuration"></span> +<a href="#run-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Options for analysis running.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Timeout for total work, e.g. 30s, 5m, 5m30s.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If the value is lower or equal to 0, the timeout is disabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0 (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The mode used to evaluate relative paths.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It&#39;s used by exclusions, Go plugins, and some linters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The value can be:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `gomod`: the paths will be relative to the directory of the `go.mod` file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `cfg`: the paths will be relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: cfg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">relative-path-mode</span><span class="p">:</span><span class="w"> </span><span class="l">gomod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exit code when at least one issue was found.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">issues-exit-code</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include test files or not.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tests</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of build tags, all linters use it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">build-tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mytag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If set, we pass it to &#34;go list -mod={option}&#34;. From &#34;go help modules&#34;:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If invoked with -mod=readonly, the go command is disallowed from the implicit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># automatic updating of go.mod described above. Instead, it fails when any changes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># to go.mod are needed. This setting is most useful to check that go.mod does</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># not need updates, such as in a continuous integration and testing system.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If invoked with -mod=vendor, the go command assumes that the vendor</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># directory holds the correct copies of dependencies and ignores</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># the dependency descriptions in go.mod.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allowed values: readonly|vendor|mod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules-download-mode</span><span class="p">:</span><span class="w"> </span><span class="l">readonly</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow multiple parallel golangci-lint instances running.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If false, golangci-lint acquires file lock on start.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-parallel-runners</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow multiple golangci-lint instances running, but serialize them around a lock.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If false, golangci-lint exits with an error if it fails to acquire file lock on start.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-serial-runners</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define the Go version limit.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1.23&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0 (automatically set to match Linux container CPU quota and</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># fall back to the number of logical CPUs in the machine)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">concurrency</span><span class="p">:</span><span class="w"> </span><span class="m">4</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2><code>severity</code> configuration<span class="hx:absolute hx:-mt-20" id="severity-configuration"></span> +<a href="#severity-configuration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set the default severity for issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If severity rules are defined and the issues do not match or no severity is provided to the rule</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># this will be the default severity applied.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Severities should match the supported severity names of the selected out format.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># When a list of severity rules are provided, severity information will be added to lint issues.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Severity rules have the same filtering capability as exclude rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># except you are allowed to specify one matcher per severity rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only affects out formats that support setting severity information.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Go Plugin Systemhttps://golangci-lint.run/docs/plugins/go-plugins/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/plugins/go-plugins/ +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200"> +<div class="hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2"><svg height=1.2em class="hx:inline-block hx:align-middle" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg></div> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><strong>We recommend using <a href="https://golangci-lint.run/docs/plugins/module-plugins/">Module Plugin System</a> instead of the Go Plugin System.</strong></div> +</div> +</div> +<p>Private linters can be added through <a href="https://pkg.go.dev/plugin"target="_blank" rel="noopener">Go&rsquo;s plugin system</a>.</p> +<p>For a private linter (which acts as a plugin) to work properly, +the plugin as well as the golangci-lint binary <strong>needs to be built for the same environment</strong>.</p> +<p><code>CGO_ENABLED</code> is another requirement.</p> +<p>This means that <code>golangci-lint</code> needs to be built for whatever machine you intend to run it on +(cloning the golangci-lint repository and running a <code>CGO_ENABLED=1 make build</code> should do the trick for your machine).</p> +<h2>Create a Plugin<span class="hx:absolute hx:-mt-20" id="create-a-plugin"></span> +<a href="#create-a-plugin" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Your linter must provide one or more <code>golang.org/x/tools/go/analysis.Analyzer</code> structs.</p> +<p>Your project should also use <code>go.mod</code>.</p> +<p>All versions of libraries that overlap <code>golangci-lint</code> (including replaced libraries) MUST be set to the same version as <code>golangci-lint</code>. +You can see the versions by running <code>go version -m golangci-lint</code>.</p> +<p>You&rsquo;ll also need to create a Go file like <code>plugin/example.go</code>.</p> +<p>This file MUST be in the package <code>main</code>, and MUST define an exposed function called <code>New</code> with the following signature:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">New</span><span class="p">(</span><span class="nx">conf</span> <span class="kt">any</span><span class="p">)</span> <span class="p">([]</span><span class="o">*</span><span class="nx">analysis</span><span class="p">.</span><span class="nx">Analyzer</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>See <a href="https://github.com/golangci/example-plugin-linter/blob/HEAD/plugin/example.go"target="_blank" rel="noopener">plugin/example.go</a> for more info.</p> +<p>To build the plugin, from the root project directory, run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go build -buildmode<span class="o">=</span>plugin plugin/example.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>This will create a plugin <code>*.so</code> file that can be copied into your project or another well-known location for usage in <code>golangci-lint</code>.</p> +<h2>Configure a Plugin<span class="hx:absolute hx:-mt-20" id="configure-a-plugin"></span> +<a href="#configure-a-plugin" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If you already have a linter plugin available, you can follow these steps to define its usage in a projects <code>.golangci.yml</code> file.</p> +<p>An example linter can be found at <a href="https://github.com/golangci/example-plugin-linter"target="_blank" rel="noopener">here</a>.</p> +<p>If you&rsquo;re looking for instructions on how to configure your own custom linter, they can be found further down.</p> +<ol> +<li>If the project you want to lint does not have one already, copy the <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.yml"target="_blank" rel="noopener">.golangci.yml</a> to the root directory.</li> +<li>Adjust the YAML to appropriate <code>linters.settings.custom</code> entries as so:</li> +</ol> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.golangci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">example</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/example.so</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">The description of the linter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">original-url</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/golangci/example-linter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> </span><span class="c"># Settings are optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">one</span><span class="p">:</span><span class="w"> </span><span class="l">Foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">two</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">three</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Bar</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>That is all the configuration that is required to run a custom linter in your project.</p> +<p>Custom linters are enabled by default, but abide by the same rules as other linters.</p> +<p>If the &lsquo;disable all&rsquo; option is specified either on command line or in <code>.golangci.yml</code> files <code>linters.default: none</code>, custom linters will be disabled; +they can be re-enabled by adding them to the <code>linters.enable</code> list, +or providing the enabled option on the command line, <code>golangci-lint run -Eexample</code>.</p> +<p>The configuration inside the <code>linters.settings</code> field of linter have some limitations (there are NOT related to the plugin system itself): +we use Viper to handle the configuration, but Viper put all the keys in lowercase, and <code>.</code> cannot be used inside a key.</p>Quick Starthttps://golangci-lint.run/docs/welcome/quick-start/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/quick-start/ +<h2>Linting<span class="hx:absolute hx:-mt-20" id="linting"></span> +<a href="#linting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To run golangci-lint:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>It&rsquo;s an equivalent of:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run ./...</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You can choose which directories or files to analyze:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run dir1 dir2/... +</span></span><span class="line"><span class="cl">golangci-lint run file1.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Directories are NOT analyzed recursively. +To analyze them recursively append <code>/...</code> to their path. +It&rsquo;s not possible to mix files and packages/directories, and files must come from the same package.</p> +<p>Golangci-lint can be used with zero configuration. By default, the following linters are enabled:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint <span class="nb">help</span> linters +</span></span><span class="line"><span class="cl"><span class="go">Enabled by default linters: +</span></span></span><span class="line"><span class="cl"><span class="go">errcheck: Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases. +</span></span></span><span class="line"><span class="cl"><span class="go">govet: Vet examines Go source code and reports suspicious constructs. It is roughly the same as &#39;go vet&#39; and uses its passes. [auto-fix] +</span></span></span><span class="line"><span class="cl"><span class="go">ineffassign: Detects when assignments to existing variables are not used. [fast] +</span></span></span><span class="line"><span class="cl"><span class="go">staticcheck: It&#39;s the set of rules from staticcheck. [auto-fix] +</span></span></span><span class="line"><span class="cl"><span class="go">unused: Checks Go code for unused constants, variables, functions and types. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Pass <code>-E/--enable</code> to enable linter and <code>-D/--disable</code> to disable:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --default<span class="o">=</span>none -E errcheck</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>More information about available linters can be found in the <a href="https://golangci-lint.run/docs/linters/">linters page</a>.</p> +<h2>Formatting<span class="hx:absolute hx:-mt-20" id="formatting"></span> +<a href="#formatting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To format your code:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint fmt</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You can choose which directories or files to analyze:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint fmt dir1 dir2/... +</span></span><span class="line"><span class="cl">golangci-lint fmt file1.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>More information about available formatters can be found in the <a href="https://golangci-lint.run/docs/formatters/">formatters page</a>.</p>Settingshttps://golangci-lint.run/docs/formatters/configuration/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/formatters/configuration/ +<h2>gci<span class="hx:absolute hx:-mt-20" id="gci"></span> +<a href="#gci" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if code and import statements are formatted, with additional rules.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.30.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/daixiang0/gci" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Section configuration to compare against.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Section names are case-insensitive and may contain parameters in ().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The default order of sections is `standard &gt; default &gt; custom &gt; blank &gt; dot &gt; alias &gt; localmodule`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If `custom-order` is `true`, it follows the order of `sections` option.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;standard&#34;, &#34;default&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sections</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">standard # Standard section</span><span class="p">:</span><span class="w"> </span><span class="l">captures all standard packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">default # Default section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all imports that could not be matched to another section type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">prefix(github.com/org/project) # Custom section</span><span class="p">:</span><span class="w"> </span><span class="l">groups all imports with the specified Prefix.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">blank # Blank section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all blank imports. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">dot # Dot section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all dot imports. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alias # Alias section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all alias imports. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">localmodule # Local module section</span><span class="p">:</span><span class="w"> </span><span class="l">contains all local packages. This section is not present unless explicitly enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that no inline comments are present.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-inline-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that no prefix comments (comment lines above an import) are present.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-prefix-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable custom order of sections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If `true`, make the section order the same as the order of `sections`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom-order</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Drops lexical ordering for custom sections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-lex-order</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gofmt<span class="hx:absolute hx:-mt-20" id="gofmt"></span> +<a href="#gofmt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if the code is formatted according to 'gofmt' command.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://pkg.go.dev/cmd/gofmt" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify code: gofmt with `-s` option.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simplify</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Apply the rewrite rules to the source before reformatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://pkg.go.dev/cmd/gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rewrite-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;interface{}&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replacement</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;any&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;a[b:len(a)]&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replacement</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;a[b:]&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gofumpt<span class="hx:absolute hx:-mt-20" id="gofumpt"></span> +<a href="#gofumpt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if code and import statements are formatted, with additional rules.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/mvdan/gofumpt" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofumpt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Module path which contains the source code being formatted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">module-path</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/org/project</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Choose whether to use the extra rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-rules</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goimports<span class="hx:absolute hx:-mt-20" id="goimports"></span> +<a href="#goimports" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if the code and import statements are formatted according to the 'goimports' command.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://pkg.go.dev/golang.org/x/tools/cmd/goimports" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goimports</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A list of prefixes, which, if set, checks import paths</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># with the given prefixes are grouped after 3rd-party packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-prefixes</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/org/project</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>golines<span class="hx:absolute hx:-mt-20" id="golines"></span> +<a href="#golines" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if code is formatted, and fixes long lines.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/segmentio/golines" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">golines</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Target maximum line length.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 100</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-len</span><span class="p">:</span><span class="w"> </span><span class="m">200</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Length of a tabulation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab-len</span><span class="p">:</span><span class="w"> </span><span class="m">8</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Shorten single-line comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shorten-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reformat-tags</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Split chained methods on the dots as opposed to the arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">chain-split-dots</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>swaggo<span class="hx:absolute hx:-mt-20" id="swaggo"></span> +<a href="#swaggo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if swaggo comments are formatted.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/swaggo/swaggo" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p>Settingshttps://golangci-lint.run/docs/linters/configuration/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/linters/configuration/ +<h2>arangolint<span class="hx:absolute hx:-mt-20" id="arangolint"></span> +<a href="#arangolint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Opinionated best practices for arangodb client.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<a href="https://github.com/Crocmagnon/arangolint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>asasalint<span class="hx:absolute hx:-mt-20" id="asasalint"></span> +<a href="#asasalint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check for pass []any as any in variadic func(&hellip;any).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.47.0</div> +</div> +<a href="https://github.com/alingse/asasalint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">asasalint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To specify a set of function names to exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The values are merged with the builtin exclusions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;^(fmt|log|logger|t|)\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Append</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">\.Wrapf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To enable/disable the asasalint builtin exclusions of function names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the default value of `exclude` to get the builtin exclusions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">use-builtin-exclusions</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>asciicheck<span class="hx:absolute hx:-mt-20" id="asciicheck"></span> +<a href="#asciicheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that all code identifiers does not have non-ASCII symbols in the name.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.26.0</div> +</div> +<a href="https://github.com/golangci/asciicheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>bidichk<span class="hx:absolute hx:-mt-20" id="bidichk"></span> +<a href="#bidichk" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for dangerous unicode character sequences.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/breml/bidichk" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bidichk</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The following configurations check for all mentioned invisible Unicode runes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># All runes are enabled by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">left-to-right-embedding</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">right-to-left-embedding</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pop-directional-formatting</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">left-to-right-override</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">right-to-left-override</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">left-to-right-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">right-to-left-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first-strong-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pop-directional-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>bodyclose<span class="hx:absolute hx:-mt-20" id="bodyclose"></span> +<a href="#bodyclose" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks whether HTTP response body is closed successfully.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.18.0</div> +</div> +<a href="https://github.com/timakin/bodyclose" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>canonicalheader<span class="hx:absolute hx:-mt-20" id="canonicalheader"></span> +<a href="#canonicalheader" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Canonicalheader checks whether net/http.Header uses canonical header.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.58.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/lasiar/canonicalheader" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>containedctx<span class="hx:absolute hx:-mt-20" id="containedctx"></span> +<a href="#containedctx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Containedctx is a linter that detects struct contained context.Context field.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/sivchari/containedctx" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>contextcheck<span class="hx:absolute hx:-mt-20" id="contextcheck"></span> +<a href="#contextcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check whether the function uses a non-inherited context.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/kkHAIKE/contextcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>copyloopvar<span class="hx:absolute hx:-mt-20" id="copyloopvar"></span> +<a href="#copyloopvar" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter detects places where loop variables are copied.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.57.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/karamaru-alpha/copyloopvar" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">copyloopvar</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check all assigning the loop variable to another variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-alias</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>cyclop<span class="hx:absolute hx:-mt-20" id="cyclop"></span> +<a href="#cyclop" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks function and package cyclomatic complexity.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.37.0</div> +</div> +<a href="https://github.com/bkielbasa/cyclop" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cyclop</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The maximal code complexity to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The maximal average package complexity.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If it&#39;s higher than 0.0 (float) the check is enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">package-average</span><span class="p">:</span><span class="w"> </span><span class="m">0.5</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>decorder<span class="hx:absolute hx:-mt-20" id="decorder"></span> +<a href="#decorder" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check declaration order and count of types, constants, variables and functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://gitlab.com/bosi/decorder" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">decorder</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Required order of `type`, `const`, `var` and `func` declarations inside a file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: types before constants before variables before functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dec-order</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">type</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">const</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">var</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">func</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, underscore vars (vars with &#34;_&#34; as the name) will be ignored at all checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (underscore vars are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-underscore-vars</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, order of declarations is not checked at all.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-dec-order-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, `init` func can be anywhere in file (does not have to be declared before all other functions).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-init-func-first-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, multiple global `type`, `const` and `var` declarations are allowed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, type declarations will be ignored for dec num check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (type statements are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-type-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, const declarations will be ignored for dec num check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (const statements are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-const-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, var declarations will be ignored for dec num check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (var statements are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-var-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>depguard<span class="hx:absolute hx:-mt-20" id="depguard"></span> +<a href="#depguard" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Go linter that checks if package imports are in a list of acceptable packages.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.4.0</div> +</div> +<a href="https://github.com/OpenPeeDeeP/depguard" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">depguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Rules to apply.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Variables:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - File Variables</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use an exclamation mark `!` to negate a variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example: `!$test` matches any file that is not a go test file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `$all` - matches all go files</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `$test` - matches all go test files</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Package Variables</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `$gostd` - matches all of go&#39;s standard library (Pulled from `GOROOT`)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default (applies if no custom rules are defined): Only allow $gostd in all files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Name of a rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">main</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines package matching behavior. Available modes:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `original`: allowed if it doesn&#39;t match the deny list and either matches the allow list or the allow list is empty.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `strict`: allowed only if it matches the allow list and either doesn&#39;t match the deny list or the allow rule is more specific (longer) than the deny rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lax`: allowed if it doesn&#39;t match the deny list or the allow rule is more specific (longer) than the deny rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;original&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">list-mode</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of file globs that will match this list of settings to compare against.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${base-path}&#39; is substituted with a path relative to the mode defined with `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${config-path}&#39; is substituted with a path relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: $all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;!**/*_a _file.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">$gostd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/OpenPeeDeeP</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of packages that are not allowed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">deny</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;math/rand$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="l">use math/rand/v2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;github.com/sirupsen/logrus&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="l">not allowed</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;github.com/pkg/errors&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="l">Should be replaced by standard lib errors package</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>dogsled<span class="hx:absolute hx:-mt-20" id="dogsled"></span> +<a href="#dogsled" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<a href="https://github.com/alexkohler/dogsled" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dogsled</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks assignments with too many blank identifiers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-blank-identifiers</span><span class="p">:</span><span class="w"> </span><span class="m">3</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>dupl<span class="hx:absolute hx:-mt-20" id="dupl"></span> +<a href="#dupl" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects duplicate fragments of code.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/mibk/dupl" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dupl</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tokens count to trigger issue.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 150</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">threshold</span><span class="p">:</span><span class="w"> </span><span class="m">100</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>dupword<span class="hx:absolute hx:-mt-20" id="dupword"></span> +<a href="#dupword" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for duplicate words in the source code.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.50.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Abirdcfly/dupword" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dupword</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords for detecting duplicate words.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If this list is not empty, only the words defined in this list will be detected.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">keywords</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;the&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;and&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;a&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords used to ignore detection.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;0C0C&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>durationcheck<span class="hx:absolute hx:-mt-20" id="durationcheck"></span> +<a href="#durationcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check for two durations multiplied together.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.37.0</div> +</div> +<a href="https://github.com/charithe/durationcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>embeddedstructfieldcheck<span class="hx:absolute hx:-mt-20" id="embeddedstructfieldcheck"></span> +<a href="#embeddedstructfieldcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Embedded types should be at the top of the field list of a struct, and there must be an empty line separating embedded fields from regular fields.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<a href="https://github.com/manuelarte/embeddedstructfieldcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">embeddedstructfieldcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that there is an empty space between the embedded fields and regular fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">empty-line</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid-mutex</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>err113<span class="hx:absolute hx:-mt-20" id="err113"></span> +<a href="#err113" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check errors handling expressions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.26.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Djarvur/go-err113" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>errcheck<span class="hx:absolute hx:-mt-20" id="errcheck"></span> +<a href="#errcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/kisielk/errcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report about not checking of errors in type assertions: `a := b.(MyStruct)`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Such cases aren&#39;t reported by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-type-assertions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Such cases aren&#39;t reported by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-blank</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To disable the errcheck built-in exclude list.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-default-exclusions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of functions to exclude from checking, where each entry is a single function to exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/kisielk/errcheck#excluding-functions for details.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io/ioutil.ReadFile</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(*bytes.Buffer)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(os.Stdout)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Display function signature instead of selector.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">verbose</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>errchkjson<span class="hx:absolute hx:-mt-20" id="errchkjson"></span> +<a href="#errchkjson" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks types passed to the json encoding functions. Reports unsupported types and reports occurrences where the check for the returned error can be omitted.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/breml/errchkjson" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errchkjson</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># With check-error-free-encoding set to true, errchkjson does warn about errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># from json encoding functions that are safe to be ignored,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># because they are not possible to happen.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># if check-error-free-encoding is set to true and errcheck linter is enabled,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># it is recommended to add the following exceptions to prevent from false positives:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># linters:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># settings:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># errcheck:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># exclude-functions:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - encoding/json.Marshal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - encoding/json.MarshalIndent</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-error-free-encoding</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Issue on struct encoding that doesn&#39;t have exported fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-no-exported</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>errname<span class="hx:absolute hx:-mt-20" id="errname"></span> +<a href="#errname" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that sentinel errors are prefixed with the <code>Err</code> and error types are suffixed with the <code>Error</code>.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.42.0</div> +</div> +<a href="https://github.com/Antonboom/errname" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>errorlint<span class="hx:absolute hx:-mt-20" id="errorlint"></span> +<a href="#errorlint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find code that can cause problems with the error wrapping scheme introduced in Go 1.13.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.32.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/polyfloyd/go-errorlint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorlint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check whether fmt.Errorf uses the %w verb for formatting errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the https://github.com/polyfloyd/go-errorlint for caveats.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorf</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Permit more than 1 %w verb, valid per Go 1.20 (requires `errorf: true`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorf-multi</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for plain type assertions and type switches.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">asserts</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for plain error comparisons.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">comparison</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allowed errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed-errors</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">err</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;io.EOF&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fun</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/pkg.Read&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allowed error &#34;wildcards&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed-errors-wildcard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">err</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/pkg.ErrMagic&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fun</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/pkg.Magic&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>exhaustive<span class="hx:absolute hx:-mt-20" id="exhaustive"></span> +<a href="#exhaustive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check exhaustiveness of enum switch statements.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<a href="https://github.com/nishanths/exhaustive" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exhaustive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Program elements to check for exhaustiveness.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [ switch ]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">map</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Presence of &#34;default&#34; case in switch statements satisfies exhaustiveness,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># even if all enum members are not listed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-signifies-exhaustive</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enum members matching the supplied regex do not have to be listed in</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># switch statements to satisfy exhaustiveness.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-enum-members</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Example.+&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enum types matching the supplied regex do not have to be listed in</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># switch statements to satisfy exhaustiveness.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-enum-types</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Example.+&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Consider enums only in package scopes, not in inner scopes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">package-scope-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only run exhaustive check on switches with &#34;//exhaustive:enforce&#34; comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">explicit-exhaustive-switch</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only run exhaustive check on map literals with &#34;//exhaustive:enforce&#34; comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">explicit-exhaustive-map</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Switch statement requires default case even if exhaustive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-case-required</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>exhaustruct<span class="hx:absolute hx:-mt-20" id="exhaustruct"></span> +<a href="#exhaustruct" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if all structure fields are initialized.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.46.0</div> +</div> +<a href="https://github.com/GaijinEntertainment/go-exhaustruct" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exhaustruct</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regular expressions to match type names that should be processed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Anonymous structs can be matched by &#39;&lt;anonymous&gt;&#39; alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each regular expression must match the full type name, including package path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but not `http\.Cookie`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.+\.Test&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example\.com/package\.ExampleStruct[\d]{1,2}&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regular expressions to match type names that should be excluded from processing.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Anonymous structs can be matched by &#39;&lt;anonymous&gt;&#39; alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Has precedence over `include`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each regular expression must match the full type name, including package path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but not `http\.Cookie`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.+/cobra\.Command$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allows empty structures, effectively excluding them from the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regular expressions to match type names that should be allowed to be empty.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Anonymous structs can be matched by &#39;&lt;anonymous&gt;&#39; alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each regular expression must match the full type name, including package path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but not `http\.Cookie`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty-rx</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*/http\.Cookie&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allows empty structures in return statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty-returns</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allows empty structures in variable declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty-declarations</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>exptostd<span class="hx:absolute hx:-mt-20" id="exptostd"></span> +<a href="#exptostd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects functions from golang.org/x/exp/ that can be replaced by std functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.63.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ldez/exptostd" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>fatcontext<span class="hx:absolute hx:-mt-20" id="fatcontext"></span> +<a href="#fatcontext" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects nested contexts in loops and function literals.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.58.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Crocmagnon/fatcontext" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fatcontext</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for potential fat contexts in struct pointers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># May generate false positives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-struct-pointers</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>forbidigo<span class="hx:absolute hx:-mt-20" id="forbidigo"></span> +<a href="#forbidigo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Forbids identifiers.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.34.0</div> +</div> +<a href="https://github.com/ashanbrown/forbidigo" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the following identifiers (list of regexp).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;^(fmt\\.Print(|f|ln)|print|println)$&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Built-in bootstrapping functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^print(ln)?$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional message that gets included in error reports.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^fmt\.Print.*$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="l">Do not commit print statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Alternatively, put messages at the end of the regex, surrounded by `(# )?`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Escape any special characters. Those messages get included in error reports.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;fmt\.Print.*(# Do not commit print statements\.)?&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid spew Dump, whether it is called as function or method.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Depends on analyze-types below.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^spew\.(ConfigState\.)?Dump$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The package name might be ambiguous.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The full import path can be used as additional criteria.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Depends on analyze-types below.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^v1.Dump$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">^example.com/pkg/api/v1$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude godoc examples from forbidigo checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-godoc-examples</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Instead of matching the literal source code,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># use type information to replace expressions with strings that contain the package name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and (for methods and fields) the type name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This makes it possible to handle import renaming and forbid struct fields and methods.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">analyze-types</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>forcetypeassert<span class="hx:absolute hx:-mt-20" id="forcetypeassert"></span> +<a href="#forcetypeassert" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find forced type assertions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<a href="https://github.com/gostaticanalysis/forcetypeassert" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>funcorder<span class="hx:absolute hx:-mt-20" id="funcorder"></span> +<a href="#funcorder" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks the order of functions, methods, and constructors.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.1.0</div> +</div> +<a href="https://github.com/manuelarte/funcorder" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funcorder</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that constructors are placed after the structure declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">constructor</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks if the exported methods of a structure are placed before the non-exported ones.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">struct-method</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks if the constructors and/or structure methods are sorted alphabetically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alphabetical</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>funlen<span class="hx:absolute hx:-mt-20" id="funlen"></span> +<a href="#funlen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for long functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.18.0</div> +</div> +<a href="https://github.com/ultraware/funlen" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funlen</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks the number of lines in a function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If lower than 0, disable the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 60</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">lines</span><span class="p">:</span><span class="w"> </span>-<span class="m">1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks the number of statements in a function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If lower than 0, disable the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 40</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">statements</span><span class="p">:</span><span class="w"> </span>-<span class="m">1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore comments when counting lines.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>ginkgolinter<span class="hx:absolute hx:-mt-20" id="ginkgolinter"></span> +<a href="#ginkgolinter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Enforces standards of using ginkgo and gomega.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.51.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/nunnatsa/ginkgolinter" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ginkgolinter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong length assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-len-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong nil assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-nil-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong error assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-err-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong comparison assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-compare-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the function all in async assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-async-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress warning for comparing values from different types, like `int32` and `uint32`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-type-compare-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trigger warning for ginkgo focus containers like `FDescribe`, `FContext`, `FWhen` or `FIt`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid-focus-container</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Don&#39;t trigger warnings for HaveLen(0)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-havelen-zero</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force using `Expect` with `To`, `ToNot` or `NotTo`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Reject using `Expect` with `Should` or `ShouldNot`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-expect-to</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Best effort validation of async intervals (timeout and polling).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignored the `suppress-async-assertion` is true.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">validate-async-intervals</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid-spec-pollution</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-succeed</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force adding assertion descriptions to gomega matchers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-assertion-description</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force using `ToNot`, `ShouldNot` instead of `To(Not())`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-tonot</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocheckcompilerdirectives<span class="hx:absolute hx:-mt-20" id="gocheckcompilerdirectives"></span> +<a href="#gocheckcompilerdirectives" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that go compiler directive comments (//go:) are valid.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.51.0</div> +</div> +<a href="https://github.com/leighmcculloch/gocheckcompilerdirectives" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>gochecknoglobals<span class="hx:absolute hx:-mt-20" id="gochecknoglobals"></span> +<a href="#gochecknoglobals" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check that no global variables exist.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.12.0</div> +</div> +<a href="https://github.com/leighmcculloch/gochecknoglobals" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>gochecknoinits<span class="hx:absolute hx:-mt-20" id="gochecknoinits"></span> +<a href="#gochecknoinits" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that no init functions are present in Go code.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.12.0</div> +</div> +</p> +<p><em>No settings available.</em></p> +<h2>gochecksumtype<span class="hx:absolute hx:-mt-20" id="gochecksumtype"></span> +<a href="#gochecksumtype" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Run exhaustiveness checks on Go &quot;sum types&quot;.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<a href="https://github.com/alecthomas/go-check-sumtype" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gochecksumtype</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-signifies-exhaustive</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include shared interfaces in the exhaustiveness check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include-shared-interfaces</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocognit<span class="hx:absolute hx:-mt-20" id="gocognit"></span> +<a href="#gocognit" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Computes and checks the cognitive complexity of functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<a href="https://github.com/uudashr/gocognit" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocognit</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal code complexity to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 30 (but we recommend 10-20)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">10</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goconst<span class="hx:absolute hx:-mt-20" id="goconst"></span> +<a href="#goconst" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Finds repeated strings that could be replaced by a constant.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/jgautheron/goconst" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goconst</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal length of string constant.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-len</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimum occurrences of constant string count to trigger issue.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-occurrences</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Look for existing constants matching the values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">match-constant</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Search also for duplicated numbers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">numbers</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimum value, only works with `goconst.numbers`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum value, only works with `goconst.numbers`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore when constant is not used as function argument.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-calls</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude strings matching the given regular expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-string-values</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;foo.+&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects constants with identical values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">find-duplicates</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Evaluates of constant expressions like Prefix + &#34;suffix&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">eval-const-expressions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocritic<span class="hx:absolute hx:-mt-20" id="gocritic"></span> +<a href="#gocritic" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Provides diagnostics that check for bugs, performance and style issues. +Extensible without recompilation through dynamic rules. +Dynamic rules are written declaratively with AST patterns, filters, report message and optional suggestion.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.12.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/go-critic/go-critic" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocritic</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable all checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which checks should be enabled in addition to default checks; can&#39;t be combined with &#39;disabled-checks&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, list of stable checks is used (https://go-critic.com/overview#checks-overview):</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># appendAssign, argOrder, assignOp, badCall, badCond, captLocal, caseOrder, codegenComment, commentFormatting,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># defaultCaseOrder, deprecatedComment, dupArg, dupBranchBody, dupCase, dupSubExpr, elseif, exitAfterDefer,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># flagDeref, flagName, ifElseChain, mapKey, newDeref, offBy1, regexpMust, singleCaseSwitch, sloppyLen,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># sloppyTypeAssert, switchTrue, typeSwitchVar, underef, unlambda, unslice, valSwap, wrapperFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled-checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious append result assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#appendassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendAssign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects `append` chains to the same slice that can be done in a single `append` call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#appendcombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious arguments order.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#argorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">argOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects assignments that can be simplified by using assignment operators.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#assignop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assignOp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious function calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious condition expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badcond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious mutex lock/unlock operations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badlock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badLock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious regexp patterns.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badregexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badRegexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects bad usage of sort package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badsorting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSorting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects bad usage of sync.OnceFunc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badsynconcefunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSyncOnceFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects bool expressions that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#boolexprsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">boolExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects when predeclared identifiers are shadowed in assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#builtinshadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects top-level declarations that shadow the predeclared identifiers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#builtinshadowdecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadowDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects capitalized names for local variables.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#captlocal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">captLocal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects erroneous case order inside switch statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#caseorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">caseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects malformed &#39;code generated&#39; file comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#codegencomment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">codegenComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects comments with non-idiomatic formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#commentformatting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentFormatting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects commented-out code inside function bodies.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#commentedoutcode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutCode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects commented-out imports.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#commentedoutimport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects when default case in switch isn&#39;t on 1st or last position.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#defaultcaseorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defaultCaseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects loops inside functions that use defer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#deferinloop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferInLoop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects deferred function literals that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#deferunlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferUnlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects malformed &#39;deprecated&#39; doc-comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#deprecatedcomment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecatedComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects comments that silence go lint complaints about doc-comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#docstub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">docStub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious duplicated arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#duparg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupArg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects duplicated branch bodies inside conditional statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupbranchbody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupBranchBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects duplicated case clauses inside switch or select statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupcase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupCase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects multiple imports of the same package under different aliases.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupimport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious duplicated sub-expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupsubexpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupSubExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious formatting strings usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dynamicfmtstring</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dynamicFmtString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects else with nested if statement that can be replaced with else-if.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#elseif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">elseif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious empty declarations blocks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#emptydecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects fallthrough that can be avoided by using multi case values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#emptyfallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyFallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects empty string checks that can be written more idiomatically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#emptystringtest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyStringTest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unoptimal strings/bytes case-insensitive comparison.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#equalfold</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equalFold</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unwanted dependencies on the evaluation order.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#evalorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">evalOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects calls to exit/fatal inside functions that use defer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#exitafterdefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exitAfterDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects exposed methods from sync.Mutex and sync.RWMutex.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#exposedsyncmutex</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exposedSyncMutex</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious reassignment of error from another package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#externalerrorreassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">externalErrorReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects problems in filepath.Join() function calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#filepathjoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">filepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects immediate dereferencing of `flag` package pointers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#flagderef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious flag names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#flagname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagName</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects hex literals that have mixed case letter digits.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#hexliteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hexLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects nil usages in http.NewRequest calls, suggesting http.NoBody as an alternative.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#httpnobody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpNoBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects params that incur excessive amount of copying.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#hugeparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hugeParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects repeated if-else statements and suggests to replace them with switch statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#ifelsechain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifElseChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects when imported package names shadowed in the assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#importshadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects strings.Index calls that may cause unwanted allocs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#indexalloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">indexAlloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects non-assignment statements inside if/switch init clause.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#initclause</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">initClause</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious map literal keys.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#mapkey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mapKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects method expression call that can be replaced with a method call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#methodexprcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">methodExprCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Finds where nesting level could be reduced.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#nestingreduce</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestingReduce</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects immediate dereferencing of `new` expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#newderef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">newDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects return statements those results evaluate to nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#nilvalreturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilValReturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects old-style octal literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#octalliteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">octalLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects various off-by-one kind of errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#offby1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">offBy1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects if function parameters could be combined by type and suggest the way to do it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#paramtypecombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paramTypeCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects expressions like []rune(s)[0] that may cause unwanted rune slice allocation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferdecoderune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferDecodeRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects concatenation with os.PathSeparator which can be replaced with filepath.Join.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferfilepathjoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFilepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects fmt.Sprint(f/ln) calls which can be replaced with fmt.Fprint(f/ln).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferfprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects w.Write or io.WriteString calls which can be replaced with w.WriteString.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferstringwriter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferStringWriter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects WriteRune calls with rune literal argument that is single byte and reports to use WriteByte instead.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferwritebyte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferWriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects input and output parameters that have a type of pointer to referential type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#ptrtorefparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ptrToRefParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects append all its data while range it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#rangeappendall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeAppendAll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects expensive copies of `for` loop range expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#rangeexprcopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeExprCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects loops that copy big objects during each iteration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#rangevalcopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeValCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant fmt.Sprint calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#redundantsprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">redundantSprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#regexpmust</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpMust</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious regexp patterns.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#regexppattern</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpPattern</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects regexp patterns that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#regexpsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious http.Error call without following return.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#returnafterhttperror</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">returnAfterHttpError</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Runs user-defined rules using ruleguard linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#ruleguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ruleguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects switch statements that could be better written as if statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#singlecaseswitch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">singleCaseSwitch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects slice clear loops, suggests an idiom that is recognized by the Go compiler.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sliceclear</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sliceClear</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects usage of `len` when result is obvious or doesn&#39;t make sense.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sloppylen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyLen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious/confusing re-assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sloppyreassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant type assertions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sloppytypeassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyTypeAssert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious sort.Slice calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sortslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortSlice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects &#34;%s&#34; formatting directives that can be replaced with %q.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sprintfquotedstring</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sprintfQuotedString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects issue in Query() and Exec() calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sqlquery</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlQuery</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects string concat operations that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#stringconcatsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringConcatSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant conversions between string and []byte.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#stringxbytes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringXbytes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects strings.Compare usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#stringscompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringsCompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects switch-over-bool statements that use explicit `true` tag value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#switchtrue</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switchTrue</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects sync.Map load+delete operations that can be replaced with LoadAndDelete.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#syncmaploadanddelete</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">syncMapLoadAndDelete</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects manual conversion to milli- or microseconds.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#timeexprsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects TODO comments without detail/assignee.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#todocommentwithoutdetail</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">todoCommentWithoutDetail</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects function with too many results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#toomanyresultschecker</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tooManyResultsChecker</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects potential truncation issues when comparing ints of different sizes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#truncatecmp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">truncateCmp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects repeated type assertions and suggests to replace them with type switch statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typeassertchain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeAssertChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects method declarations preceding the type definition itself.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typedeffirst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeDefFirst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects type switches that can benefit from type guard clause with variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typeswitchvar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeSwitchVar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unneeded parenthesis inside type expressions and suggests to remove them.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typeunparen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeUnparen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unchecked errors in if statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#uncheckedinlineerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">uncheckedInlineErr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects dereference expressions that can be omitted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#underef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">underef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant statement labels.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unlabelstmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlabelStmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects function literals that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unnamed results that may benefit from names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unnamedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnamedResult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unnecessary braced statement blocks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unnecessaryblock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryBlock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundantly deferred calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unnecessarydefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects slice expressions that can be simplified to sliced expression itself.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects value swapping code that are not using parallel assignment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#valswap</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">valSwap</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects conditions that are unsafe due to not being exhaustive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#weakcond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">weakCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ensures that `//nolint` comments include an explanation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#whynolint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whyNoLint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects function calls that can be replaced with convenience wrappers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#wrapperfunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapperFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects Yoda style expressions and suggests to replace them.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#yodastyleexpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yodaStyleExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which checks should be disabled; can&#39;t be combined with &#39;enabled-checks&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled-checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendAssign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">argOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assignOp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badLock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badRegexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSorting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSyncOnceFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">boolExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadowDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">captLocal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">caseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">codegenComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentFormatting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutCode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defaultCaseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferInLoop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferUnlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecatedComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">docStub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupArg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupBranchBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupCase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupSubExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dynamicFmtString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">elseif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyFallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyStringTest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equalFold</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">evalOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exitAfterDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exposedSyncMutex</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">externalErrorReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">filepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagName</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hexLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpNoBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hugeParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifElseChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">indexAlloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">initClause</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mapKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">methodExprCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestingReduce</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">newDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilValReturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">octalLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">offBy1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paramTypeCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferDecodeRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFilepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferStringWriter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferWriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ptrToRefParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeAppendAll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeExprCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeValCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">redundantSprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpMust</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpPattern</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">returnAfterHttpError</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ruleguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">singleCaseSwitch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sliceClear</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyLen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyTypeAssert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortSlice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sprintfQuotedString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlQuery</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringConcatSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringXbytes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringsCompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switchTrue</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">syncMapLoadAndDelete</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">todoCommentWithoutDetail</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tooManyResultsChecker</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">truncateCmp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeAssertChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeDefFirst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeSwitchVar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeUnparen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">uncheckedInlineErr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">underef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlabelStmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnamedResult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryBlock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">valSwap</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">weakCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whyNoLint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapperFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yodaStyleExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable multiple checks by tags in addition to default checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic` to see all tags and checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/go-critic/go-critic#usage -&gt; section &#34;Tags&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled-tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">diagnostic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">performance</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">experimental</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">opinionated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled-tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">diagnostic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">performance</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">experimental</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">opinionated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Settings passed to gocritic.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The settings key is the name of a supported gocritic checker.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The list of supported checkers can be found at https://go-critic.com/overview.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Must be valid enabled check name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">captLocal</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to restrict checker to params only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paramsOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commentedOutCode</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Min length of the comment that triggers a warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 15</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">minLength</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">elseif</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to skip balanced if-else pairs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipBalanced</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">hugeParam</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size in bytes that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 80</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sizeThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">70</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ifElseChain</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Min number of if-else blocks that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">minThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nestingReduce</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Min number of statements inside a branch to trigger a warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bodyWidth</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rangeExprCopy</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size in bytes that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 512</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sizeThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">516</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to check test functions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipTestFuncs</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rangeValCopy</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size in bytes that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 128</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sizeThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">32</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to check test functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipTestFuncs</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ruleguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable debug to identify which &#39;Where&#39; condition was rejected.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The value of the parameter is the name of a function in a ruleguard file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># When a rule is evaluated:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The Match() clause is accepted; and</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># One of the conditions in the Where() clause is rejected,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Then:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ruleguard prints the specific Where() condition that was rejected.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The option is passed to the ruleguard &#39;debug-group&#39; argument.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">debug</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;emptyDecl&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Determines the behavior when an error occurs while parsing ruleguard files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If flag is not set, log error and skip rule files that contain an error.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If flag is set, the value must be a comma-separated list of error conditions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#39;all&#39;: fail on all errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#39;import&#39;: ruleguard rule imports a package that cannot be found.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#39;dsl&#39;: gorule file does not comply with the ruleguard DSL.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">failOn</span><span class="p">:</span><span class="w"> </span><span class="l">dsl,import</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of file paths containing ruleguard rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${base-path}&#39; is substituted with a path relative to the mode defined with `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${config-path}&#39; is substituted with a path relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Glob patterns such as &#39;rules-*.go&#39; may be specified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of enabled groups or skip empty to enable everything.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tags can be defined with # character prefix.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&lt;all&gt;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;myGroupName,#myTagName&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of disabled groups or skip empty to enable everything.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tags can be defined with # character prefix.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;myGroupName,#myTagName&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tooManyResultsChecker</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum number of results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">maxResults</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">truncateCmp</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to skip int/uint/uintptr types.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipArchDependent</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">underef</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to skip (*x).method() calls where x is a pointer receiver.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipRecvDeref</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unnamedResult</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to check exported functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkExported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocyclo<span class="hx:absolute hx:-mt-20" id="gocyclo"></span> +<a href="#gocyclo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Computes and checks the cyclomatic complexity of functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/fzipp/gocyclo" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocyclo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal code complexity to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 30 (but we recommend 10-20)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">10</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>godoclint<span class="hx:absolute hx:-mt-20" id="godoclint"></span> +<a href="#godoclint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks Golang's documentation practice (godoc).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.5.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>New</div> +</div> +<a href="https://github.com/godoc-lint/godoc-lint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">godoclint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default set of rules to enable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Possible values are: `basic`, `all` or `none`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: `basic` (enables `pkg-doc`, `single-pkg-doc`, `start-with-name`, and `deprecated`)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of rules to enable in addition to the default set.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check proper package-level godoc, if any.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert at most one godoc per package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#single-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">single-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require all packages to have a godoc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert symbol godocs start with the symbol name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#start-with-name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">start-with-name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require godoc for all public symbols.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert correct formatting of deprecation notes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#deprecated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert maximum line length for godocs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#max-len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">max-len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert no unused link in godocs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#no-unused-link</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="kc">no</span>-<span class="l">unused-link</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of rules to disable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">single-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">start-with-name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">max-len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="kc">no</span>-<span class="l">unused-link</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A map for fine-tuning individual rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># All subkeys are optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">options</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-len</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 77</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">length</span><span class="p">:</span><span class="w"> </span><span class="m">127</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-doc</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore exported (public) symbols when applying the `require-doc` rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-exported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore unexported (private) symbols when applying the `require-doc` rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-unexported</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">start-with-name</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include unexported symbols when applying the `start-with-name` rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include-unexported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>godot<span class="hx:absolute hx:-mt-20" id="godot"></span> +<a href="#godot" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if comments end in a period.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/tetafro/godot" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">godot</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comments to be checked: `declarations`, `toplevel`, `noinline` or `all`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: declarations</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">toplevel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regexps for excluding particular comment lines from check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude todo and fixme comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^fixme:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^todo:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check that each sentence ends with a period.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">period</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check that each sentence starts with a capital letter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">capital</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>godox<span class="hx:absolute hx:-mt-20" id="godox"></span> +<a href="#godox" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects usage of FIXME, TODO and other keywords inside comments.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<a href="https://github.com/matoous/godox" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">godox</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report any comments starting with keywords, this is useful for TODO or FIXME comments that</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># might be left in the code accidentally and should be resolved before merging.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;TODO&#34;, &#34;BUG&#34;, &#34;FIXME&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">keywords</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NOTE</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">OPTIMIZE</span><span class="w"> </span><span class="c"># marks code that should be optimized before merging</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">HACK</span><span class="w"> </span><span class="c"># marks hack-around that should be removed before merging</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goheader<span class="hx:absolute hx:-mt-20" id="goheader"></span> +<a href="#goheader" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if file header matches to pattern.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/denis-tingaikin/go-header" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goheader</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supports two types &#39;const` and `regexp`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values can be used recursively.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: {}</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">values</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">const</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define here const type values in format k:v.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">COMPANY</span><span class="p">:</span><span class="w"> </span><span class="l">MY COMPANY</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">regexp</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define here regexp type values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># for example:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">AUTHOR</span><span class="p">:</span><span class="w"> </span><span class="l">.*@mycompany\.com</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The template used for checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Put here copyright header template for source code files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="p">|-</span><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> {{ AUTHOR }} {{ COMPANY }} {{ YEAR }} +</span></span></span><span class="line"><span class="cl"><span class="sd"> SPDX-License-Identifier: Apache-2.0 +</span></span></span><span class="line"><span class="cl"><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); +</span></span></span><span class="line"><span class="cl"><span class="sd"> you may not use this file except in compliance with the License. +</span></span></span><span class="line"><span class="cl"><span class="sd"> You may obtain a copy of the License at: +</span></span></span><span class="line"><span class="cl"><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> http://www.apache.org/licenses/LICENSE-2.0 +</span></span></span><span class="line"><span class="cl"><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> Unless required by applicable law or agreed to in writing, software +</span></span></span><span class="line"><span class="cl"><span class="sd"> distributed under the License is distributed on an &#34;AS IS&#34; BASIS, +</span></span></span><span class="line"><span class="cl"><span class="sd"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +</span></span></span><span class="line"><span class="cl"><span class="sd"> See the License for the specific language governing permissions and +</span></span></span><span class="line"><span class="cl"><span class="sd"> limitations under the License.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># As alternative of directive &#39;template&#39;, you may put the path to file with the template source.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Useful if you need to load the template from a specific file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${base-path}&#39; is substituted with a path relative to the mode defined with `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${config-path}&#39; is substituted with a path relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">template-path</span><span class="p">:</span><span class="w"> </span><span class="l">/path/to/my/template.tmpl</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gomoddirectives<span class="hx:absolute hx:-mt-20" id="gomoddirectives"></span> +<a href="#gomoddirectives" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.39.0</div> +</div> +<a href="https://github.com/ldez/gomoddirectives" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gomoddirectives</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow local `replace` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace-local</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed `replace` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace-allow-list</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">launchpad.net/gocheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow to not explain why the version has been retracted in the `retract` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retract-allow-no-explanation</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `exclude` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `ignore` directives (&gt;= go1.25).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `toolchain` directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">toolchain-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines a pattern to validate `toolchain` directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#39;&#39; (no match)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">toolchain-pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;go1\.23\.\d+$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `tool` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tool-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `godebug` directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-debug-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines a pattern to validate `go` minimum version directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#39;&#39; (no match)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-version-pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;\d\.\d+(\.0)?&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gomodguard<span class="hx:absolute hx:-mt-20" id="gomodguard"></span> +<a href="#gomodguard" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Allow and blocklist linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<a href="https://github.com/ryancurrah/gomodguard" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gomodguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed modules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gopkg.in/yaml.v2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed module domains.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">domains</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">golang.org</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">blocked</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of blocked modules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Blocked module.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">github.com/uudashr/go-module</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Recommended modules that should be used instead. (Optional)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">recommendations</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">golang.org/x/mod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Reason why the recommended module should be used. (Optional)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reason</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;`mod` is the official go.mod parser library.&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of blocked module version constraints.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">versions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Blocked module with version constraint.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">github.com/mitchellh/go-homedir</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Version constraint, see https://github.com/Masterminds/semver#basic-comparisons.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&lt; 1.1.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Reason why the version constraint exists. (Optional)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reason</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;testing if blocked version constraint works.&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to true to raise lint issues for packages that are loaded from a local path via replace directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-replace-directives</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goprintffuncname<span class="hx:absolute hx:-mt-20" id="goprintffuncname"></span> +<a href="#goprintffuncname" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that printf-like functions are named with <code>f</code> at the end.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.23.0</div> +</div> +<a href="https://github.com/golangci/go-printf-func-name" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>gosec<span class="hx:absolute hx:-mt-20" id="gosec"></span> +<a href="#gosec" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Inspects source code for security problems.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/securego/gosec" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gosec</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To select a subset of rules to run.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Available rules: https://github.com/securego/gosec#available-rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [] - means include all rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">includes</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G101</span><span class="w"> </span><span class="c"># Look for hard coded credentials</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G102</span><span class="w"> </span><span class="c"># Bind to all interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G103</span><span class="w"> </span><span class="c"># Audit the use of unsafe block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G104</span><span class="w"> </span><span class="c"># Audit errors not checked</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G106</span><span class="w"> </span><span class="c"># Audit the use of ssh.InsecureIgnoreHostKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G107</span><span class="w"> </span><span class="c"># Url provided to HTTP request as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G108</span><span class="w"> </span><span class="c"># Profiling endpoint automatically exposed on /debug/pprof</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G109</span><span class="w"> </span><span class="c"># Potential Integer overflow made by strconv.Atoi result conversion to int16/32</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G110</span><span class="w"> </span><span class="c"># Potential DoS vulnerability via decompression bomb</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G111</span><span class="w"> </span><span class="c"># Potential directory traversal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G112</span><span class="w"> </span><span class="c"># Potential slowloris attack</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G114</span><span class="w"> </span><span class="c"># Use of net/http serve function that has no support for setting timeouts</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G115</span><span class="w"> </span><span class="c"># Potential integer overflow when converting between integer types</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G201</span><span class="w"> </span><span class="c"># SQL query construction using format string</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G202</span><span class="w"> </span><span class="c"># SQL query construction using string concatenation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G203</span><span class="w"> </span><span class="c"># Use of unescaped data in HTML templates</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G204</span><span class="w"> </span><span class="c"># Audit use of command execution</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G301</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a directory</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G302</span><span class="w"> </span><span class="c"># Poor file permissions used with chmod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G303</span><span class="w"> </span><span class="c"># Creating tempfile using a predictable path</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G304</span><span class="w"> </span><span class="c"># File path provided as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G305</span><span class="w"> </span><span class="c"># File traversal when extracting zip/tar archive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G306</span><span class="w"> </span><span class="c"># Poor file permissions used when writing to a new file</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G307</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a file with os.Create</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G401</span><span class="w"> </span><span class="c"># Detect the usage of MD5 or SHA1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G402</span><span class="w"> </span><span class="c"># Look for bad TLS connection settings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G403</span><span class="w"> </span><span class="c"># Ensure minimum RSA key length of 2048 bits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G404</span><span class="w"> </span><span class="c"># Insecure random number source (rand)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G405</span><span class="w"> </span><span class="c"># Detect the usage of DES or RC4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G406</span><span class="w"> </span><span class="c"># Detect the usage of MD4 or RIPEMD160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G501 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/md5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G502 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/des</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G503 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/rc4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G504 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">net/http/cgi</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G505 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/sha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G506 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/md4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G507 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/ripemd160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G601</span><span class="w"> </span><span class="c"># Implicit memory aliasing of items from a range statement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G602</span><span class="w"> </span><span class="c"># Slice access out of bounds</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To specify a set of rules to explicitly exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Available rules: https://github.com/securego/gosec#available-rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">excludes</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G101</span><span class="w"> </span><span class="c"># Look for hard coded credentials</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G102</span><span class="w"> </span><span class="c"># Bind to all interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G103</span><span class="w"> </span><span class="c"># Audit the use of unsafe block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G104</span><span class="w"> </span><span class="c"># Audit errors not checked</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G106</span><span class="w"> </span><span class="c"># Audit the use of ssh.InsecureIgnoreHostKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G107</span><span class="w"> </span><span class="c"># Url provided to HTTP request as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G108</span><span class="w"> </span><span class="c"># Profiling endpoint automatically exposed on /debug/pprof</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G109</span><span class="w"> </span><span class="c"># Potential Integer overflow made by strconv.Atoi result conversion to int16/32</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G110</span><span class="w"> </span><span class="c"># Potential DoS vulnerability via decompression bomb</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G111</span><span class="w"> </span><span class="c"># Potential directory traversal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G112</span><span class="w"> </span><span class="c"># Potential slowloris attack</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G114</span><span class="w"> </span><span class="c"># Use of net/http serve function that has no support for setting timeouts</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G115</span><span class="w"> </span><span class="c"># Potential integer overflow when converting between integer types</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G201</span><span class="w"> </span><span class="c"># SQL query construction using format string</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G202</span><span class="w"> </span><span class="c"># SQL query construction using string concatenation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G203</span><span class="w"> </span><span class="c"># Use of unescaped data in HTML templates</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G204</span><span class="w"> </span><span class="c"># Audit use of command execution</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G301</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a directory</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G302</span><span class="w"> </span><span class="c"># Poor file permissions used with chmod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G303</span><span class="w"> </span><span class="c"># Creating tempfile using a predictable path</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G304</span><span class="w"> </span><span class="c"># File path provided as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G305</span><span class="w"> </span><span class="c"># File traversal when extracting zip/tar archive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G306</span><span class="w"> </span><span class="c"># Poor file permissions used when writing to a new file</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G307</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a file with os.Create</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G401</span><span class="w"> </span><span class="c"># Detect the usage of MD5 or SHA1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G402</span><span class="w"> </span><span class="c"># Look for bad TLS connection settings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G403</span><span class="w"> </span><span class="c"># Ensure minimum RSA key length of 2048 bits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G404</span><span class="w"> </span><span class="c"># Insecure random number source (rand)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G405</span><span class="w"> </span><span class="c"># Detect the usage of DES or RC4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G406</span><span class="w"> </span><span class="c"># Detect the usage of MD4 or RIPEMD160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G501 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/md5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G502 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/des</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G503 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/rc4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G504 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">net/http/cgi</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G505 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/sha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G506 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/md4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G507 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/ripemd160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G601</span><span class="w"> </span><span class="c"># Implicit memory aliasing of items from a range statement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G602</span><span class="w"> </span><span class="c"># Slice access out of bounds</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Filter out the issues with a lower severity than the given value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Valid options are: low, medium, high.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: low</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">medium</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Filter out the issues with a lower confidence than the given value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Valid options are: low, medium, high.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: low</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">confidence</span><span class="p">:</span><span class="w"> </span><span class="l">medium</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Concurrency value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: the number of logical CPUs usable by the current process.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">concurrency</span><span class="p">:</span><span class="w"> </span><span class="m">12</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To specify the configuration of rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Globals are applicable to all rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">global</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, ignore #nosec in comments (and an alternative as well).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nosec</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Add an alternative comment prefix to #nosec (both will work at the same time).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">&#34;#nosec&#34;: </span><span class="s2">&#34;#my-custom-nosec&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define whether nosec issues are counted as finding or not.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-ignored</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Audit mode enables addition checks that for normal code analysis might be too nosy.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">audit</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G101</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp pattern for variables and constants to find.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;(?i)example&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, complain about all cases (even with low entropy).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore_entropy</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed entropy of the string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;80.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">entropy_threshold</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;80.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed value of entropy/string length.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Is taken into account if entropy &gt;= entropy_threshold/2.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;3.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">per_char_threshold</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Calculate entropy for first N chars of the string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;16&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">truncate</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;32&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Additional functions to ignore while checking unhandled errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Following functions always ignored:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># bytes.Buffer:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Write</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># fmt:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Print</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Printf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Println</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Fprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Fprintf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Fprintln</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># strings.Builder:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Write</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># io.PipeWriter:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - CloseWithError</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># hash.Hash:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Write</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># os:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Unsetenv</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: {}</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G104</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Fscanf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G111</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp pattern to find potential directory traversal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;http\\.Dir\\(\&#34;\\/\&#34;\\)|http\\.Dir\\(&#39;\\/&#39;\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;custom\\.Dir\\(\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed permissions mode for os.Mkdir and os.MkdirAll.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;0750&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G301</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0750&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed permissions mode for os.OpenFile and os.Chmod.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;0600&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G302</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0600&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;0600&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G306</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0600&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gosmopolitan<span class="hx:absolute hx:-mt-20" id="gosmopolitan"></span> +<a href="#gosmopolitan" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Report certain i18n/l10n anti-patterns in your Go codebase.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<a href="https://github.com/xen0n/gosmopolitan" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gosmopolitan</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow and ignore `time.Local` usages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-time-local</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of fully qualified names in the `full/pkg/path.name` form, to act as &#34;i18n escape hatches&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># String literals inside call-like expressions to, or struct literals of those names,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># are exempt from the writing system check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">escape-hatches</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;github.com/nicksnyder/go-i18n/v2/i18n.Message&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example.com/your/project/i18n/markers.Raw&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example.com/your/project/i18n/markers.OK&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example.com/your/project/i18n/markers.TODO&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;command-line-arguments.Simple&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of Unicode scripts to watch for any usage in string literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://pkg.go.dev/unicode#pkg-variables</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;Han&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">watch-for-scripts</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Devanagari</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Han</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Hangul</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Hiragana</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Katakana</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>govet<span class="hx:absolute hx:-mt-20" id="govet"></span> +<a href="#govet" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://pkg.go.dev/cmd/vet" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable all analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable analyzers by name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># appends, asmdecl, assign, atomic, bools, buildtag, cgocall, composites, copylocks, defers, directive, errorsas,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># framepointer, httpresponse, ifaceassert, loopclosure, lostcancel, nilfunc, printf, shift, sigchanyzer, slog,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># stdmethods, stringintconv, structtag, testinggoroutine, tests, timeformat, unmarshal, unreachable, unsafeptr,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># unusedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for missing values after append.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appends</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report mismatches between assembly files and Go declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asmdecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for useless assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for common mistakes using the sync/atomic package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for non-64-bits-aligned arguments to sync/atomic functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomicalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for common mistakes involving boolean operators.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bools</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check //go:build and // +build directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">buildtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detect some violations of the cgo pointer passing rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cgocall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unkeyed composite literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">composites</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for locks erroneously passed by value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copylocks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for calls of reflect.DeepEqual on error values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deepequalerrors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report common mistakes in defer statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check Go toolchain directives such as //go:debug.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">directive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report passing non-pointer or non-error values to errors.As.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorsas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Find structs that would use less memory if their fields were sorted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fieldalignment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Find calls to a particular function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">findcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report assembly that clobbers the frame pointer before saving it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">framepointer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check format of addresses passed to net.Dial.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report using Go 1.22 enhanced ServeMux patterns in older Go versions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpmux</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for mistakes using HTTP responses.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpresponse</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detect impossible interface-to-interface type assertions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifaceassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check references to loop variables from within nested functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loopclosure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check cancel func returned by context.WithCancel is called.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lostcancel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for useless comparisons between functions and nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilfunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for redundant or impossible nil comparisons.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilness</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check consistency of Printf format strings and arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">printf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for comparing reflect.Value values with == or reflect.DeepEqual.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reflectvaluecompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for possible unintended shadowing of variables.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for shifts that equal or exceed the width of the integer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shift</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unbuffered channel of os.Signal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sigchanyzer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for invalid structured logging calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">slog</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check the argument type of sort.Slice.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check signature of methods of well-known interfaces.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdmethods</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report uses of too-new standard library symbols.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdversion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for string(int) conversions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringintconv</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check that struct field tags conform to reflect.StructTag.Get.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">structtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report calls to (*testing.T).Fatal from goroutines started by a test.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testinggoroutine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for common mistaken usages of tests and examples.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tests</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for calls of (time.Time).Format or time.Parse with 2006-02-01.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeformat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report passing non-pointer or non-interface values to unmarshal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unmarshal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unreachable code.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unreachable</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for invalid conversions of uintptr to unsafe.Pointer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unsafeptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unused results of calls to some functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks for unused writes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedwrite</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for misuses of sync.WaitGroup.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">waitgroup</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable analyzers by name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># atomicalign, deepequalerrors, fieldalignment, findcall, nilness, reflectvaluecompare, shadow, sortslice,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># timeformat, unusedwrite</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appends</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asmdecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomicalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bools</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">buildtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cgocall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">composites</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copylocks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deepequalerrors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">directive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorsas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fieldalignment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">findcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">framepointer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpmux</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpresponse</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifaceassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loopclosure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lostcancel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilfunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilness</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">printf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reflectvaluecompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shift</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sigchanyzer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">slog</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdmethods</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdversion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringintconv</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">structtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testinggoroutine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tests</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeformat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unmarshal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unreachable</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unsafeptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedwrite</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">waitgroup</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Settings per analyzer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Analyzer name, run `go tool vet help` to see all analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">printf</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funcs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shadow</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to be strict about shadowing; can be noisy.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unusedresult</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of functions whose results must be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, errors.New, fmt.Errorf,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># fmt.Sprint, fmt.Sprintf, sort.Reverse</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funcs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pkg.MyFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of names of methods of type func() string whose results must be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default Error,String).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">stringmethods</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">MyMethod</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>grouper<span class="hx:absolute hx:-mt-20" id="grouper"></span> +<a href="#grouper" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Analyze expression groups.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/leonklingele/grouper" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">grouper</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single global &#39;const&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">const-require-single-const</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped global &#39;const&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">const-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single &#39;import&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import-require-single-import</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped &#39;import&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single global &#39;type&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type-require-single-type</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped global &#39;type&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single global &#39;var&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">var-require-single-var</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped global &#39;var&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">var-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>iface<span class="hx:absolute hx:-mt-20" id="iface"></span> +<a href="#iface" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detect the incorrect use of interfaces, helping developers avoid interface pollution.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.62.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/uudashr/iface" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">iface</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;identical&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">identical</span><span class="w"> </span><span class="c"># Identifies interfaces in the same package that have identical method sets.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unused</span><span class="w"> </span><span class="c"># Identifies interfaces that are not used anywhere in the same package where the interface is defined.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">opaque</span><span class="w"> </span><span class="c"># Identifies functions that return interfaces, but the actual returned value is always a single concrete implementation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unexported</span><span class="w"> </span><span class="c"># Identifies interfaces that are not exported but are used in exported functions or methods.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unused</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of packages path to exclude from the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/example/log</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>importas<span class="hx:absolute hx:-mt-20" id="importas"></span> +<a href="#importas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Enforces consistent import aliases.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/julz/importas" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">importas</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Do not allow unaliased imports of aliased packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-unaliased</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Do not allow non-required aliases.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-extra-aliases</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of aliases</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">knative.dev/serving/pkg/apis/serving/v1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">servingv1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">knative.dev/serving/pkg/apis/autoscaling/v1alpha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">autoscalingv1alpha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># You can specify the package path by regular expression,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and alias by regular expression expansion syntax like below.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/julz/importas#use-regular-expression for details.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">knative.dev/serving/pkg/apis/(\w+)/(v[\w\d]+)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">$1$2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An explicit empty alias can be used to ensure no aliases are used for a package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This can be useful if `no-extra-aliases: true` doesn&#39;t fit your need.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Multiple packages can use an empty alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>inamedparam<span class="hx:absolute hx:-mt-20" id="inamedparam"></span> +<a href="#inamedparam" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports interfaces with unnamed method parameters.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<a href="https://github.com/macabu/inamedparam" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">inamedparam</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skips check for interface methods with only a single parameter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-single-param</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>ineffassign<span class="hx:absolute hx:-mt-20" id="ineffassign"></span> +<a href="#ineffassign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects when assignments to existing variables are not used.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/gordonklaus/ineffassign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ineffassign</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check escaping variables of type error, may cause false positives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-escaping-errors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>interfacebloat<span class="hx:absolute hx:-mt-20" id="interfacebloat"></span> +<a href="#interfacebloat" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter that checks the number of methods inside an interface.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.49.0</div> +</div> +<a href="https://github.com/sashamelentyev/interfacebloat" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interfacebloat</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The maximum number of methods allowed for an interface.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max</span><span class="p">:</span><span class="w"> </span><span class="m">5</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>intrange<span class="hx:absolute hx:-mt-20" id="intrange"></span> +<a href="#intrange" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Intrange is a linter to find places where for loops could make use of an integer range.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.57.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ckaznocha/intrange" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>iotamixing<span class="hx:absolute hx:-mt-20" id="iotamixing"></span> +<a href="#iotamixing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if iotas are being used in const blocks with other non-iota declarations.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.5.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>New</div> +</div> +<a href="https://github.com/AdminBenni/iota-mixing" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">iotamixing</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to report individual consts rather than just the const block.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-individual</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>ireturn<span class="hx:absolute hx:-mt-20" id="ireturn"></span> +<a href="#ireturn" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Accept Interfaces, Return Concrete Types.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/butuzov/ireturn" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ireturn</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of interfaces to allow.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Lists of the keywords and regular expressions matched to interface or package names can be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `allow` and `reject` settings cannot be used at the same time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `empty` for `interface{}`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `error` for errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `stdlib` for standard library</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `anon` for anonymous interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `generic` for generic interfaces added in go 1.18</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [anon, error, empty, stdlib]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">anon</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># You can specify idiomatic endings for interface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(or|er)$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of interfaces to reject.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Lists of the keywords and regular expressions matched to interface or package names can be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `allow` and `reject` settings cannot be used at the same time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `empty` for `interface{}`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `error` for errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `stdlib` for standard library</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `anon` for anonymous interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `generic` for generic interfaces added in go 1.18</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reject</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com\/user\/package\/v4\.Type</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>lll<span class="hx:absolute hx:-mt-20" id="lll"></span> +<a href="#lll" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports long lines.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.8.0</div> +</div> +</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">lll</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Max line length, lines longer will be reported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;\t&#39; is counted as 1 character by default, and can be changed with the tab-width option.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 120.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">line-length</span><span class="p">:</span><span class="w"> </span><span class="m">120</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tab width in spaces.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab-width</span><span class="p">:</span><span class="w"> </span><span class="m">1</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>loggercheck<span class="hx:absolute hx:-mt-20" id="loggercheck"></span> +<a href="#loggercheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks key value pairs for common logger libraries (kitlog,klog,logr,slog,zap).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.49.0</div> +</div> +<a href="https://github.com/timonwong/loggercheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">loggercheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the github.com/go-kit/log library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">kitlog</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the k8s.io/klog/v2 library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">klog</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the github.com/go-logr/logr library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">logr</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the log/slog library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">slog</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the &#34;sugar logger&#34; from go.uber.org/zap library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">zap</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require all logging keys to be inlined constant strings.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-string-key</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require printf-like format specifier (%s, %d for example) not present.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-printf-like</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">k8s.io/klog/v2.InfoS</span><span class="w"> </span><span class="c"># package level exported functions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/go-logr/logr.Logger).Error</span><span class="w"> </span><span class="c"># &#34;Methods&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(*go.uber.org/zap.SugaredLogger).With</span><span class="w"> </span><span class="c"># Also &#34;Methods&#34;, but with a pointer receiver</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>maintidx<span class="hx:absolute hx:-mt-20" id="maintidx"></span> +<a href="#maintidx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Maintidx measures the maintainability index of each function.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/yagipy/maintidx" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">maintidx</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show functions with maintainability index lower than N.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A high index indicates better maintainability (it&#39;s kind of the opposite of complexity).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 20</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">under</span><span class="p">:</span><span class="w"> </span><span class="m">100</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>makezero<span class="hx:absolute hx:-mt-20" id="makezero"></span> +<a href="#makezero" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find slice declarations with non-zero initial length.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.34.0</div> +</div> +<a href="https://github.com/ashanbrown/makezero" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">makezero</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow only slices initialized with a length of zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">always</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>mirror<span class="hx:absolute hx:-mt-20" id="mirror"></span> +<a href="#mirror" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports wrong mirror patterns of bytes/strings usage.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/butuzov/mirror" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>misspell<span class="hx:absolute hx:-mt-20" id="misspell"></span> +<a href="#misspell" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Finds commonly misspelled English words.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.8.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/golangci/misspell" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">misspell</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Correct spellings using locale preferences for US or UK.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Setting locale to US will correct the British spelling of &#39;colour&#39; to &#39;color&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default is to use a neutral variety of English.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">locale</span><span class="p">:</span><span class="w"> </span><span class="l">US</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Typos to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Should be in lower case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">someword</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Extra word corrections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `typo` and `correction` should only contain letters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The words are case-insensitive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-words</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">typo</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;iff&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">correction</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;if&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">typo</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;cancelation&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">correction</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;cancellation&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mode of the analysis:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - default: checks all the file content.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - restricted: checks only comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">restricted</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>mnd<span class="hx:absolute hx:-mt-20" id="mnd"></span> +<a href="#mnd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>An analyzer to detect magic numbers.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.22.0</div> +</div> +<a href="https://github.com/tommy-muehle/go-mnd" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mnd</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;argument&#34;, &#34;case&#34;, &#34;condition&#34;, &#34;operation&#34;, &#34;return&#34;, &#34;assign&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">argument</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">case</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">condition</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">operation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of numbers to exclude from analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The numbers should be written as string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values always ignored: &#34;1&#34;, &#34;1.0&#34;, &#34;0&#34; and &#34;0.0&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-numbers</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;0666&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;0755&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;42&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of file patterns to exclude from analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values always ignored: `.+_test.go`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;magic1_.+\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of function patterns to exclude from analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Following functions are always ignored: `time.Date`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^math\.&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^http\.StatusText$&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>musttag<span class="hx:absolute hx:-mt-20" id="musttag"></span> +<a href="#musttag" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Enforce field tags in (un)marshaled structs.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.51.0</div> +</div> +<a href="https://github.com/go-simpler/musttag" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">musttag</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A set of custom functions to check in addition to the builtin ones.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: json, xml, gopkg.in/yaml.v3, BurntSushi/toml, mitchellh/mapstructure, jmoiron/sqlx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The full name of the function, including the package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/hashicorp/hcl/v2/hclsimple.DecodeFile</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The struct tag whose presence should be ensured.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">hcl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The position of the argument to check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arg-pos</span><span class="p">:</span><span class="w"> </span><span class="m">2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nakedret<span class="hx:absolute hx:-mt-20" id="nakedret"></span> +<a href="#nakedret" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that functions with naked returns are not longer than a maximum size (can be zero).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/alexkohler/nakedret" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nakedret</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Make an issue if func has more lines of code than this setting, and it has naked returns.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 30</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-func-lines</span><span class="p">:</span><span class="w"> </span><span class="m">31</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nestif<span class="hx:absolute hx:-mt-20" id="nestif"></span> +<a href="#nestif" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports deeply nested if statements.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<a href="https://github.com/nakabonne/nestif" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nestif</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal complexity of if statements to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">4</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nilerr<span class="hx:absolute hx:-mt-20" id="nilerr"></span> +<a href="#nilerr" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find the code that returns nil even if it checks that the error is not nil.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<a href="https://github.com/gostaticanalysis/nilerr" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>nilnesserr<span class="hx:absolute hx:-mt-20" id="nilnesserr"></span> +<a href="#nilnesserr" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports constructs that checks for err != nil, but returns a different nil value error. +Powered by nilness and nilerr.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.63.0</div> +</div> +<a href="https://github.com/alingse/nilnesserr" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>nilnil<span class="hx:absolute hx:-mt-20" id="nilnil"></span> +<a href="#nilnil" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that there is no simultaneous return of <code>nil</code> error and an invalid value.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/Antonboom/nilnil" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nilnil</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To check functions with only two return values (`return nil, nil`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If disabled then returns like `return nil, nil, ..., nil` are supported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">only-two</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># In addition, detect opposite situation (simultaneous return of non-nil error and valid value).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># E.g, `return clone, fh.indexer.Update(clone)` will be considered as invalid.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">detect-opposite</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of return types to check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;chan&#34;, &#34;func&#34;, &#34;iface&#34;, &#34;map&#34;, &#34;ptr&#34;, &#34;uintptr&#34;, &#34;unsafeptr&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checked-types</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">chan</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">func</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">map</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">uintptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unsafeptr</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nlreturn<span class="hx:absolute hx:-mt-20" id="nlreturn"></span> +<a href="#nlreturn" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for a new line before return and branch statements to increase code clarity.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.30.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ssgreg/nlreturn" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nlreturn</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size of the block (including return statement that is still &#34;OK&#34;),</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># so no return split required.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">block-size</span><span class="p">:</span><span class="w"> </span><span class="m">2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>noctx<span class="hx:absolute hx:-mt-20" id="noctx"></span> +<a href="#noctx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects function and method with missing usage of context.Context.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<a href="https://github.com/sonatard/noctx" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>noinlineerr<span class="hx:absolute hx:-mt-20" id="noinlineerr"></span> +<a href="#noinlineerr" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Disallows inline error handling (<code>if err := ...; err != nil {</code>).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<a href="https://github.com/AlwxSin/noinlineerr" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>nolintlint<span class="hx:absolute hx:-mt-20" id="nolintlint"></span> +<a href="#nolintlint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports ill-formed or insufficient nolint directives.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.26.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/golangci/golangci-lint/tree/HEAD/pkg/golinters/nolintlint/internal" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nolintlint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable to ensure that all nolint directives actually have an effect.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-unused</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude following linters from requiring an explanation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-no-explanation</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable to require an explanation of nonzero length after each nolint directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-explanation</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable to require nolint directives to mention the specific linter being suppressed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-specific</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nonamedreturns<span class="hx:absolute hx:-mt-20" id="nonamedreturns"></span> +<a href="#nonamedreturns" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports all named returns.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.46.0</div> +</div> +<a href="https://github.com/firefart/nonamedreturns" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nonamedreturns</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report named error if it is assigned inside defer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-error-in-defer</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nosprintfhostport<span class="hx:absolute hx:-mt-20" id="nosprintfhostport"></span> +<a href="#nosprintfhostport" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for misuse of Sprintf to construct a host with port in a URL.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.46.0</div> +</div> +<a href="https://github.com/stbenjam/no-sprintf-host-port" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>paralleltest<span class="hx:absolute hx:-mt-20" id="paralleltest"></span> +<a href="#paralleltest" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects missing usage of t.Parallel() method in your Go test.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.33.0</div> +</div> +<a href="https://github.com/kunwardeep/paralleltest" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paralleltest</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-missing</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># still required to have `t.Parallel`, but subtests are allowed to skip it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-missing-subtests</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>perfsprint<span class="hx:absolute hx:-mt-20" id="perfsprint"></span> +<a href="#perfsprint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that fmt.Sprintf can be replaced with a faster alternative.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/catenacyber/perfsprint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">perfsprint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of integer formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">integer-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes even if it requires an int or uint type cast.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">int-conversion</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of error formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">error-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">err-error</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes `fmt.Errorf`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorf</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of string formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">string-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes `fmt.Sprintf` with only one argument.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sprintf1</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes into strings concatenation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strconcat</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of bool formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bool-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of hex formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">hex-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>prealloc<span class="hx:absolute hx:-mt-20" id="prealloc"></span> +<a href="#prealloc" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find slice declarations that could potentially be pre-allocated.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<a href="https://github.com/alexkohler/prealloc" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">prealloc</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># IMPORTANT: we don&#39;t recommend using this linter before doing performance profiling.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For most programs usage of prealloc will be a premature optimization.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simple</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report pre-allocation suggestions on range loops.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">range-loops</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report pre-allocation suggestions on for loops.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for-loops</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>predeclared<span class="hx:absolute hx:-mt-20" id="predeclared"></span> +<a href="#predeclared" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find code that shadows one of Go's predeclared identifiers.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.35.0</div> +</div> +<a href="https://github.com/nishanths/predeclared" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of predeclared identifiers to not report on.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include method names and field names in checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">qualified-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>promlinter<span class="hx:absolute hx:-mt-20" id="promlinter"></span> +<a href="#promlinter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check Prometheus metrics naming via promlint.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.40.0</div> +</div> +<a href="https://github.com/yeya24/promlinter" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">promlinter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Promlinter cannot infer all metrics name in static analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable strict mode will also include the errors caused by failing to parse the args.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Please refer to https://github.com/yeya24/promlinter#usage for detailed usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled-linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Help detects issues related to the help text for a metric.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Help</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># MetricUnits detects issues with metric unit names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">MetricUnits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Counter detects issues specific to counters, as well as patterns that should only be used with counters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Counter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># HistogramSummaryReserved detects when other types of metrics use names or labels reserved for use by histograms and/or summaries.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">HistogramSummaryReserved</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># MetricTypeInName detects when metric types are included in the metric name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">MetricTypeInName</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ReservedChars detects colons in metric names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ReservedChars</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># CamelCase detects metric names and label names written in camelCase.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">CamelCase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># UnitAbbreviations detects abbreviated units in the metric name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">UnitAbbreviations</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>protogetter<span class="hx:absolute hx:-mt-20" id="protogetter"></span> +<a href="#protogetter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports direct reads from proto message fields when getters should be used.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ghostiam/protogetter" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">protogetter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip files generated by specified generators from the checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks only the file&#39;s initial comment, which must follow the format: &#34;// Code generated by &lt;generator-name&gt;&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Files generated by protoc-gen-go, protoc-gen-go-grpc, and protoc-gen-grpc-gateway are always excluded automatically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-generated-by</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;protoc-gen-go-my-own-generator&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip files matching the specified glob pattern from the checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;*.pb.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;*/vendor/*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;/full/path/to/file.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip any generated files from the checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-any-generated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip first argument of append function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace-first-arg-in-append</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>reassign<span class="hx:absolute hx:-mt-20" id="reassign"></span> +<a href="#reassign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that package variables are not reassigned.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.49.0</div> +</div> +<a href="https://github.com/curioswitch/go-reassign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reassign</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Patterns for global variable names that are checked for reassignment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/curioswitch/go-reassign#usage</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;EOF&#34;, &#34;Err.*&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">patterns</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>recvcheck<span class="hx:absolute hx:-mt-20" id="recvcheck"></span> +<a href="#recvcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for receiver type consistency.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.62.0</div> +</div> +<a href="https://github.com/raeperd/recvcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">recvcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disables the built-in method exclusions:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalText`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalJSON`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalYAML`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalXML`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalBinary`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `GobEncode`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-builtin</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># User-defined method exclusions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The format is `struct_name.method_name` (ex: `Foo.MethodName`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A wildcard `*` can use as a struct name (ex: `*.MethodName`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;*.Value&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>revive<span class="hx:absolute hx:-mt-20" id="revive"></span> +<a href="#revive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.37.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/mgechev/revive" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">revive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum number of open files at the same time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/mgechev/revive#command-line-flags</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defaults to unlimited.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-open-files</span><span class="p">:</span><span class="w"> </span><span class="m">2048</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Sets the default severity.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/mgechev/revive#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all available rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all-rules</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable validation of comment directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/mgechev/revive#comment-directives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">directives</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">specify-disable-reason</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Sets the default failure confidence.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This means that linting errors with less than 0.8 confidence will be ignored.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0.8</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">confidence</span><span class="p">:</span><span class="w"> </span><span class="m">0.1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Revive handles the default rules in a way that can be unexpected:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - If there are no explicit rules, the default rules are used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - If there is at least one explicit rule, the default rules are not used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#add-constant</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">add-constant</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">max-lit-count</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-strs</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&#34;&#34;&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-ints</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0,1,2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-floats</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0.0,0.,1.0,1.,2.0,2.&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#argument-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">argument-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">4</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#banned-characters</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">banned-characters</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;Ω&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Σ&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;σ&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;7&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bare-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">bare-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#blank-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">blank-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bool-literal-in-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">bool-literal-in-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#call-to-gc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">call-to-gc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cognitive-complexity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cognitive-complexity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">7</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comment-spacings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">comment-spacings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mypragma</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">otherpragma</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comments-density</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">comments-density</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">15</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">confusing-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-results</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">confusing-results</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#constant-logical-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">constant-logical-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-as-argument</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">context-as-argument</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-types-before</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;*testing.T,*github.com/user/repo/testing.Harness&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-keys-type</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">context-keys-type</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cyclomatic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cyclomatic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#datarace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">datarace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#deep-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">deep-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;call-chain&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;loop&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;method-call&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;recover&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;immediate-recover&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;return&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#dot-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dot-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allowed-packages</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;github.com/onsi/ginkgo/v2&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;github.com/onsi/gomega&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#duplicated-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">duplicated-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#early-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">early-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;preserve-scope&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;allow-jump&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">empty-block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-lines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">empty-lines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-map-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-map-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;make&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-repeated-arg-type-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-repeated-arg-type-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;short&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Or this parameter:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">func-arg-style</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;full&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">func-ret-val-style</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;short&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-slice-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-slice-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;make&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-switch-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-switch-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;allowNoDefault&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">error-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">error-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-strings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">error-strings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;xerrors.New&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#errorf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">errorf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#exported</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">exported</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;check-private-receivers&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-stuttering-check&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;say-repetitive-instead-of-stutters&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;check-public-interface&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-constants&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-functions&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-methods&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-types&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-variables&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-header</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">file-header</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">This is the text that must appear at the top of source files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">file-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">max</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-blank-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#filename-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">filename-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^[_a-z][_a-z0-9]*\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#flag-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">flag-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-length</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">function-length</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-result-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">function-result-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#get-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">get-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-ifelseif-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-ifelseif-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-switch-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-switch-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#if-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">if-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-alias-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">import-alias-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^[a-z][a-z0-9]{0,}$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Or this parameter:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^[a-z][a-z0-9]{0,}$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">deny-regex</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^v\d+$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-shadowing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">import-shadowing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#imports-blocklist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">imports-blocklist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;crypto/md5&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;crypto/sha1&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#increment-decrement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">increment-decrement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#indent-error-flow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">indent-error-flow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;preserve-scope&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#line-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">line-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">80</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-control-nesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">max-control-nesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-public-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">max-public-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">modifies-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-value-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">modifies-value-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#nested-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nested-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#optimize-operands-order</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">optimize-operands-order</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">package-comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-directory-mismatch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">package-directory-mismatch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">ignore-directories</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;testcases&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;testinfo&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-address</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">range-val-address</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-in-closure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">range-val-in-closure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#receiver-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">receiver-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">max-length</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redefines-builtin-id</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redefines-builtin-id</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-build-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redundant-build-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-import-alias</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redundant-import-alias</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-test-main-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redundant-test-main-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">string-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="s1">&#39;core.WriteError[1].Message&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;/^([^A-Z]|$)/&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">must not start with a capital letter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="s1">&#39;fmt.Errorf[0]&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;/(^|[^\.!?])$/&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">must not end in punctuation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="l">panic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;/^[^\n]*$/&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">must not contain line breaks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-of-int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">string-of-int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#struct-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">struct-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;json,inline&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;bson,outline,gnu&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#superfluous-else</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">superfluous-else</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;preserve-scope&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-date</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">time-date</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-equal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">time-equal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">time-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unchecked-type-assertion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unchecked-type-assertion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">accept-ignored-assertion-result</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unconditional-recursion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unconditional-recursion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unexported-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unexported-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unhandled-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unhandled-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^fmt.Printf&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;myFunction&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unnecessary-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-stmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unnecessary-stmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unreachable-code</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unreachable-code</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unsecure-url-scheme</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unsecure-url-scheme</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unused-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^_&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unused-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^_&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-any</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-any</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-errors-new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-errors-new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-fmt-print</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-fmt-print</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-waitgroup-go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-waitgroup-go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-break</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">useless-break</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-fallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">useless-fallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-declaration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">var-declaration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">var-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="p">[</span><span class="s2">&#34;ID&#34;</span><span class="p">]</span><span class="w"> </span><span class="c"># AllowList</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="p">[</span><span class="s2">&#34;VM&#34;</span><span class="p">]</span><span class="w"> </span><span class="c"># DenyList</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="nt">skip-initialism-name-checks</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">upper-case-const</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-package-name-checks</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-bad-package-names</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">helpers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">models</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#waitgroup-by-value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">waitgroup-by-value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>rowserrcheck<span class="hx:absolute hx:-mt-20" id="rowserrcheck"></span> +<a href="#rowserrcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks whether Rows.Err of rows is checked successfully.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.23.0</div> +</div> +<a href="https://github.com/jingyugao/rowserrcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rowserrcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># database/sql is always checked.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">packages</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/jmoiron/sqlx</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>sloglint<span class="hx:absolute hx:-mt-20" id="sloglint"></span> +<a href="#sloglint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Ensure consistent code style when using log/slog.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/go-simpler/sloglint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sloglint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce not mixing key-value pairs and attributes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-mixed-arguments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-mixed-args</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-value-pairs-only</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">kv-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#attributes-only</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">attr-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce not using global loggers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;&#34;: disabled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;all&#34;: report all global loggers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;default&#34;: report only the default slog logger</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-global</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;all&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using methods that accept a context.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;&#34;: disabled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;all&#34;: report all contextless calls</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;scope&#34;: report only if a context exists in the scope of the outermost function</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;all&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using static values for log messages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#static-messages</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">static-msg</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce message style.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values: lowercased, capitalized</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#message-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg-style</span><span class="p">:</span><span class="w"> </span><span class="l">capitalized</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using constants instead of raw keys.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-raw-keys</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-raw-keys</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce key naming convention.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values: snake, kebab, camel, pascal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-naming-convention</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">key-naming-case</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce not using specific keys.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#forbidden-keys</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidden-keys</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">time</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">level</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">msg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">source</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce putting arguments on separate lines.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#arguments-on-separate-lines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">args-on-sep-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>spancheck<span class="hx:absolute hx:-mt-20" id="spancheck"></span> +<a href="#spancheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for mistakes with OpenTelemetry/Census spans.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.56.0</div> +</div> +<a href="https://github.com/jjti/go-spancheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">spancheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks to enable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Options include:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `end`: check that `span.End()` is called</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `record-error`: check that `span.RecordError(err)` is called when an error is returned</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `set-status`: check that `span.SetStatus(codes.Error, msg)` is called when an error is returned</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;end&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">end</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">record-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">set-status</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A list of regexes for function signatures that silence `record-error` and `set-status` reports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># if found in the call path to a returned error.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/jjti/go-spancheck#ignore-check-signatures</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-check-signatures</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;telemetry.RecordError&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A list of regexes for additional function signatures that create spans.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This is useful if you have a utility method to create spans.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each entry should be of the form `&lt;regex&gt;:&lt;telemetry-type&gt;`, where `telemetry-type` can be `opentelemetry` or `opencensus`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/jjti/go-spancheck#extra-start-span-signatures</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-start-span-signatures</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;github.com/user/repo/telemetry/trace.Start:opentelemetry&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>sqlclosecheck<span class="hx:absolute hx:-mt-20" id="sqlclosecheck"></span> +<a href="#sqlclosecheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<a href="https://github.com/ryanrolds/sqlclosecheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>staticcheck<span class="hx:absolute hx:-mt-20" id="staticcheck"></span> +<a href="#staticcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It's the set of rules from staticcheck.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/dominikh/go-tools" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">staticcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/configuration/options/#dot_import_whitelist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;github.com/mmcloughlin/avo/build&#34;, &#34;github.com/mmcloughlin/avo/operand&#34;, &#34;github.com/mmcloughlin/avo/reg&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dot-import-whitelist</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/configuration/options/#initialisms</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;ACL&#34;, &#34;API&#34;, &#34;ASCII&#34;, &#34;CPU&#34;, &#34;CSS&#34;, &#34;DNS&#34;, &#34;EOF&#34;, &#34;GUID&#34;, &#34;HTML&#34;, &#34;HTTP&#34;, &#34;HTTPS&#34;, &#34;ID&#34;, &#34;IP&#34;, &#34;JSON&#34;, &#34;QPS&#34;, &#34;RAM&#34;, &#34;RPC&#34;, &#34;SLA&#34;, &#34;SMTP&#34;, &#34;SQL&#34;, &#34;SSH&#34;, &#34;TCP&#34;, &#34;TLS&#34;, &#34;TTL&#34;, &#34;UDP&#34;, &#34;UI&#34;, &#34;GID&#34;, &#34;UID&#34;, &#34;UUID&#34;, &#34;URI&#34;, &#34;URL&#34;, &#34;UTF8&#34;, &#34;VM&#34;, &#34;XML&#34;, &#34;XMPP&#34;, &#34;XSRF&#34;, &#34;XSS&#34;, &#34;SIP&#34;, &#34;RTP&#34;, &#34;AMQP&#34;, &#34;DB&#34;, &#34;TS&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">initialisms</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;ACL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;API&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;ASCII&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;CPU&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;CSS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;DNS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;EOF&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;GUID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;HTML&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;HTTP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;HTTPS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;ID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;IP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;JSON&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;QPS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;RAM&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;RPC&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SLA&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SMTP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SQL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SSH&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TCP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TLS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TTL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UDP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UI&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;GID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UUID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;URI&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;URL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UTF8&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;VM&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XML&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XMPP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XSRF&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XSS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SIP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;RTP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;AMQP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;DB&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TS&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/configuration/options/#http_status_code_whitelist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;200&#34;, &#34;400&#34;, &#34;404&#34;, &#34;500&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http-status-code-whitelist</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;200&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;400&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;404&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;500&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example (to disable some checks): [ &#34;all&#34;, &#34;-SA1000&#34;, &#34;-SA1001&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;all&#34;, &#34;-ST1000&#34;, &#34;-ST1003&#34;, &#34;-ST1016&#34;, &#34;-ST1020&#34;, &#34;-ST1021&#34;, &#34;-ST1022&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid regular expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid template.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid format in &#39;time.Parse&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unsupported argument to functions in &#39;encoding/binary&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suspiciously small untyped constant in &#39;time.Sleep&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid first argument to &#39;exec.Command&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;Printf&#39; with dynamic first argument and no further arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid URL in &#39;net/url.Parse&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Non-canonical key in &#39;http.Header&#39; map.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;(*regexp.Regexp).FindAll&#39; called with &#39;n == 0&#39;, which will always return zero results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Various methods in the &#34;strings&#34; package expect valid UTF-8, but invalid input is provided.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A nil &#39;context.Context&#39; is being passed to a function, consider using &#39;context.TODO&#39; instead.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;io.Seeker.Seek&#39; is being called with the whence constant as the first argument, but it should be the second.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Non-pointer value passed to &#39;Unmarshal&#39; or &#39;Decode&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using &#39;time.Tick&#39; in a way that will leak. Consider using &#39;time.NewTicker&#39;, and only use &#39;time.Tick&#39; in tests, commands and endless functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trapping a signal that cannot be trapped.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Channels used with &#39;os/signal.Notify&#39; should be buffered.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;strings.Replace&#39; called with &#39;n == 0&#39;, which does nothing.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using a deprecated function, variable, constant or field.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using an invalid host:port pair with a &#39;net.Listen&#39;-related function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using &#39;bytes.Equal&#39; to compare two &#39;net.IP&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Modifying the buffer in an &#39;io.Writer&#39; implementation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A string cutset contains duplicate characters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It is not possible to use &#39;(*time.Timer).Reset&#39;&#39;s return value correctly.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Cannot marshal channels or functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Atomic access to 64-bit variable must be 64-bit aligned.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;sort.Slice&#39; can only be used on slices.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Inappropriate key in call to &#39;context.WithValue&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid argument in call to a &#39;strconv&#39; function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Overlapping byte slices passed to an encoder.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Wrong order of arguments to &#39;errors.Is&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;sync.WaitGroup.Add&#39; called inside the goroutine, leading to a race condition.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Empty critical section, did you mean to defer the unlock?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Called &#39;testing.T.FailNow&#39; or &#39;SkipNow&#39; in a goroutine, which isn&#39;t allowed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Deferred &#39;Lock&#39; right after locking, likely meant to defer &#39;Unlock&#39; instead.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;TestMain&#39; doesn&#39;t call &#39;os.Exit&#39;, hiding test failures.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA3000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA3000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assigning to &#39;b.N&#39; in benchmarks distorts the results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA3001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA3001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Binary operator has identical expressions on both sides.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;&amp;*x&#39; gets simplified to &#39;x&#39;, it does not copy &#39;x&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing unsigned values against negative values is pointless.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The loop exits unconditionally after one iteration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Field assignment that will never be observed. Did you mean to use a pointer receiver?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The variable in the loop condition never changes, are you incrementing the wrong variable?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A function argument is overwritten before its first use.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The result of &#39;append&#39; will never be observed anywhere.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Break statement with no effect. Did you mean to break out of an outer loop?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing a value against NaN even though no value is equal to NaN.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Negating a boolean twice (&#39;!!b&#39;) is the same as writing &#39;b&#39;. This is either redundant, or a typo.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An if/else if chain has repeated conditions and no side-effects; if the condition didn&#39;t match the first time, it won&#39;t match the second time, either.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Calling functions like &#39;math.Ceil&#39; on floats converted from integers doesn&#39;t do anything useful.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Certain bitwise operations, such as &#39;x ^ 0&#39;, do not do anything useful.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Discarding the return values of a function without side effects, making the call pointless.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Self-assignment of variables.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Multiple, identical build constraints in the same file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unreachable case clause in a type switch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#34;x = append(y)&#34; is equivalent to &#34;x = y&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing the address of a variable against nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Impossible comparison of interface value with untyped nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checking for impossible return value from a builtin function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Integer division of literals that results in zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Go constants cannot express negative zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;(*net/url.URL).Query&#39; returns a copy, modifying it doesn&#39;t change the URL.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;x % 1&#39; is always zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ineffective attempt at sorting slice.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ineffective attempt at generating random number.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checking never-nil value against nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing &#39;runtime.GOOS&#39; or &#39;runtime.GOARCH&#39; against impossible value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assignment to nil map.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Deferring &#39;Close&#39; before checking for a possible error.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The empty for loop (&#34;for {}&#34;) spins and can block the scheduler.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defers in infinite loops will never execute.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#34;for { select { ...&#34; with an empty default branch spins.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The finalizer references the finalized object, preventing garbage collection.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Infinite recursive call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid struct tag.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid Printf call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Impossible type assertion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Possible nil pointer dereference.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Passing odd-sized slice to function expecting even size.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using &#39;regexp.Match&#39; or related in a loop, should use &#39;regexp.Compile&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Missing an optimization opportunity when indexing maps by byte slices.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Storing non-pointer values in &#39;sync.Pool&#39; allocates memory.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Converting a string to a slice of runes before ranging over it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Inefficient string comparison with &#39;strings.ToLower&#39; or &#39;strings.ToUpper&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using io.WriteString to write &#39;[]byte&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defers in range loops may not run when you expect them to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using a non-octal &#39;os.FileMode&#39; that looks like it was meant to be in octal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Empty body in an if or else branch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only the first constant has an explicit type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trying to marshal a struct with no public fields nor custom marshaling.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Dubious bit shifting of a fixed size integer value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Deleting a directory that shouldn&#39;t be deleted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;else&#39; branch of a type assertion is probably not reading the right value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ineffectual Go compiler directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Incorrect or missing package comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Dot imports are discouraged.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen identifier.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Incorrectly formatted error string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen receiver name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A function&#39;s error value should be its last return value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen name for variable of type &#39;time.Duration&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen name for error variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Should use constants for HTTP error codes, not magic numbers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A switch&#39;s default case should be the first or last case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use consistent method receiver names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Don&#39;t use Yoda conditions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Avoid zero-width and control characters in string literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Importing the same package multiple times.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The documentation of an exported function should start with the function&#39;s name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The documentation of an exported type should start with type&#39;s name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The documentation of an exported variable or constant should start with variable&#39;s name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Redundant type in variable declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use plain channel send or receive instead of single-case select.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace for loop with call to copy.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit comparison with boolean constant.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace call to &#39;strings.Index&#39; with &#39;strings.Contains&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace call to &#39;bytes.Compare&#39; with &#39;bytes.Equal&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Drop unnecessary use of the blank identifier.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#34;for { ... }&#34; for infinite loops.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify regular expression by using raw string literal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify returning boolean expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant nil check on slices, maps, and channels.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit default slice index.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use a single &#39;append&#39; to concatenate two slices.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace &#39;time.Now().Sub(x)&#39; with &#39;time.Since(x)&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use a type conversion instead of manually copying struct fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace manual trimming with &#39;strings.TrimPrefix&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#34;copy&#34; for sliding elements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify &#34;make&#34; call by omitting redundant arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant nil check in type assertion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Merge variable declaration and assignment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant control flow.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace &#39;x.Sub(time.Now())&#39; with &#39;time.Until(x)&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Don&#39;t use &#39;fmt.Sprintf(&#34;%s&#34;, x)&#39; unnecessarily.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify error construction with &#39;fmt.Errorf&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Range over the string directly.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;bytes.Buffer.String&#39; or &#39;bytes.Buffer.Bytes&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant nil check around loop.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;sort.Ints(x)&#39;, &#39;sort.Float64s(x)&#39;, and &#39;sort.Strings(x)&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessary guard around call to &#34;delete&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1033</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1033</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use result of type assertion to simplify cases.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1034</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1034</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Redundant call to &#39;net/http.CanonicalHeaderKey&#39; in method call on &#39;net/http.Header&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1035</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1035</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessary guard around map access.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1036</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1036</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Elaborate way of sleeping.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1037</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1037</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessarily complex way of printing formatted string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1038</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1038</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessary use of &#39;fmt.Sprint&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1039</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1039</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Type assertion to current type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1040</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1040</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Apply De Morgan&#39;s law.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Convert untagged switch to tagged switch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Convert if/else-if chain to tagged switch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;strings.ReplaceAll&#39; instead of &#39;strings.Replace&#39; with &#39;n == -1&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Expand call to &#39;math.Pow&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Lift &#39;if&#39;+&#39;break&#39; into loop condition.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Merge conditional assignment into variable declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit embedded fields from selector expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;time.Time.Equal&#39; instead of &#39;==&#39; operator.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Convert slice of bytes to string when printing it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant type from variable declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;fmt.Fprintf(x, ...)&#39; instead of &#39;x.Write(fmt.Sprintf(...))&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1012</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>tagalign<span class="hx:absolute hx:-mt-20" id="tagalign"></span> +<a href="#tagalign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check that struct tags are well aligned.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/4meepo/tagalign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tagalign</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Align and sort can be used together or separately.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether enable align. If true, the struct tags will be aligned.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># E.g.:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># type FooBar struct {</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Bar string `json:&#34;bar&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># FooFoo int8 `json:&#34;foo_foo&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># }</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># will be formatted to:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># type FooBar struct {</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Bar string `json:&#34;bar&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># FooFoo int8 `json:&#34;foo_foo&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># }</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">align</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether enable tags sort.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, the tags will be sorted by name in ascending order.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># E.g.: `xml:&#34;bar&#34; json:&#34;bar&#34; validate:&#34;required&#34;` -&gt; `json:&#34;bar&#34; validate:&#34;required&#34; xml:&#34;bar&#34;`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sort</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Specify the order of tags, the other tags will be sorted by name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This option will be ignored if `sort` is false.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">order</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yaml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">toml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mapstructure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">binding</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">validate</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether enable strict style.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># In this style, the tags will be sorted and aligned in the dictionary order,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and the tags with the same name will be aligned together.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Note: This option will be ignored if &#39;align&#39; or &#39;sort&#39; is false.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>tagliatelle<span class="hx:absolute hx:-mt-20" id="tagliatelle"></span> +<a href="#tagliatelle" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks the struct tags.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.40.0</div> +</div> +<a href="https://github.com/ldez/tagliatelle" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tagliatelle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks the struct tag name case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines the association between tag name and case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Any struct tag name can be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supported string cases:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `camel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `pascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `kebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `snake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `upperSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goCamel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goPascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goKebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `upper`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lower`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `header`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">yaml</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">xml</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">toml</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bson</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">avro</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mapstructure</span><span class="p">:</span><span class="w"> </span><span class="l">kebab</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w"> </span><span class="l">upperSnake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">envconfig</span><span class="p">:</span><span class="w"> </span><span class="l">upperSnake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">whatever</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines the association between tag name and case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Important: the `extended-rules` overrides `rules`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extended-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supported string cases:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `camel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `pascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `kebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `snake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `upperSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goCamel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goPascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goKebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `header`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lower`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `header`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Required</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Adds &#39;AMQP&#39;, &#39;DB&#39;, &#39;GID&#39;, &#39;RTP&#39;, &#39;SIP&#39;, &#39;TS&#39; to initialisms,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and removes &#39;LHS&#39;, &#39;RHS&#39; from initialisms.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-initialisms</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines initialism additions and overrides.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">initialism-overrides</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">DB</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># add a new initialism</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">LHS</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span><span class="c"># disable a default initialism.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ...</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Uses the struct field name to check the name of the struct tag.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">use-field-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The field names to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-fields</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Overrides the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">overrides</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="c"># The package path (uses `/` only as a separator).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Required</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">foo/bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty or the same as the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">xml</span><span class="p">:</span><span class="w"> </span><span class="l">pascal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty or the same as the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extended-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Same options as the base `extended-rules`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (WARNING: it doesn&#39;t follow the default/root configuration)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">use-field-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The field names to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [] or the same as the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-fields</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore the package (takes precedence over all other configurations).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>testableexamples<span class="hx:absolute hx:-mt-20" id="testableexamples"></span> +<a href="#testableexamples" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Linter checks if examples are testable (have an expected output).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.50.0</div> +</div> +<a href="https://github.com/maratori/testableexamples" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>testifylint<span class="hx:absolute hx:-mt-20" id="testifylint"></span> +<a href="#testifylint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks usage of github.com/stretchr/testify.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Antonboom/testifylint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testifylint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all checkers (https://github.com/Antonboom/testifylint#checkers).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable checkers by name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (in addition to default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># suite-thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">blank-import</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bool-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">compares</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contains</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">encoded-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equal-values</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-is-as</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-nil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expected-actual</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">float-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">formatter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go-require</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">negative-positive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nil-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-broken-parallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-dont-use-pkg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-extra-assert-call</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-method-signature</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-subtest-run</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">useless-assert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable all checkers (https://github.com/Antonboom/testifylint#checkers).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable checkers by name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (in addition to default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># blank-import, bool-compare, compares, contains, empty, encoded-compare, equal-values, error-is-as, error-nil,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># expected-actual, go-require, float-compare, formatter, len, negative-positive, nil-compare, regexp, require-error,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># suite-broken-parallel, suite-dont-use-pkg, suite-extra-assert-call, suite-subtest-run, suite-method-signature,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># useless-assert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">blank-import</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bool-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">compares</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contains</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">encoded-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equal-values</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-is-as</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-nil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expected-actual</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">float-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">formatter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go-require</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">negative-positive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nil-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-broken-parallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-dont-use-pkg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-extra-assert-call</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-method-signature</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-subtest-run</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">useless-assert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bool-compare</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To ignore user defined types (over builtin bool).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-custom-types</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expected-actual</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp for expected variable name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: (^(exp(ected)?|want(ed)?)([A-Z]\w*)?$)|(^(\w*[a-z])?(Exp(ected)?|Want(ed)?)$)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^expected</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formatter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To enable go vet&#39;s printf checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-format-string</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To require f-assertions (e.g. `assert.Equalf`) if format string is used, even if there are no variable-length</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># variables, i.e. it requires `require.NoErrorf` for both these cases:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - require.NoErrorf(t, err, &#34;unexpected error&#34;)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - require.NoErrorf(t, err, &#34;unexpected error for sid: %v&#34;, sid)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To understand this behavior, please read the</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/Antonboom/testifylint?tab=readme-ov-file#historical-reference-of-formatter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-f-funcs</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To require that the first element of msgAndArgs (msg) has a string type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, in such case assertion like `assert.True(t, b, tt.case)` will be considered as invalid.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-string-msg</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-require</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To ignore HTTP handlers (like http.HandlerFunc).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-http-handlers</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-error</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fn-pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^(Errorf?|NoErrorf?)$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suite-extra-assert-call</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To require or remove extra Assert() call?</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: remove</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">require</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>testpackage<span class="hx:absolute hx:-mt-20" id="testpackage"></span> +<a href="#testpackage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Linter that makes you use a separate _test package.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<a href="https://github.com/maratori/testpackage" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testpackage</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp pattern to skip files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;(export|internal)_test\\.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-regexp</span><span class="p">:</span><span class="w"> </span><span class="l">(export|internal)_test\.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of packages that don&#39;t end with _test that tests are allowed to be in.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;main&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-packages</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">example</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">main</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>thelper<span class="hx:absolute hx:-mt-20" id="thelper"></span> +<a href="#thelper" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Thelper detects tests helpers which do not start with the t.Helper() method.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.34.0</div> +</div> +<a href="https://github.com/kulti/thelper" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">thelper</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.T is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.T param has name t.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check t.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">benchmark</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.B is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.B param has name b.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check b.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tb</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.TB is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.TB param has name tb.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check tb.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fuzz</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.F is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.F param has name f.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check f.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>tparallel<span class="hx:absolute hx:-mt-20" id="tparallel"></span> +<a href="#tparallel" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Tparallel detects inappropriate usage of t.Parallel() method in your Go test codes.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.32.0</div> +</div> +<a href="https://github.com/moricho/tparallel" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>unconvert<span class="hx:absolute hx:-mt-20" id="unconvert"></span> +<a href="#unconvert" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Remove unnecessary type conversions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/mdempsky/unconvert" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unconvert</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Remove conversions that force intermediate rounding.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fast-math</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Be more conservative (experimental).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">safe</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>unparam<span class="hx:absolute hx:-mt-20" id="unparam"></span> +<a href="#unparam" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports unused function parameters.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.9.0</div> +</div> +<a href="https://github.com/mvdan/unparam" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unparam</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Inspect exported functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to true if no external program/library imports your code.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># if it&#39;s called for subdir of a project it can&#39;t find external interfaces. All text editor integrations</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># with golangci-lint call it on a directory with the changed file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-exported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>unqueryvet<span class="hx:absolute hx:-mt-20" id="unqueryvet"></span> +<a href="#unqueryvet" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.5.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>New</div> +</div> +<a href="https://github.com/MirrexOne/unqueryvet" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unqueryvet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable SQL builder checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-sql-builders</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regex patterns for acceptable SELECT * usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT \\* FROM information_schema\\..*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT \\* FROM pg_catalog\\..*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT COUNT\\(\\*\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT MAX\\(\\*\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT MIN\\(\\*\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed-patterns</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;SELECT \\* FROM temp_.*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;SELECT \\* FROM.*-- migration&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>unused<span class="hx:absolute hx:-mt-20" id="unused"></span> +<a href="#unused" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks Go code for unused constants, variables, functions and types.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<a href="https://github.com/dominikh/go-tools/tree/HEAD/unused" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unused</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all struct fields that have been written to as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">field-writes-are-uses</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">post-statements-are-reads</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all exported fields as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exported-fields-are-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all function parameters as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">parameters-are-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all local variables as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-variables-are-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all identifiers inside generated files as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated-is-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>usestdlibvars<span class="hx:absolute hx:-mt-20" id="usestdlibvars"></span> +<a href="#usestdlibvars" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter that detect the possibility to use variables/constants from the Go standard library.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.48.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/sashamelentyev/usestdlibvars" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usestdlibvars</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of http.MethodXX.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http-method</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of http.StatusXX.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http-status-code</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Month in time.Date.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-date-month</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Weekday.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-weekday</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Month.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-month</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Layout.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-layout</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of crypto.Hash.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">crypto-hash</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of rpc.DefaultXXPath.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-rpc-path</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of sql.LevelXX.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sql-isolation-level</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of tls.SignatureScheme.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tls-signature-scheme</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of constant.Kind.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">constant-kind</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>usetesting<span class="hx:absolute hx:-mt-20" id="usetesting"></span> +<a href="#usetesting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports uses of functions with replacement inside the testing package.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.63.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ldez/usetesting" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usetesting</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.CreateTemp(&#34;&#34;, ...)` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-create-temp</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.MkdirTemp()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-mkdir-temp</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.Setenv()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-setenv</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.TempDir()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-temp-dir</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.Chdir()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disabled if Go &lt; 1.24.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-chdir</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `context.Background()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disabled if Go &lt; 1.24.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context-background</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `context.TODO()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disabled if Go &lt; 1.24.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context-todo</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>varnamelen<span class="hx:absolute hx:-mt-20" id="varnamelen"></span> +<a href="#varnamelen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that the length of a variable's name matches its scope.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/blizzy78/varnamelen" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">varnamelen</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The longest distance, in source lines, that is being considered a &#34;small scope&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Variables used in at most this many lines will be ignored.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-distance</span><span class="p">:</span><span class="w"> </span><span class="m">6</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The minimum length of a variable&#39;s name that is considered &#34;long&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Variable names that are at least this long will be ignored.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-name-length</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check method receivers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-receiver</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check named return values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-return</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check type parameters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-type-param</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore &#34;ok&#34; variables that hold the bool return value of a type assertion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-type-assert-ok</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore &#34;ok&#34; variables that hold the bool return value of a map index.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-map-index-ok</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore &#34;ok&#34; variables that hold the bool return value of a channel receive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-chan-recv-ok</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional list of variable names that should be ignored completely.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-names</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional list of variable declarations that should be ignored completely.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Entries must be in one of the following forms (see below for examples):</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - for variables, parameters, named return values, method receivers, or type parameters:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &lt;name&gt; &lt;type&gt; (&lt;type&gt; can also be a pointer/slice/map/chan/...)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - for constants: const &lt;name&gt;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-decls</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">c echo.Context</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">t testing.T</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">f *foo.Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">e error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">i int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">const C</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">T any</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">m map[string]int</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>wastedassign<span class="hx:absolute hx:-mt-20" id="wastedassign"></span> +<a href="#wastedassign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Finds wasted assignment statements.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<a href="https://github.com/sanposhiho/wastedassign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>whitespace<span class="hx:absolute hx:-mt-20" id="whitespace"></span> +<a href="#whitespace" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ultraware/whitespace" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">whitespace</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforces newlines (or comments) after every multi-line if statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">multi-if</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforces newlines (or comments) after every multi-line function signature.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">multi-func</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>wrapcheck<span class="hx:absolute hx:-mt-20" id="wrapcheck"></span> +<a href="#wrapcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that errors returned from external packages are wrapped.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.32.0</div> +</div> +<a href="https://github.com/tomarrell/wrapcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings specifying additional substrings of signatures to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unlike &#39;ignore-sigs&#39;, this option extends the default set (or the set specified in &#39;ignore-sigs&#39;) without replacing it entirely.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This allows you to add specific signatures to the ignore list</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># while retaining the defaults or any items in &#39;ignore-sigs&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-ignore-sigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.CustomError(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.SpecificWrap(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify substrings of signatures to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If this set, it will override the default set of ignored signatures.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/tomarrell/wrapcheck#configuration for more information.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;.Errorf(&#34;, &#34;errors.New(&#34;, &#34;errors.Unwrap(&#34;, &#34;errors.Join(&#34;, &#34;.Wrap(&#34;, &#34;.Wrapf(&#34;, &#34;.WithMessage(&#34;, &#34;.WithMessagef(&#34;, &#34;.WithStack(&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.Errorf(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errors.New(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errors.Unwrap(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errors.Join(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.Wrap(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.Wrapf(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.WithMessage(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.WithMessagef(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.WithStack(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify regular expressions of signatures to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sig-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">\.New.*Error\(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify globs of packages to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-package-globs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">encoding/*</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/pkg/*</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify regular expressions of interfaces to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-interface-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">^(?i)c(?-i)ach(ing|e)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Determines whether wrapcheck should report errors returned from inside the package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-internal-errors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>wsl<span class="hx:absolute hx:-mt-20" id="wsl"></span> +<a href="#wsl" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>New major version. Use <code>wsl_v5</code> instead.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:border-red-200 hx:bg-red-100 hx:text-red-900 hx:dark:border-red-200/30 hx:dark:bg-red-900/30 hx:dark:text-red-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Deprecated since v2.2.0</div> +</div> +<a href="https://github.com/bombsimon/wsl" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>wsl_v5<span class="hx:absolute hx:-mt-20" id="wsl_v5"></span> +<a href="#wsl_v5" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add or remove empty lines.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/bombsimon/wsl" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wsl_v5</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow cuddling a variable if it&#39;s used first in the immediate following block,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># even if the statement with the block doesn&#39;t use the variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-first-in-block</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Same as above,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but allows cuddling if the variable is used anywhere in the following (or nested) block.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-whole-block</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If a block contains more than this number of lines,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># the branch statement needs to be separated by whitespace.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">branch-max-lines</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If set to a non-negative number,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># case blocks need to end with whitespace if exceeding this number</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case-max-lines</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default checks to use.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Can be `all`, `none`, `default` or empty.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enabled checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Will be additive to any presets.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">branch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">for</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">if</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inc-dec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">label</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">select</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">send</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">type-switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">append</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-exclusive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">leading-whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">trailing-whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Will be subtractive to any preset.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">branch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">for</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">if</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inc-dec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">label</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">select</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">send</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">type-switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">append</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-exclusive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">leading-whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">trailing-whitespace</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>zerologlint<span class="hx:absolute hx:-mt-20" id="zerologlint"></span> +<a href="#zerologlint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects the wrong usage of <code>zerolog</code> that a user forgets to dispatch with <code>Send</code> or <code>Msg</code>.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<a href="https://github.com/ykadowak/zerologlint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p>Workflowhttps://golangci-lint.run/docs/contributing/workflow/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/workflow/ +<p>By participating in this project, you agree to abide our <a href="https://github.com/golangci/golangci-lint?tab=coc-ov-file"target="_blank" rel="noopener">code of conduct</a>.</p> +<h2>Set up your machine<span class="hx:absolute hx:-mt-20" id="set-up-your-machine"></span> +<a href="#set-up-your-machine" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Golangci-lint is written in <a href="https://go.dev/"target="_blank" rel="noopener">Go</a>.</p> +<p>Prerequisites:</p> +<ul> +<li><code>make</code></li> +<li><a href="https://go.dev/doc/install"target="_blank" rel="noopener">Go</a></li> +</ul> +<p>Fork and clone <a href="https://github.com/golangci/golangci-lint"target="_blank" rel="noopener">golangci-lint</a> repository.</p> +<p>A good way of making sure everything is all right is running the following:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make build +</span></span><span class="line"><span class="cl">./golangci-lint run -v</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Test your change<span class="hx:absolute hx:-mt-20" id="test-your-change"></span> +<a href="#test-your-change" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>When you are satisfied with the changes, we suggest you run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make test</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Which runs all the linters and tests.</p> +<h2>Create or update parameters for docs<span class="hx:absolute hx:-mt-20" id="create-or-update-parameters-for-docs"></span> +<a href="#create-or-update-parameters-for-docs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add your new or updated parameters to <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml"target="_blank" rel="noopener">.golangci.next.reference.yml</a> so they will be shown in the docs</p> +<h2>Submit a pull request<span class="hx:absolute hx:-mt-20" id="submit-a-pull-request"></span> +<a href="#submit-a-pull-request" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Push your branch to your golangci-lint fork and open a pull request against the +<code>main</code> branch.</p> +<h2>Pull request checks<span class="hx:absolute hx:-mt-20" id="pull-request-checks"></span> +<a href="#pull-request-checks" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>First, please, accept CLA - <a href="https://cla-assistant.io/"target="_blank" rel="noopener">CLA assistant</a> will make a comment on the pull request about it.</p> +<p>Also, we run a few checks in CI by using GitHub Actions, you can see them <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.github/workflows"target="_blank" rel="noopener">here</a>.</p> +<h2>New releases<span class="hx:absolute hx:-mt-20" id="new-releases"></span> +<a href="#new-releases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>First, see <a href="https://golangci-lint.run/docs/product/roadmap/#versioning-policy">our versioning policy</a>.</p> +<p>To make a new release create a tag <code>vX.Y.Z</code>.<br> +Don&rsquo;t forget to add zero patch version for a new minor release, e.g. <code>v1.99.0</code>.</p> +<p>A GitHub Action <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.github/workflows/release.yml"target="_blank" rel="noopener">workflow</a> will start building and publishing release after that.</p> +<p>After making a release, you need to update GitHub <a href="https://github.com/golangci/golangci-lint/blob/HEAD/assets/github-action-config.json"target="_blank" rel="noopener">Action config</a> by running:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">make assets/github-action-config.json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Architecturehttps://golangci-lint.run/docs/contributing/architecture/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/architecture/ +<p>There are the following golangci-lint execution steps:</p> +<pre class="mermaid hx:mt-6"> +graph LR +init[Init] +loadPackages[Load packages] +runLinters[Run linters] +postprocess[Postprocess issues] +print[Print issues] +init --&gt; loadPackages --&gt; runLinters --&gt; postprocess --&gt; print +</pre><h2>Init<span class="hx:absolute hx:-mt-20" id="init"></span> +<a href="#init" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The configuration is loaded from file and flags by <code>config.Loader</code> inside <code>PersistentPreRun</code> (or <code>PreRun</code>) of the commands that require configuration.</p> +<p>The linter database (<code>linterdb.Manager</code>) is fill based on the configuration:</p> +<ul> +<li>The linters (&ldquo;internals&rdquo; and plugins) are built by <code>linterdb.LinterBuilder</code> and <code>linterdb.PluginBuilder</code> builders.</li> +<li>The configuration is validated by <code>linterdb.Validator</code>.</li> +</ul> +<h2>Load Packages<span class="hx:absolute hx:-mt-20" id="load-packages"></span> +<a href="#load-packages" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Loading packages is listing all packages and their recursive dependencies for analysis.<br> +Also, depending on the enabled linters set some parsing of the source code can be performed at this step.</p> +<p>Packages loading starts here:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/lint/package.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/package.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">l</span> <span class="o">*</span><span class="nx">PackageLoader</span><span class="p">)</span> <span class="nf">Load</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">linters</span> <span class="p">[]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">)</span> <span class="p">(</span><span class="nx">pkgs</span><span class="p">,</span> <span class="nx">deduplicatedPkgs</span> <span class="p">[]</span><span class="o">*</span><span class="nx">packages</span><span class="p">.</span><span class="nx">Package</span><span class="p">,</span> <span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">loadMode</span> <span class="o">:=</span> <span class="nf">findLoadMode</span><span class="p">(</span><span class="nx">linters</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">pkgs</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">l</span><span class="p">.</span><span class="nf">loadPackages</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">loadMode</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">&#34;failed to load packages: %w&#34;</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="c1">// ...</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>First, we find a load mode as union of load modes for all enabled linters. +We use <a href="https://pkg.go.dev/golang.org/x/tools/go/packages"target="_blank" rel="noopener">go/packages</a> for packages loading and use it&rsquo;s enum <code>packages.Need*</code> for load modes. +Load mode sets which data does a linter needs for execution.</p> +<p>A linter that works only with AST need minimum of information: only filenames and AST.</p> +<p>There is no need for packages dependencies or type information. +AST is built during <code>go/analysis</code> execution to reduce memory usage. +Such AST-based linters are configured with the following code:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/linter/config.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/linter/config.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">lc</span> <span class="o">*</span><span class="nx">Config</span><span class="p">)</span> <span class="nf">WithLoadFiles</span><span class="p">()</span> <span class="o">*</span><span class="nx">Config</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span><span class="p">.</span><span class="nx">LoadMode</span> <span class="o">|=</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedName</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedFiles</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedCompiledGoFiles</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">lc</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>If a linter uses <code>go/analysis</code> and needs type information, we need to extract more data by <code>go/packages</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/linter/config.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/linter/config.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">lc</span> <span class="o">*</span><span class="nx">Config</span><span class="p">)</span> <span class="nf">WithLoadForGoAnalysis</span><span class="p">()</span> <span class="o">*</span><span class="nx">Config</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span> <span class="p">=</span> <span class="nx">lc</span><span class="p">.</span><span class="nf">WithLoadFiles</span><span class="p">()</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span><span class="p">.</span><span class="nx">LoadMode</span> <span class="o">|=</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedImports</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedDeps</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedExportFile</span> <span class="p">|</span> <span class="nx">packages</span><span class="p">.</span><span class="nx">NeedTypesSizes</span> +</span></span><span class="line"><span class="cl"> <span class="nx">lc</span><span class="p">.</span><span class="nx">IsSlow</span> <span class="p">=</span> <span class="kc">true</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">lc</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>After finding a load mode, we run <code>go/packages</code>: +the library get list of dirs (or <code>./...</code> as the default value) as input and outputs list of packages and requested information about them: +filenames, type information, AST, etc.</p> +<h2>Run Linters<span class="hx:absolute hx:-mt-20" id="run-linters"></span> +<a href="#run-linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>First, we need to find all enabled linters. All linters are registered here:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/lintersdb/builder_linter.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/lintersdb/builder_linter.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="nx">LinterBuilder</span><span class="p">)</span> <span class="nf">Build</span><span class="p">(</span><span class="nx">cfg</span> <span class="o">*</span><span class="nx">config</span><span class="p">.</span><span class="nx">Config</span><span class="p">)</span> <span class="p">[]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="nx">linter</span><span class="p">.</span><span class="nf">NewConfig</span><span class="p">(</span><span class="nx">golinters</span><span class="p">.</span><span class="nf">NewBodyclose</span><span class="p">()).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithSince</span><span class="p">(</span><span class="s">&#34;v1.18.0&#34;</span><span class="p">).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithLoadForGoAnalysis</span><span class="p">().</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithURL</span><span class="p">(</span><span class="s">&#34;https://github.com/timakin/bodyclose&#34;</span><span class="p">),</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="nx">linter</span><span class="p">.</span><span class="nf">NewConfig</span><span class="p">(</span><span class="nx">golinters</span><span class="p">.</span><span class="nf">NewGovet</span><span class="p">(</span><span class="nx">govetCfg</span><span class="p">)).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithGroups</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">GroupStandard</span><span class="p">).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithSince</span><span class="p">(</span><span class="s">&#34;v1.0.0&#34;</span><span class="p">).</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithLoadForGoAnalysis</span><span class="p">().</span> +</span></span><span class="line"><span class="cl"> <span class="nf">WithURL</span><span class="p">(</span><span class="s">&#34;https://pkg.go.dev/cmd/vet&#34;</span><span class="p">),</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>We filter requested in config and command-line linters in <code>EnabledSet</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/lintersdb/manager.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/lintersdb/manager.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">m</span> <span class="o">*</span><span class="nx">Manager</span><span class="p">)</span> <span class="nf">GetEnabledLintersMap</span><span class="p">()</span> <span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>We merge enabled linters into one <code>MetaLinter</code> to improve execution time if we can:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/lint/lintersdb/manager.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/lint/lintersdb/manager.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters into a fewer number of linters.</span> +</span></span><span class="line"><span class="cl"><span class="c1">// E.g. some go/analysis linters can be optimized into one metalinter for data reuse and speed up.</span> +</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">m</span> <span class="o">*</span><span class="nx">Manager</span><span class="p">)</span> <span class="nf">GetOptimizedLinters</span><span class="p">()</span> <span class="p">([]</span><span class="o">*</span><span class="nx">linter</span><span class="p">.</span><span class="nx">Config</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"> <span class="nx">m</span><span class="p">.</span><span class="nf">combineGoAnalysisLinters</span><span class="p">(</span><span class="nx">resultLintersSet</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The <code>MetaLinter</code> just stores all merged linters inside to run them at once:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/goanalysis/metalinter.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/goanalysis/metalinter.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">MetaLinter</span> <span class="kd">struct</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">linters</span> <span class="p">[]</span><span class="o">*</span><span class="nx">Linter</span> +</span></span><span class="line"><span class="cl"> <span class="nx">analyzerToLinterName</span> <span class="kd">map</span><span class="p">[</span><span class="o">*</span><span class="nx">analysis</span><span class="p">.</span><span class="nx">Analyzer</span><span class="p">]</span><span class="kt">string</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Currently, all linters except <code>unused</code> can be merged into this meta linter.<br> +The <code>unused</code> isn&rsquo;t merged because it has high memory usage.</p> +<p>Linters execution starts in <code>runAnalyzers</code>. +It&rsquo;s the most complex part of the golangci-lint. +We use custom <a href="https://pkg.go.dev/golang.org/x/tools/go/analysis"target="_blank" rel="noopener">go/analysis</a> runner there.<br> +It runs as much as it can in parallel. +It lazy-loads as much as it can to reduce memory usage. +Also, it sets all heavyweight data to <code>nil</code> as becomes unneeded to save memory.</p> +<p>We don&rsquo;t use existing <a href="https://pkg.go.dev/golang.org/x/tools/go/analysis/multichecker"target="_blank" rel="noopener">multichecker</a> because +it doesn&rsquo;t use caching and doesn&rsquo;t have some important performance optimizations.</p> +<p>All found by linters issues are represented with <code>result.Issue</code> struct:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/result/issue.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/result/issue.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Issue</span> <span class="kd">struct</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">FromLinter</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> <span class="nx">Text</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">Severity</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// Source lines of a code with the issue to show</span> +</span></span><span class="line"><span class="cl"> <span class="nx">SourceLines</span> <span class="p">[]</span><span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// Pkg is needed for proper caching of linting results</span> +</span></span><span class="line"><span class="cl"> <span class="nx">Pkg</span> <span class="o">*</span><span class="nx">packages</span><span class="p">.</span><span class="nx">Package</span> <span class="s">`json:&#34;-&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">Pos</span> <span class="nx">token</span><span class="p">.</span><span class="nx">Position</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="nx">LineRange</span> <span class="o">*</span><span class="nx">Range</span> <span class="s">`json:&#34;,omitempty&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// HunkPos is used only when golangci-lint is run over a diff</span> +</span></span><span class="line"><span class="cl"> <span class="nx">HunkPos</span> <span class="kt">int</span> <span class="s">`json:&#34;,omitempty&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// If we know how to fix the issue we can provide replacement lines</span> +</span></span><span class="line"><span class="cl"> <span class="nx">SuggestedFixes</span> <span class="p">[]</span><span class="nx">analysis</span><span class="p">.</span><span class="nx">SuggestedFix</span> <span class="s">`json:&#34;,omitempty&#34;`</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// If we are expecting a nolint (because this is from nolintlint), record the expected linter</span> +</span></span><span class="line"><span class="cl"> <span class="nx">ExpectNoLint</span> <span class="kt">bool</span> +</span></span><span class="line"><span class="cl"> <span class="nx">ExpectedNoLintLinter</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Postprocess Issues<span class="hx:absolute hx:-mt-20" id="postprocess-issues"></span> +<a href="#postprocess-issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We have an abstraction of <code>result.Processor</code> to postprocess found issues:</p> +<!-- +$ tree -L 1 ./pkg/result/processors/ | grep -v test +--> +<div class="hextra-filetree hx:mt-6 hx:select-none hx:text-sm hx:text-gray-800 hx:dark:text-gray-300 not-prose"> +<div class="hx:inline-block hx:rounded-lg hx:px-4 hx:py-2 hx:border hx:border-gray-200 hx:dark:border-neutral-800"> +<li class="hx:group hx:flex hx:list-none hx:flex-col"> +<button class="hextra-filetree-folder hx:inline-flex hx:cursor-pointer hx:items-center hx:py-1 hx:hover:opacity-60"> +<span data-state="open" class="hx:data-[state=open]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg></span> +<span data-state="open" class="hx:data-[state=closed]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/></svg></span> +<span class="hx:ltr:ml-1 hx:rtl:mr-1">./pkg/result/processors/</span> +</button> +<ul data-state="open" class="hx:ltr:pl-5 hx:rtl:pr-5 hx:data-[state=closed]:hidden"> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">cgo.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">diff.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_generated_file_filter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_generated_file_matcher.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_paths.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_presets.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">exclusion_rules.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">filename_unadjuster.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">fixer.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">identifier_marker.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">invalid_issue.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">issues.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">max_from_linter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">max_per_file_from_linter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">max_same_issues.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">nolint_filter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_absoluter.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_prettifier.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_relativity.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">path_shortener.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">processor.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">severity.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">sort_results.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">source_code.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">uniq_by_line.go</span> +</span> +</li> +</ul> +</li> +</div> +</div> +<p>The abstraction is simple:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto"><a class="hx:no-underline hx:inline-flex hx:items-center hx:gap-1" href="https://github.com/golangci/golangci-lint/blob/main/pkg/result/processors/processor.go" target="_blank" rel="noopener noreferrer"> +<span>pkg/result/processors/processor.go</span><svg height=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"/></svg></a></div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Processor</span> <span class="kd">interface</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nf">Process</span><span class="p">(</span><span class="nx">issues</span> <span class="p">[]</span><span class="o">*</span><span class="nx">result</span><span class="p">.</span><span class="nx">Issue</span><span class="p">)</span> <span class="p">([]</span><span class="o">*</span><span class="nx">result</span><span class="p">.</span><span class="nx">Issue</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> +</span></span><span class="line"><span class="cl"> <span class="nf">Name</span><span class="p">()</span> <span class="kt">string</span> +</span></span><span class="line"><span class="cl"> <span class="nf">Finish</span><span class="p">()</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>A processor can hide issues (<code>nolint</code>, <code>exclude</code>) or change issues (<code>path_prettifier</code>).</p> +<h2>Print Issues<span class="hx:absolute hx:-mt-20" id="print-issues"></span> +<a href="#print-issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We have an abstraction for printing found issues.</p> +<!-- +$ tree -L 1 ./pkg/printers/ | grep -v test +--> +<div class="hextra-filetree hx:mt-6 hx:select-none hx:text-sm hx:text-gray-800 hx:dark:text-gray-300 not-prose"> +<div class="hx:inline-block hx:rounded-lg hx:px-4 hx:py-2 hx:border hx:border-gray-200 hx:dark:border-neutral-800"> +<li class="hx:group hx:flex hx:list-none hx:flex-col"> +<button class="hextra-filetree-folder hx:inline-flex hx:cursor-pointer hx:items-center hx:py-1 hx:hover:opacity-60"> +<span data-state="open" class="hx:data-[state=open]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"/></svg></span> +<span data-state="open" class="hx:data-[state=closed]:hidden"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/></svg></span> +<span class="hx:ltr:ml-1 hx:rtl:mr-1">./pkg/printers/</span> +</button> +<ul data-state="open" class="hx:ltr:pl-5 hx:rtl:pr-5 hx:data-[state=closed]:hidden"> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">checkstyle.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">codeclimate.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">html.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">json.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">junitxml.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">printer.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">sarif.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">tab.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">teamcity.go</span> +</span> +</li> +<li class="hx:flex hx:list-none"> +<span class="hx:inline-flex hx:cursor-default hx:items-center hx:py-1"><svg width=1em xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/></svg><span class="hx:ltr:ml-1 hx:rtl:mr-1">text.go</span> +</span> +</li> +</ul> +</li> +</div> +</div>False Positiveshttps://golangci-lint.run/docs/linters/false-positives/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/linters/false-positives/ +<p>False positives are inevitable, but we did our best to reduce their count.</p> +<p>If a false positive occurred, you have several choices.</p> +<h2>Specific Linter Excludes<span class="hx:absolute hx:-mt-20" id="specific-linter-excludes"></span> +<a href="#specific-linter-excludes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Most of the linters have a configuration, sometimes false-positives can be related to a bad configuration of a linter. +So it&rsquo;s recommended to check the linter configurations.</p> +<p>Otherwise, some linters have dedicated configuration to exclude or disable rules.</p> +<p>An example with <code>staticcheck</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">staticcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;-SA1000&#39;</span><span class="w"> </span><span class="c"># disable the rule SA1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;-SA1004&#39;</span><span class="w"> </span><span class="c"># disable the rule SA1004</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Exclude<span class="hx:absolute hx:-mt-20" id="exclude"></span> +<a href="#exclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Exclude Issue by Text<span class="hx:absolute hx:-mt-20" id="exclude-issue-by-text"></span> +<a href="#exclude-issue-by-text" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>You can use <code>linters.exclusions.rules</code> config option for per-path or per-linter configuration.</p> +<p>In the following example, all the reports from the linters (<code>linters</code>) that contains the text (<code>text</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Magic number: 9&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports from the linters (<code>linters</code>) that originated from the source (<code>source</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^//go:generate &#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports that contains the text (<code>text</code>) in the path (<code>path</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">path/to/a/file.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;string `example` has (\\d+) occurrences, make it a constant&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Exclude Issues by Path<span class="hx:absolute hx:-mt-20" id="exclude-issues-by-path"></span> +<a href="#exclude-issues-by-path" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Exclude issues in path by <code>linters.exclusions.paths</code> or <code>linters.exclusions.rules</code> config options.</p> +<p>In the following example, all the reports from the linters (<code>linters</code>) that concerns the path (<code>path</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The opposite, excluding reports <strong>except</strong> for specific paths, is also possible. +In the following example, only test files get checked:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports related to the files (<code>paths</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">path/to/a/file.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports related to the directories (<code>paths</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">path/to/a/dir/</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Nolint Directive<span class="hx:absolute hx:-mt-20" id="nolint-directive"></span> +<a href="#nolint-directive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To exclude issues from all linters use <code>//nolint:all</code>. +For example, if it&rsquo;s used inline (not from the beginning of the line) it excludes issues only for this line.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">bad_name</span> <span class="kt">int</span> <span class="c1">//nolint:all</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>To exclude issues from specific linters only:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">bad_name</span> <span class="kt">int</span> <span class="c1">//nolint:wsl,unused</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>To exclude issues for the block of code, use this directive at the beginning of a line:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:all</span> +</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">allIssuesInThisFunctionAreExcluded</span><span class="p">()</span> <span class="o">*</span><span class="kt">string</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">//nolint:govet</span> +</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="p">(</span> +</span></span><span class="line"><span class="cl"> <span class="nx">a</span> <span class="kt">int</span> +</span></span><span class="line"><span class="cl"> <span class="nx">b</span> <span class="kt">int</span> +</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Also, you can exclude all issues in a file by:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:unparam</span> +</span></span><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">pkg</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You may add a comment explaining or justifying why a <code>nolint</code> directive is being used on the same line as the flag itself:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:gocyclo // This legacy function is complex, but the team too busy to simplify it</span> +</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">someLegacyFunction</span><span class="p">()</span> <span class="o">*</span><span class="kt">string</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You can see more examples of using <code>nolint</code> directives in <a href="https://github.com/golangci/golangci-lint/tree/HEAD/pkg/result/processors/testdata"target="_blank" rel="noopener">our tests</a> for it.</p> +<h3>Syntax<span class="hx:absolute hx:-mt-20" id="syntax"></span> +<a href="#syntax" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><code>nolint</code> is not regular comment but a directive.</p> +<blockquote> +<p>A directive comment is a line matching the regular expression <code>//(line |extern |export |[a-z0-9]+:[a-z0-9])</code>. +<a href="https://go.dev/doc/comment#syntax"target="_blank" rel="noopener">https://go.dev/doc/comment#syntax</a></p> +</blockquote> +<p>This means that no spaces are allowed between:</p> +<ul> +<li><code>//</code> and <code>nolint</code></li> +<li><code>nolint</code> and <code>:</code></li> +<li><code>:</code> and the name of the linter.</li> +</ul> +<p>Invalid syntax:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// nolint</span> +</span></span><span class="line"><span class="cl"><span class="c1">// nolint:xxx</span> +</span></span><span class="line"><span class="cl"><span class="c1">//nolint :xxx</span> +</span></span><span class="line"><span class="cl"><span class="c1">//nolint: xxx</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Valid syntax:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:xxx</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Exclusion Presets<span class="hx:absolute hx:-mt-20" id="exclusion-presets"></span> +<a href="#exclusion-presets" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Some exclusions are considered common. +To help golangci-lint users, those common exclusions are provided through presets.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Preset <code>comments</code><span class="hx:absolute hx:-mt-20" id="preset-comments"></span> +<a href="#preset-comments" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>staticcheck</td> +<td><code>(ST1000|ST1020|ST1021|ST1022)</code></td> +</tr><tr> +<td>revive</td> +<td><code>exported (.&#43;) should have comment( \(or a comment on this block\))? or be unexported</code></td> +</tr><tr> +<td>revive</td> +<td><code>package comment should be of the form &#34;(.&#43;)...&#34;</code></td> +</tr><tr> +<td>revive</td> +<td><code>comment on exported (.&#43;) should be of the form &#34;(.&#43;)...&#34;</code></td> +</tr><tr> +<td>revive</td> +<td><code>should have a package comment</code></td> +</tr></tbody> +</table> +<h3>Preset <code>common-false-positives</code><span class="hx:absolute hx:-mt-20" id="preset-common-false-positives"></span> +<a href="#preset-common-false-positives" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>gosec</td> +<td><code>G103: Use of unsafe calls should be audited</code></td> +</tr><tr> +<td>gosec</td> +<td><code>G204: Subprocess launched with variable</code></td> +</tr><tr> +<td>gosec</td> +<td><code>G304: Potential file inclusion via variable</code></td> +</tr></tbody> +</table> +<h3>Preset <code>legacy</code><span class="hx:absolute hx:-mt-20" id="preset-legacy"></span> +<a href="#preset-legacy" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>govet</td> +<td><code>(possible misuse of unsafe.Pointer|should have signature)</code></td> +</tr><tr> +<td>staticcheck</td> +<td><code>SA4011</code></td> +</tr><tr> +<td>gosec</td> +<td><code>G104</code></td> +</tr><tr> +<td>gosec</td> +<td><code>(G301|G302|G307): Expect (directory permissions to be 0750|file permissions to be 0600) or less</code></td> +</tr></tbody> +</table> +<h3>Preset <code>std-error-handling</code><span class="hx:absolute hx:-mt-20" id="preset-std-error-handling"></span> +<a href="#preset-std-error-handling" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>errcheck</td> +<td><code>(?i)Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked</code></td> +</tr></tbody> +</table>Integrationshttps://golangci-lint.run/docs/welcome/integrations/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/integrations/ +<h2>Editor Integration<span class="hx:absolute hx:-mt-20" id="editor-integration"></span> +<a href="#editor-integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>GoLand<span class="hx:absolute hx:-mt-20" id="goland"></span> +<a href="#goland" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Starting from version 2025.1, GoLand has built-in support of golangci-lint. +For IntelliJ IDEA with the Go plugin, please install the <a href="https://plugins.jetbrains.com/plugin/12496-go-linter"target="_blank" rel="noopener">plugin</a>.</p> +<p>Both v1 and v2 versions are supported.</p> +<h3>Visual Studio Code<span class="hx:absolute hx:-mt-20" id="visual-studio-code"></span> +<a href="#visual-studio-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Install the <a href="https://marketplace.visualstudio.com/items?itemName=golang.Go"target="_blank" rel="noopener">extension</a>.</p> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg">Recommended settings for those who installed golangci-lint manually</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--path-mode=abs&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast-only&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">],</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatTool&#34;</span><span class="p">:</span> <span class="s2">&#34;custom&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.alternateTools&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;customFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">},</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;fmt&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--stdin&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Using it in an editor without <code>--fast-only</code> can freeze your editor. +Golangci-lint automatically discovers the <code>.golangci.yml</code> config for the edited file, so you don&rsquo;t need to configure it in VS Code settings.</p> +</div> +</details> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg">Recommended settings for those who installed golangci-lint via extension</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<p>Install <code>golangci-lint-v2</code> via the <code>Go: Install/Update Tools</code> command after setting these configs. +This will enable golangci-lint v1 to co-exist with v2. +And use the following settings:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint-v2&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--path-mode=abs&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast-only&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">],</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatTool&#34;</span><span class="p">:</span> <span class="s2">&#34;custom&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.alternateTools&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;customFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint-v2&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">},</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;fmt&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--stdin&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Using it in an editor without <code>--fast-only</code> can freeze your editor. +Golangci-lint automatically discovers the <code>.golangci.yml</code> config for the edited file, so you don&rsquo;t need to configure it in VS Code settings.</p> +</div> +</details> +<h3>GNU Emacs<span class="hx:absolute hx:-mt-20" id="gnu-emacs"></span> +<a href="#gnu-emacs" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>There are available plugins:</p> +<ul> +<li><a href="https://github.com/syl20bnr/spacemacs/blob/develop/layers/&#43;lang/go/README.org#linting"target="_blank" rel="noopener">Spacemacs</a></li> +<li><a href="https://github.com/weijiangan/flycheck-golangci-lint"target="_blank" rel="noopener">Flycheck checker</a></li> +</ul> +<h3>Vim<span class="hx:absolute hx:-mt-20" id="vim"></span> +<a href="#vim" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The following plugins support golangci-lint:</p> +<ul> +<li><a href="https://github.com/fatih/vim-go"target="_blank" rel="noopener">vim-go</a></li> +<li><a href="https://github.com/w0rp/ale"target="_blank" rel="noopener">ALE</a></li> +</ul> +<h3>LSP Server<span class="hx:absolute hx:-mt-20" id="lsp-server"></span> +<a href="#lsp-server" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/nametake/golangci-lint-langserver"target="_blank" rel="noopener">golangci-lint-langserver</a> (NeoVim, Vim, Emacs, &hellip;)</p> +<h3>Sublime Text<span class="hx:absolute hx:-mt-20" id="sublime-text"></span> +<a href="#sublime-text" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>There is a <a href="https://github.com/SublimeLinter/SublimeLinter-golangcilint"target="_blank" rel="noopener">plugin</a> for SublimeLinter.</p> +<h2>Shell Completion<span class="hx:absolute hx:-mt-20" id="shell-completion"></span> +<a href="#shell-completion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Golangci-lint can generate Bash, fish, PowerShell, and Zsh completion files.</p> +<p>See the instructions on <code>golangci-lint completion &lt;YOUR_SHELL&gt; --help</code> (replace <code>&lt;YOUR_SHELL&gt;</code> with your favorite one).</p> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg">Bash &amp; macOS</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<p>There are two versions of <code>bash-completion</code>, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+.</p> +<p>The golangci-lint completion script doesn’t work correctly with bash-completion v1 and Bash 3.2. It requires bash-completion v2 and Bash 4.1+.</p> +<p>Thus, to be able to correctly use golangci-lint completion on macOS, you have to install and use Bash 4.1+ (<a href="https://itnext.io/upgrading-bash-on-macos-7138bd1066ba"target="_blank" rel="noopener">instructions</a>).</p> +<p>The following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).</p> +<p>Install <code>bash-completion v2</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew install bash-completion@2 +</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;export BASH_COMPLETION_COMPAT_DIR=&#34;/usr/local/etc/bash_completion.d&#34;&#39;</span> &gt;&gt;~/.bashrc +</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;[[ -r &#34;/usr/local/etc/profile.d/bash_completion.sh&#34; ]] &amp;&amp; . &#34;/usr/local/etc/profile.d/bash_completion.sh&#34;&#39;</span> &gt;&gt;~/.bashrc +</span></span><span class="line"><span class="cl"><span class="nb">exec</span> bash <span class="c1"># reload and replace (if it was updated) shell</span> +</span></span><span class="line"><span class="cl"><span class="nb">type</span> _init_completion <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;completion is OK&#34;</span> <span class="c1"># verify that bash-completion v2 is correctly installed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Add golangci-lint bash completion:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;source &lt;(golangci-lint completion bash)&#39;</span> &gt;&gt;~/.bashrc +</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.bashrc</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</details> +<h2>CI Integration<span class="hx:absolute hx:-mt-20" id="ci-integration"></span> +<a href="#ci-integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check out our <a href="https://golangci-lint.run/docs/welcome/install/#ci-installation">documentation for CI integrations</a>.</p>Migration guidehttps://golangci-lint.run/docs/product/migration-guide/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/migration-guide/ +<h2>Command <code>migrate</code><span class="hx:absolute hx:-mt-20" id="command-migrate"></span> +<a href="#command-migrate" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>You can use golangci-lint to migrate your configuration with the <code>migrate</code> command:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint migrate</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Be aware that <strong>comments inside a configuration file are not migrated.</strong> You need to add them manually after the migration.</p> +<p><strong>Deprecated options from v1 or unknown fields are not migrated.</strong></p> +<p>The migration file format is based on the extension of the <a href="https://golangci-lint.run/docs/configuration/file/">configuration file</a>. +The format can be overridden by using the <code>--format</code> flag:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint migrate --format json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Before the migration, the previous configuration file is copied and saved to a file named <code>&lt;config_file_name&gt;.bck.&lt;config_file_extension&gt;</code>.</p> +<p>By default, before the migration process, the configuration file is validated against the JSON Schema of configuration v1. +If you want to skip this validation, you can use the <code>--skip-validation</code> flag:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint migrate --skip-validation</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The <code>migrate</code> command enforces the following default values:</p> +<ul> +<li><code>run.timeout</code>: the existing value is ignored because, in v2, there is no timeout by default.</li> +<li><code>issues.show-stats</code>: the existing value is ignored because, in v2, stats are enabled by default.</li> +<li><code>run.concurrency</code>: if the existing value was <code>0</code>, it is removed as <code>0</code> is the new default.</li> +<li><code>run.relative-path-mode</code>: if the existing value was <code>cfg</code>, it is removed as <code>cfg</code> is the new default.</li> +</ul> +<p><code>issues.exclude-generated</code> has a new default value (v1 <code>lax</code>, v2 <code>strict</code>), so this field will be added during the migration to maintain the previous behavior.</p> +<p><code>issues.exclude-dirs-use-default</code> has been removed, so it is converted to <code>linters.exclusions.paths</code> and, if needed, <code>formatters.exclusions.paths</code>.</p> +<p>Other fields explicitly defined in the configuration file are migrated even if the value is the same as the default value.</p> +<p>The <code>migrate</code> command automatically migrates <code>linters.presets</code> in individual linters to <code>linters.enable</code>.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint migrate -h +</span></span><span class="line"><span class="cl"><span class="go">Migrate configuration file from v1 to v2. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint migrate [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --format string Output file format. +</span></span></span><span class="line"><span class="cl"><span class="go"> By default, the format of the input configuration file is used. +</span></span></span><span class="line"><span class="cl"><span class="go"> It can be &#39;yml&#39;, &#39;yaml&#39;, &#39;toml&#39;, or &#39;json&#39;. +</span></span></span><span class="line"><span class="cl"><span class="go"> --skip-validation Skip validation of the configuration file against the JSON Schema for v1. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Changes<span class="hx:absolute hx:-mt-20" id="changes"></span> +<a href="#changes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3><code>linters</code><span class="hx:absolute hx:-mt-20" id="linters"></span> +<a href="#linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>linters.disable-all</code><span class="hx:absolute hx:-mt-20" id="lintersdisable-all"></span> +<a href="#lintersdisable-all" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.default: none</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">none</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.enable-all</code><span class="hx:absolute hx:-mt-20" id="lintersenable-all"></span> +<a href="#lintersenable-all" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.default: all</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.enable[].&lt;formatter_name&gt;</code><span class="hx:absolute hx:-mt-20" id="lintersenableformatter_name"></span> +<a href="#lintersenableformatter_name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The linters <code>gci</code>, <code>gofmt</code>, <code>gofumpt</code>, and <code>goimports</code> have been moved to the <code>formatters</code> section.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gci</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofumpt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goimports</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gci</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofumpt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goimports</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.enable[].{stylecheck,gosimple,staticcheck}</code><span class="hx:absolute hx:-mt-20" id="lintersenablestylecheckgosimplestaticcheck"></span> +<a href="#lintersenablestylecheckgosimplestaticcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The linters <code>stylecheck</code>, <code>gosimple</code>, and <code>staticcheck</code> has been merged inside the <code>staticcheck</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosimple</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stylecheck</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.fast</code><span class="hx:absolute hx:-mt-20" id="lintersfast"></span> +<a href="#lintersfast" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>There are 2 new options (they are not strictly equivalent to the previous option):</p> +<ol> +<li><code>linters.default: fast</code>: set all &ldquo;fast&rdquo; linters as the default set of linters. +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">fast</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</li> +<li><code>--fast-only</code>: filters all enabled linters to keep only &ldquo;fast&rdquo; linters.</li> +</ol> +<h4><code>linters.presets</code><span class="hx:absolute hx:-mt-20" id="linterspresets"></span> +<a href="#linterspresets" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>The <code>migrate</code> command automatically migrates <code>linters.presets</code> in individual linters to <code>linters.enable</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><p>Presets:</p> +<table> +<thead> +<tr> +<th>name</th> +<th>linters</th> +</tr> +</thead> +<tbody> +<tr> +<td>bugs</td> +<td><code>asasalint</code>, <code>asciicheck</code>, <code>bidichk</code>, <code>bodyclose</code>, <code>contextcheck</code>, <code>durationcheck</code>, <code>errcheck</code>, <code>errchkjson</code>, <code>errorlint</code>, <code>exhaustive</code>, <code>gocheckcompilerdirectives</code>, <code>gochecksumtype</code>, <code>gosec</code>, <code>gosmopolitan</code>, <code>govet</code>, <code>loggercheck</code>, <code>makezero</code>, <code>musttag</code>, <code>nilerr</code>, <code>nilnesserr</code>, <code>noctx</code>, <code>protogetter</code>, <code>reassign</code>, <code>recvcheck</code>, <code>rowserrcheck</code>, <code>spancheck</code>, <code>sqlclosecheck</code>, <code>staticcheck</code>, <code>testifylint</code>, <code>zerologlint</code></td> +</tr> +<tr> +<td>comment</td> +<td><code>dupword</code>, <code>godot</code>, <code>godox</code>, <code>misspell</code></td> +</tr> +<tr> +<td>complexity</td> +<td><code>cyclop</code>, <code>funlen</code>, <code>gocognit</code>, <code>gocyclo</code>, <code>maintidx</code>, <code>nestif</code></td> +</tr> +<tr> +<td>error</td> +<td><code>err113</code>, <code>errcheck</code>, <code>errorlint</code>, <code>wrapcheck</code></td> +</tr> +<tr> +<td>format</td> +<td><code>gci</code>, <code>gofmt</code>, <code>gofumpt</code>, <code>goimports</code></td> +</tr> +<tr> +<td>import</td> +<td><code>depguard</code>, <code>gci</code>, <code>goimports</code>, <code>gomodguard</code></td> +</tr> +<tr> +<td>metalinter</td> +<td><code>gocritic</code>, <code>govet</code>, <code>revive</code>, <code>staticcheck</code></td> +</tr> +<tr> +<td>module</td> +<td><code>depguard</code>, <code>gomoddirectives</code>, <code>gomodguard</code></td> +</tr> +<tr> +<td>performance</td> +<td><code>bodyclose</code>, <code>fatcontext</code>, <code>noctx</code>, <code>perfsprint</code>, <code>prealloc</code></td> +</tr> +<tr> +<td>sql</td> +<td><code>rowserrcheck</code>, <code>sqlclosecheck</code></td> +</tr> +<tr> +<td>style</td> +<td><code>asciicheck</code>, <code>canonicalheader</code>, <code>containedctx</code>, <code>copyloopvar</code>, <code>decorder</code>, <code>depguard</code>, <code>dogsled</code>, <code>dupl</code>, <code>err113</code>, <code>errname</code>, <code>exhaustruct</code>, <code>exptostd</code>, <code>forbidigo</code>, <code>forcetypeassert</code>, <code>ginkgolinter</code>, <code>gochecknoglobals</code>, <code>gochecknoinits</code>, <code>goconst</code>, <code>gocritic</code>, <code>godot</code>, <code>godox</code>, <code>goheader</code>, <code>gomoddirectives</code>, <code>gomodguard</code>, <code>goprintffuncname</code>, <code>gosimple</code>, <code>grouper</code>, <code>iface</code>, <code>importas</code>, <code>inamedparam</code>, <code>interfacebloat</code>, <code>intrange</code>, <code>ireturn</code>, <code>lll</code>, <code>loggercheck</code>, <code>makezero</code>, <code>mirror</code>, <code>misspell</code>, <code>mnd</code>, <code>musttag</code>, <code>nakedret</code>, <code>nilnil</code>, <code>nlreturn</code>, <code>nolintlint</code>, <code>nonamedreturns</code>, <code>nosprintfhostport</code>, <code>paralleltest</code>, <code>predeclared</code>, <code>promlinter</code>, <code>revive</code>, <code>sloglint</code>, <code>stylecheck</code>, <code>tagalign</code>, <code>tagliatelle</code>, <code>testpackage</code>, <code>tparallel</code>, <code>unconvert</code>, <code>usestdlibvars</code>, <code>varnamelen</code>, <code>wastedassign</code>, <code>whitespace</code>, <code>wrapcheck</code>, <code>wsl</code></td> +</tr> +<tr> +<td>test</td> +<td><code>exhaustruct</code>, <code>paralleltest</code>, <code>testableexamples</code>, <code>testifylint</code>, <code>testpackage</code>, <code>thelper</code>, <code>tparallel</code>, <code>usetesting</code></td> +</tr> +<tr> +<td>unused</td> +<td><code>ineffassign</code>, <code>unparam</code>, <code>unused</code></td> +</tr> +</tbody> +</table></div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>typecheck</code><span class="hx:absolute hx:-mt-20" id="typecheck"></span> +<a href="#typecheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This <code>typecheck</code> is not a linter, so it cannot be enabled or disabled:</p> +<ul> +<li><a href="https://golangci-lint.run/docs/welcome/faq/#why-do-you-have-typecheck-errors">FAQ: Why do you have typecheck errors?</a></li> +<li><a href="https://golangci-lint.run/docs/welcome/faq/#why-is-it-not-possible-to-skipignore-typecheck-errors">FAQ: Why is it not possible to skip/ignore typecheck errors?</a></li> +</ul> +<h4>Deprecated Linters<span class="hx:absolute hx:-mt-20" id="deprecated-linters"></span> +<a href="#deprecated-linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The following deprecated linters have been removed:</p> +<ul> +<li><code>deadcode</code></li> +<li><code>execinquery</code></li> +<li><code>exhaustivestruct</code></li> +<li><code>exportloopref</code></li> +<li><code>golint</code></li> +<li><code>ifshort</code></li> +<li><code>interfacer</code></li> +<li><code>maligned</code></li> +<li><code>nosnakecase</code></li> +<li><code>scopelint</code></li> +<li><code>structcheck</code></li> +<li><code>tenv</code></li> +<li><code>varcheck</code></li> +</ul> +<h4>Alternative Linter Names<span class="hx:absolute hx:-mt-20" id="alternative-linter-names"></span> +<a href="#alternative-linter-names" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The alternative linters has been removed.</p> +<table> +<thead> +<tr> +<th>Alt Name v1</th> +<th>Name v2</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>gas</code></td> +<td><code>gosec</code></td> +</tr> +<tr> +<td><code>goerr113</code></td> +<td><code>err113</code></td> +</tr> +<tr> +<td><code>gomnd</code></td> +<td><code>mnd</code></td> +</tr> +<tr> +<td><code>logrlint</code></td> +<td><code>loggercheck</code></td> +</tr> +<tr> +<td><code>megacheck</code></td> +<td><code>staticcheck</code></td> +</tr> +<tr> +<td><code>vet</code></td> +<td><code>govet</code></td> +</tr> +<tr> +<td><code>vetshadow</code></td> +<td><code>govet</code></td> +</tr> +</tbody> +</table> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goerr113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">logrlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">megacheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">vet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">vetshadow</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loggercheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">govet</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>linters-settings</code><span class="hx:absolute hx:-mt-20" id="linters-settings"></span> +<a href="#linters-settings" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The <code>linters-settings</code> section has been split into <code>linters.settings</code> and <code>formatters.settings</code>.</p> +<p>Settings for <code>gci</code>, <code>gofmt</code>, <code>gofumpt</code>, and <code>goimports</code> are moved to the <code>formatters.settings</code> section.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simplify</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simplify</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.asasalint.ignore-test</code><span class="hx:absolute hx:-mt-20" id="linters-settingsasasalintignore-test"></span> +<a href="#linters-settingsasasalintignore-test" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To ignore test files, use <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">asasalint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-test</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asasalint</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.copyloopvar.ignore-alias</code><span class="hx:absolute hx:-mt-20" id="linters-settingscopyloopvarignore-alias"></span> +<a href="#linters-settingscopyloopvarignore-alias" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.58.0 and has been replaced with <code>linters.settings.copyloopvar.check-alias</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">copyloopvar</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-alias</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">copyloopvar</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-alias</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.cyclop.skip-tests</code><span class="hx:absolute hx:-mt-20" id="linters-settingscyclopskip-tests"></span> +<a href="#linters-settingscyclopskip-tests" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To ignore test files, use <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cyclop</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-test</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cyclop</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.errcheck.exclude</code><span class="hx:absolute hx:-mt-20" id="linters-settingserrcheckexclude"></span> +<a href="#linters-settingserrcheckexclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.42.0 and has been removed.</p> +<p>To exclude functions, use <code>linters.settings.errcheck.exclude-functions</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="l">./errcheck_excludes.txt</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.ReadFile</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(*bytes.Buffer)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(os.Stdout)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.errcheck.ignore</code><span class="hx:absolute hx:-mt-20" id="linters-settingserrcheckignore"></span> +<a href="#linters-settingserrcheckignore" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.13.0 and has been removed.</p> +<p>To exclude functions, use <code>linters.settings.errcheck.exclude-functions</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;io:.*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;io.ReadFile&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;io.Copy(*bytes.Buffer)&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;io.Copy(os.Stdout)&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.exhaustive.check-generated</code><span class="hx:absolute hx:-mt-20" id="linters-settingsexhaustivecheck-generated"></span> +<a href="#linters-settingsexhaustivecheck-generated" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To analyze generated files, use <code>linters.exclusions.generated</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exhaustive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-generated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">disable</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.forbidigo.forbid[].p</code><span class="hx:absolute hx:-mt-20" id="linters-settingsforbidigoforbidp"></span> +<a href="#linters-settingsforbidigoforbidp" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This field has been replaced with <code>linters-settings.forbidigo.forbid[].pattern</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">p</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^fmt\.Print.*$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="l">Do not commit print statements.</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^fmt\.Print.*$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="l">Do not commit print statements.</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.forbidigo.forbid[]&lt;pattern&gt;</code><span class="hx:absolute hx:-mt-20" id="linters-settingsforbidigoforbidpattern"></span> +<a href="#linters-settingsforbidigoforbidpattern" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The <code>pattern</code> has become mandatory for the <code>forbid</code> field.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^print(ln)?$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^spew\.(ConfigState\.)?Dump$&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^print(ln)?$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^spew\.(ConfigState\.)?Dump$&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.gci.local-prefixes</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgcilocal-prefixes"></span> +<a href="#linters-settingsgcilocal-prefixes" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.44.0 and has been removed.</p> +<p>Use <code>linters.settings.gci.sections</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-prefixes</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/pkg&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sections</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">standard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">prefix(github.com/example/pkg)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.gci.skip-generated</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgciskip-generated"></span> +<a href="#linters-settingsgciskip-generated" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To analyze generated files, use <code>linters.exclusions.generated</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-generated</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">disable</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.goconst.ignore-tests</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgoconstignore-tests"></span> +<a href="#linters-settingsgoconstignore-tests" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To ignore test files, use <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goconst</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-tests</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.gocritic.settings.ruleguard.rules</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgocriticsettingsruleguardrules"></span> +<a href="#linters-settingsgocriticsettingsruleguardrules" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The special variable <code>${configDir}</code> has been replaced with <code>${base-path}</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocritic</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ruleguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;${configDir}/ruleguard/rules-*.go&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocritic</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ruleguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;${base-path}/ruleguard/rules-*.go&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.govet.check-shadowing</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgovetcheck-shadowing"></span> +<a href="#linters-settingsgovetcheck-shadowing" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.57.0 and has been removed.</p> +<p>Use <code>linters.settings.govet.enable: shadow</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-shadowing</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shadow</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.misspell.ignore-words</code><span class="hx:absolute hx:-mt-20" id="linters-settingsmisspellignore-words"></span> +<a href="#linters-settingsmisspellignore-words" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been replaced with <code>linters.settings.misspell.ignore-rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">misspell</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-words</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">misspell</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.predeclared.ignore</code><span class="hx:absolute hx:-mt-20" id="linters-settingspredeclaredignore"></span> +<a href="#linters-settingspredeclaredignore" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This string option has been replaced with the slice option with the same name.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;new,int&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">int</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.predeclared.q</code><span class="hx:absolute hx:-mt-20" id="linters-settingspredeclaredq"></span> +<a href="#linters-settingspredeclaredq" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been replaced with <code>linters.settings.predeclared.qualified-name</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">q</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">qualified-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.revive.ignore-generated-header</code><span class="hx:absolute hx:-mt-20" id="linters-settingsreviveignore-generated-header"></span> +<a href="#linters-settingsreviveignore-generated-header" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>Use <code>linters.exclusions.generated</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">revive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-generated-header</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">strict</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.sloglint.context-only</code><span class="hx:absolute hx:-mt-20" id="linters-settingssloglintcontext-only"></span> +<a href="#linters-settingssloglintcontext-only" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.58.0 and has been replaced with <code>linters.settings.sloglint.context</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sloglint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sloglint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context</span><span class="p">:</span><span class="w"> </span><span class="l">all</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.staticcheck.go</code><span class="hx:absolute hx:-mt-20" id="linters-settingsstaticcheckgo"></span> +<a href="#linters-settingsstaticcheckgo" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.47.0 and has been removed.</p> +<p>Use <code>run.go</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">staticcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1.22&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1.22&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.unused.exported-is-used</code><span class="hx:absolute hx:-mt-20" id="linters-settingsunusedexported-is-used"></span> +<a href="#linters-settingsunusedexported-is-used" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.60.0 and has been removed.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unused</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exported-is-used</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.usestdlibvars.os-dev-null</code><span class="hx:absolute hx:-mt-20" id="linters-settingsusestdlibvarsos-dev-null"></span> +<a href="#linters-settingsusestdlibvarsos-dev-null" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.51.0 and has been removed.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usestdlibvars</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-dev-null</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.usestdlibvars.syslog-priority</code><span class="hx:absolute hx:-mt-20" id="linters-settingsusestdlibvarssyslog-priority"></span> +<a href="#linters-settingsusestdlibvarssyslog-priority" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.51.0 and has been removed.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usestdlibvars</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">syslog-priority</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignoreInterfaceRegexps</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignoreinterfaceregexps"></span> +<a href="#linters-settingswrapcheckignoreinterfaceregexps" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-interface-regexps</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignoreInterfaceRegexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^(?i)c(?-i)ach(ing|e)&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-interface-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^(?i)c(?-i)ach(ing|e)&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignorePackageGlobs</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignorepackageglobs"></span> +<a href="#linters-settingswrapcheckignorepackageglobs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-package-globs</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignorePackageGlobs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;encoding/*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-package-globs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;encoding/*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignoreSigRegexps</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignoresigregexps"></span> +<a href="#linters-settingswrapcheckignoresigregexps" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-sig-regexps</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignoreSigRegexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;\.New.*Error\(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sig-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;\.New.*Error\(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignoreSigs</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignoresigs"></span> +<a href="#linters-settingswrapcheckignoresigs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-sigs</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignoreSigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.Errorf(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.Errorf(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>issues</code><span class="hx:absolute hx:-mt-20" id="issues"></span> +<a href="#issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>issues.exclude-case-sensitive</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-case-sensitive"></span> +<a href="#issuesexclude-case-sensitive" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p><code>issues.exclude</code>, <code>issues.exclude-rules.text</code>, and <code>issues.exclude-rules.source</code> are case-sensitive by default.</p> +<p>To ignore case, use <code>(?i)</code> at the beginning of a regex syntax.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-case-sensitive</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;abcdef&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="l">(?i)abcdef</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-dirs-use-default</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-dirs-use-default"></span> +<a href="#issuesexclude-dirs-use-default" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>Use <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code> to exclude directories.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-dirs-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">third_party$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtin$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">examples$</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-dirs</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-dirs"></span> +<a href="#issuesexclude-dirs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-dirs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-files</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-files"></span> +<a href="#issuesexclude-files" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-generated-strict</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-generated-strict"></span> +<a href="#issuesexclude-generated-strict" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.59.0 and has been replaced with <code>linters.exclusions.generated: strict</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-generated-strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">strict</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-generated</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-generated"></span> +<a href="#issuesexclude-generated" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.generated</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-generated</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-rules</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-rules"></span> +<a href="#issuesexclude-rules" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">internal/hmac/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;weak cryptographic primitive&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;SA9003:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;foo&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">internal/hmac/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="l">weak cryptographic primitive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;SA9003:&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-use-default</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-use-default"></span> +<a href="#issuesexclude-use-default" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.presets</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude</code><span class="hx:absolute hx:-mt-20" id="issuesexclude"></span> +<a href="#issuesexclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">abcdef</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="l">abcdef</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.include</code><span class="hx:absolute hx:-mt-20" id="issuesinclude"></span> +<a href="#issuesinclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.presets</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">EXC0014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">EXC0015</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>output</code><span class="hx:absolute hx:-mt-20" id="output"></span> +<a href="#output" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>output.format</code><span class="hx:absolute hx:-mt-20" id="outputformat"></span> +<a href="#outputformat" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been replaced with <code>output.formats</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;checkstyle:report.xml,json:stdout,colored-line-number&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkstyle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;report.xml&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">color</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: &lt;name&gt;</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-name"></span> +<a href="#outputformatsformat-name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The property <code>output.formats[].format</code> has been replaced with <code>output.formats[].&lt;format_name&gt;</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stderr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">checkstyle</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">report.xml</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stderr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkstyle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">report.xml</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: line-number</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-line-number"></span> +<a href="#outputformatsformat-line-number" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This format has been replaced by the format <code>text</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">line-number</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: colored-line-number</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-colored-line-number"></span> +<a href="#outputformatsformat-colored-line-number" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This format has been replaced by the format <code>text</code> with the option <code>colors</code> (<code>true</code> by default).</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">colored-line-number</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: colored-tab</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-colored-tab"></span> +<a href="#outputformatsformat-colored-tab" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This format has been replaced by the format <code>tab</code> with the option <code>colors</code> (<code>true</code> by default).</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">colored-tab</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.print-issued-lines</code><span class="hx:absolute hx:-mt-20" id="outputprint-issued-lines"></span> +<a href="#outputprint-issued-lines" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>To not print the lines with issues, use the <code>text</code> format with the option <code>print-issued-lines: false</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">line-number</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-issued-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-issued-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.print-linter-name</code><span class="hx:absolute hx:-mt-20" id="outputprint-linter-name"></span> +<a href="#outputprint-linter-name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>To not print the linter name, use the <code>text</code> format with the option <code>print-linter-name: false</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">line-number</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.show-stats</code><span class="hx:absolute hx:-mt-20" id="outputshow-stats"></span> +<a href="#outputshow-stats" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property is <code>true</code> by default.</p> +<h4><code>output.sort-order</code><span class="hx:absolute hx:-mt-20" id="outputsort-order"></span> +<a href="#outputsort-order" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has a new default value <code>['linter', 'file']</code> instead of <code>['file']</code>.</p> +<h4><code>output.sort-results</code><span class="hx:absolute hx:-mt-20" id="outputsort-results"></span> +<a href="#outputsort-results" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The property has been removed.</p> +<p>The output results are always sorted.</p> +<h4><code>output.uniq-by-line</code><span class="hx:absolute hx:-mt-20" id="outputuniq-by-line"></span> +<a href="#outputuniq-by-line" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.63.0 and has been replaced by <code>issues.uniq-by-line</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uniq-by-line</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uniq-by-line</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>run</code><span class="hx:absolute hx:-mt-20" id="run"></span> +<a href="#run" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>run.go</code><span class="hx:absolute hx:-mt-20" id="rungo"></span> +<a href="#rungo" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The new fallback value for this property is <code>1.22</code> instead of <code>1.17</code>.</p> +<h4><code>run.concurrency</code><span class="hx:absolute hx:-mt-20" id="runconcurrency"></span> +<a href="#runconcurrency" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property value set to match Linux container CPU quota by default and fallback on the number of logical CPUs in the machine.</p> +<h4><code>run.relative-path-mode</code><span class="hx:absolute hx:-mt-20" id="runrelative-path-mode"></span> +<a href="#runrelative-path-mode" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has a new default value of <code>cfg</code> instead of <code>wd</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># When not specified, relative-path-mode is set to &#39;wd&#39; by default</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">relative-path-mode</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;cfg&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.show-stats</code><span class="hx:absolute hx:-mt-20" id="runshow-stats"></span> +<a href="#runshow-stats" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been replaced by <code>output.show-stats</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-stats</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-stats</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.skip-dirs-use-default</code><span class="hx:absolute hx:-mt-20" id="runskip-dirs-use-default"></span> +<a href="#runskip-dirs-use-default" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been replaced by <code>issues.exclude-dirs-use-default</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-dirs-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-dirs-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.skip-dirs</code><span class="hx:absolute hx:-mt-20" id="runskip-dirs"></span> +<a href="#runskip-dirs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been removed.</p> +<p>Use <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code> to exclude directories.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-dirs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.skip-files</code><span class="hx:absolute hx:-mt-20" id="runskip-files"></span> +<a href="#runskip-files" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been removed.</p> +<p>Use <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code> to exclude files.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.timeout</code><span class="hx:absolute hx:-mt-20" id="runtimeout"></span> +<a href="#runtimeout" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property value is disabled by default (<code>0</code>).</p> +<h3><code>severity</code><span class="hx:absolute hx:-mt-20" id="severity"></span> +<a href="#severity" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>severity.default-severity</code><span class="hx:absolute hx:-mt-20" id="severitydefault-severity"></span> +<a href="#severitydefault-severity" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>severity.default</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-severity</span><span class="p">:</span><span class="w"> </span><span class="l">error</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">error</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>severity.rules.case-sensitive</code><span class="hx:absolute hx:-mt-20" id="severityrulescase-sensitive"></span> +<a href="#severityrulescase-sensitive" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>severity.rules.text</code> and <code>severity.rules.source</code> are case-sensitive by default.</p> +<p>To ignore case, use <code>(?i)</code> at the beginning of a regex syntax.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case-sensitive</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Example.*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(?i)Example.*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>version</code><span class="hx:absolute hx:-mt-20" id="version"></span> +<a href="#version" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The <code>version</code> property has been added to the configuration file.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Integration<span class="hx:absolute hx:-mt-20" id="integration"></span> +<a href="#integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4>Visual Studio Code<span class="hx:absolute hx:-mt-20" id="visual-studio-code"></span> +<a href="#visual-studio-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast-only&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">],</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatTool&#34;</span><span class="p">:</span> <span class="s2">&#34;custom&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.alternateTools&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;customFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">},</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;fmt&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--stdin&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3>Command Line Flags<span class="hx:absolute hx:-mt-20" id="command-line-flags"></span> +<a href="#command-line-flags" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The following flags have been removed:</p> +<ul> +<li><code>--disable-all</code></li> +<li><code>--enable-all</code></li> +<li><code>-p, --presets</code></li> +<li><code>--fast</code></li> +<li><code>-e, --exclude</code></li> +<li><code>--exclude-case-sensitive</code></li> +<li><code>--exclude-dirs-use-default</code></li> +<li><code>--exclude-dirs</code></li> +<li><code>--exclude-files</code></li> +<li><code>--exclude-generated</code></li> +<li><code>--exclude-use-default</code></li> +<li><code>--go string</code></li> +<li><code>--sort-order</code></li> +<li><code>--sort-results</code></li> +<li><code>--out-format</code></li> +<li><code>--print-issued-lines</code></li> +<li><code>--print-linter-name</code></li> +</ul> +<h4><code>--out-format</code><span class="hx:absolute hx:-mt-20" id="--out-format"></span> +<a href="#--out-format" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--out-format</code> has been replaced with the following flags:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;colored-line-number&#39; and &#39;line-number&#39;</span> +</span></span><span class="line"><span class="cl">--output.text.path +</span></span><span class="line"><span class="cl">--output.text.print-linter-name +</span></span><span class="line"><span class="cl">--output.text.print-issued-lines +</span></span><span class="line"><span class="cl">--output.text.colors</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;json&#39;</span> +</span></span><span class="line"><span class="cl">--output.json.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;colored-tab&#39; and &#39;tab&#39;</span> +</span></span><span class="line"><span class="cl">--output.tab.path +</span></span><span class="line"><span class="cl">--output.tab.print-linter-name +</span></span><span class="line"><span class="cl">--output.tab.colors</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;html&#39;</span> +</span></span><span class="line"><span class="cl">--output.html.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;checkstyle&#39;</span> +</span></span><span class="line"><span class="cl">--output.checkstyle.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;code-climate&#39;</span> +</span></span><span class="line"><span class="cl">--output.code-climate.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;junit-xml&#39; and &#39;junit-xml-extended&#39;</span> +</span></span><span class="line"><span class="cl">--output.junit-xml.path +</span></span><span class="line"><span class="cl">--output.junit-xml.extended</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;teamcity&#39;</span> +</span></span><span class="line"><span class="cl">--output.teamcity.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;sarif&#39;</span> +</span></span><span class="line"><span class="cl">--output.sarif.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h4><code>--print-issued-lines</code><span class="hx:absolute hx:-mt-20" id="--print-issued-lines"></span> +<a href="#--print-issued-lines" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--print-issued-lines</code> has been replaced with <code>--output.text.print-issued-lines</code>.</p> +<h4><code>--print-linter-name</code><span class="hx:absolute hx:-mt-20" id="--print-linter-name"></span> +<a href="#--print-linter-name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--print-linter-name</code> has been replaced with <code>--output.text.print-linter-name</code> or <code>--output.tab.print-linter-name</code>.</p> +<h4><code>--disable-all</code> and <code>--enable-all</code><span class="hx:absolute hx:-mt-20" id="--disable-all-and---enable-all"></span> +<a href="#--disable-all-and---enable-all" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--disable-all</code> has been replaced with <code>--default=none</code>.</p> +<p><code>--enable-all</code> has been replaced with <code>--default=all</code>.</p> +<h4>Examples<span class="hx:absolute hx:-mt-20" id="examples"></span> +<a href="#examples" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Run only the <code>govet</code> linter, output results to stdout in JSON format, and sort results:</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --disable-all --enable<span class="o">=</span>govet --out-format<span class="o">=</span>json --sort-order<span class="o">=</span>linter --sort-results</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --default<span class="o">=</span>none --enable<span class="o">=</span>govet --output.json.path<span class="o">=</span>stdout</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<p>Do not print issued lines, output results to stdout without colors in text format, and to <code>gl-code-quality-report.json</code> file in Code Climate&rsquo;s format:</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --print-issued-lines<span class="o">=</span><span class="nb">false</span> --out-format code-climate:gl-code-quality-report.json,line-number</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --output.text.path<span class="o">=</span>stdout --output.text.colors<span class="o">=</span><span class="nb">false</span> --output.text.print-issued-lines<span class="o">=</span><span class="nb">false</span> --output.code-climate.path<span class="o">=</span>gl-code-quality-report.json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div>New lintershttps://golangci-lint.run/docs/contributing/new-linters/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/new-linters/ +<h2>How to write a linter<span class="hx:absolute hx:-mt-20" id="how-to-write-a-linter"></span> +<a href="#how-to-write-a-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Use <code>go/analysis</code> and take a look at <a href="https://web.archive.org/web/20250527152107/https://disaev.me/p/writing-useful-go-analysis-linter/"target="_blank" rel="noopener">this tutorial</a>: +it shows how to write <code>go/analysis</code> linter from scratch and integrate it into <code>golangci-lint</code>.</p> +<h2>How to add a public linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-public-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-public-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>You need to implement a new linter using <code>go/analysis</code> API.</p> +<p>We don&rsquo;t accept non <code>go/analysis</code> linters.</p> +<p>After that:</p> +<ol> +<li>Implement functional tests for the linter: +<ul> +<li>Add one file into directory <code>pkg/golinters/{yourlintername}/testdata/</code>.</li> +</ul> +</li> +<li>Add a new file <code>pkg/golinters/{yourlintername}/{yourlintername}.go</code>. +Other linters implementation can help you.</li> +<li>Add the new struct for the linter (which you&rsquo;ve implemented in <code>pkg/golinters/{yourlintername}/{yourlintername}.go</code>) to the +list of all supported linters in <a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/lint/lintersdb/builder_linter.go"target="_blank" rel="noopener"><code>pkg/lint/lintersdb/builder_linter.go</code></a> +to the method <code>LinterBuilder.Build</code>. +<ul> +<li>Add <code>WithSince(&quot;next_version&quot;)</code>, where <code>next_version</code> must be replaced by the next minor version. (ex: v1.2.0 if the current version is v1.1.0)</li> +</ul> +</li> +<li>Find out what options do you need to configure for the linter. +For example, <code>nakedret</code> has only 1 option: <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.reference.yml"target="_blank" rel="noopener"><code>max-func-lines</code></a>. +Choose default values to not being annoying for users of golangci-lint. Add configuration options to: +<ul> +<li><a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml"target="_blank" rel="noopener">.golangci.next.reference.yml</a>: the example of a configuration file. +You can also add them to <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.yml"target="_blank" rel="noopener">.golangci.yml</a> +if you think that this project needs not default values.</li> +<li><a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/config/config.go"target="_blank" rel="noopener">config struct</a>: +don&rsquo;t forget about <code>mapstructure</code> tags for proper configuration files parsing.</li> +</ul> +</li> +<li>Take a look at the example of <a href="https://github.com/golangci/golangci-lint/pulls?q=is%3Apr&#43;is%3Amerged&#43;label%3A%22linter%3A&#43;new%22"target="_blank" rel="noopener">pull requests with new linter support</a>.</li> +<li>Run the tests: +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go run ./cmd/golangci-lint/ run --no-config --default<span class="o">=</span>none --enable<span class="o">={</span>yourlintername<span class="o">}</span> ./pkg/golinters/<span class="o">{</span>yourlintername<span class="o">}</span>/testdata/<span class="o">{</span>yourlintername<span class="o">}</span>.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</li> +</ol> +<h2>How to add a private linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-private-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-private-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Some people and organizations may choose to have custom-made linters run as a part of <code>golangci-lint</code>.<br> +Typically, these linters can&rsquo;t be open-sourced or too specific.</p> +<p>Such linters can be added through 2 plugin systems:</p> +<div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/plugins/module-plugins" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"/></svg>Module Plugin System</span><div class="hextra-badge hextra-card-tag" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700">Recommended</div> +</div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-transparent hx:shadow-xs hx:dark:border-neutral-800 hx:hover:bg-slate-50 hx:hover:shadow-md hx:dark:hover:border-neutral-700 hx:dark:hover:bg-neutral-900"href="https://golangci-lint.run/docs/plugins/go-plugins" +><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:p-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50"><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M11 4a2 2 0 114 0v1a1 1 0 001 1h3a1 1 0 011 1v3a1 1 0 01-1 1h-1a2 2 0 100 4h1a1 1 0 011 1v3a1 1 0 01-1 1h-3a1 1 0 01-1-1v-1a2 2 0 10-4 0v1a1 1 0 01-1 1H7a1 1 0 01-1-1v-3a1 1 0 00-1-1H4a2 2 0 110-4h1a1 1 0 001-1V7a1 1 0 011-1h3a1 1 0 001-1V4z"/></svg>Go Plugin System</span></a> +</div>Roadmaphttps://golangci-lint.run/docs/product/roadmap/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/roadmap/ +<h2>💡 Feature Requests<span class="hx:absolute hx:-mt-20" id="-feature-requests"></span> +<a href="#-feature-requests" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Please file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.</p> +<p><a href="https://github.com/golangci/golangci-lint/issues?utf8=%e2%9c%93&amp;q=is%3Aissue&#43;is%3Aopen&#43;sort%3Areactions-%2B1-desc&#43;label%3Aenhancement"target="_blank" rel="noopener">See Feature Requests</a></p> +<h2>🐛 Bugs<span class="hx:absolute hx:-mt-20" id="-bugs"></span> +<a href="#-bugs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Please file an issue for bugs, missing documentation or unexpected behavior.</p> +<p><a href="https://github.com/golangci/golangci-lint/issues?utf8=%e2%9c%93&amp;q=is%3Aissue&#43;is%3Aopen&#43;label%3A%22bug%22&#43;sort%3Acreated-desc"target="_blank" rel="noopener">See Bugs</a></p> +<h2>Versioning Policy<span class="hx:absolute hx:-mt-20" id="versioning-policy"></span> +<a href="#versioning-policy" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>golangci-lint follows <a href="https://semver.org/"target="_blank" rel="noopener">semantic versioning</a>. However, due to the nature of golangci-lint as a code quality tool, +it&rsquo;s not always clear when a minor or major version bump occurs. +To help clarify this for everyone, we&rsquo;ve defined the following semantic versioning policy:</p> +<ul> +<li>Patch release (intended to not break your lint build) +<ul> +<li>A patch version update in a specific linter that results in golangci-lint reporting fewer errors.</li> +<li>A bug fix to the CLI or core (packages loading, runner, postprocessors, etc).</li> +<li>Improvements to documentation.</li> +<li>Non-user-facing changes such as refactoring code, adding, deleting, or modifying tests, and increasing test coverage.</li> +<li>Re-releasing after a failed release (i.e., publishing a release that doesn&rsquo;t work for anyone).</li> +</ul> +</li> +<li>Minor release (might break your lint build because of newly found issues) +<ul> +<li>A major or minor version update of a specific linter that results in golangci-lint reporting more errors.</li> +<li>A new linter is added.</li> +<li>An existing configuration option or linter is deprecated.</li> +<li>A new CLI command is created.</li> +<li>Backward incompatible change of configuration.</li> +</ul> +</li> +<li>Major release (likely to break your lint build) +<ul> +<li>Backward incompatible change of configuration with huge impact.</li> +</ul> +</li> +</ul> +<p>According to our policy, any minor update may report more errors than the previous release (ex: from a bug fix). +As such, we recommend using the fixed minor version and fixed or the latest patch version to guarantee the results of your builds.</p> +<p>For example, in our <a href="https://github.com/golangci/golangci-lint-action"target="_blank" rel="noopener">GitHub Action</a> we require users to explicitly set the minor version of golangci-lint +and we always use the latest patch version.</p> +<h2>Linter Deprecation Cycle<span class="hx:absolute hx:-mt-20" id="linter-deprecation-cycle"></span> +<a href="#linter-deprecation-cycle" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter can be deprecated for various reasons, e.g. the linter stops working with a newer version of Go or the author has abandoned its linter.</p> +<p>The deprecation of a linter will follow 3 phases:</p> +<ol> +<li><strong>Display of a warning message</strong>: The linter can still be used (unless it&rsquo;s completely non-functional), +but it&rsquo;s recommended to remove it from your configuration.</li> +<li><strong>Display of an error message</strong>: At this point, you should remove the linter. +The original implementation is replaced by a placeholder that does nothing. +The linter is NOT enabled when using <code>default: all</code> and should be removed from the <code>disable</code> option.</li> +<li><strong>Removal of the linter</strong> from golangci-lint.</li> +</ol> +<p>Each phase corresponds to a minor version:</p> +<ul> +<li>v1.0.0 -&gt; warning message</li> +<li>v1.1.0 -&gt; error message</li> +<li>v1.2.0 -&gt; linter removed</li> +</ul> +<p>We will provide clear information about those changes on different supports: changelog, logs, social network, etc.</p> +<p>We consider the removal of a linter as non-breaking changes for golangci-lint itself. +No major version will be created when a linter is removed.</p> +<h2>Future Plans<span class="hx:absolute hx:-mt-20" id="future-plans"></span> +<a href="#future-plans" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Upstream all changes of forked linters.</li> +<li>Make it easy to write own linter/checker: it should take a minimum code, have perfect documentation, debugging and testing tooling.</li> +<li>Speed up SSA loading: on-disk cache and existing code profiling-optimizing.</li> +<li>Analyze (don&rsquo;t only filter) only new code: analyze only changed files and dependencies, make incremental analysis, caches.</li> +<li>Smart new issues detector: don&rsquo;t print existing issues on changed lines.</li> +<li>Minimize false-positives by fixing linters and improving testing tooling.</li> +<li>Documentation for every issue type.</li> +</ol>Debugginghttps://golangci-lint.run/docs/contributing/debug/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/debug/ +<p>You can see a verbose output of linter by using <code>-v</code> option.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run -v</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>If you would like to see more detailed logs you can use the environment variable <code>GL_DEBUG</code>.<br> +Its value is a list of debug tags.</p> +<p>The existing debug tags are documented in the following file: <a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/logutils/logutils.go"target="_blank" rel="noopener">/pkg/logutils/logutils.go</a></p> +<p>For example:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GL_DEBUG</span><span class="o">=</span><span class="s2">&#34;loader,gocritic&#34;</span> golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GL_DEBUG</span><span class="o">=</span><span class="s2">&#34;loader,env&#34;</span> golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>FAQhttps://golangci-lint.run/docs/welcome/faq/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/faq/ +<h2>Which Go versions are supported?<span class="hx:absolute hx:-mt-20" id="which-go-versions-are-supported"></span> +<a href="#which-go-versions-are-supported" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The same as the Go team (the 2 latest minor versions).</p> +<p>Basically, golangci-lint supports Go versions lower or equal to the Go version used to compile it.</p> +<p>New versions of Go are not automatically supported because, in addition of the Go version used to build it, +some linters and/or internal pieces of golangci-lint could need to be adapted to support this new Go version.</p> +<h2>How to use golangci-lint in CI<span class="hx:absolute hx:-mt-20" id="how-to-use-golangci-lint-in-ci"></span> +<a href="#how-to-use-golangci-lint-in-ci" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Run golangci-lint in CI and check the exit code. If it&rsquo;s non-zero - fail the build.</p> +<p>See <a href="https://golangci-lint.run/docs/welcome/install/#ci-installation">how to properly install golangci-lint in CI</a></p> +<h2>golangci-lint doesn&rsquo;t work<span class="hx:absolute hx:-mt-20" id="golangci-lint-doesnt-work"></span> +<a href="#golangci-lint-doesnt-work" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Please ensure you are using the latest binary release.</li> +<li>Run it with <code>-v</code> option and check the output.</li> +<li>If it doesn&rsquo;t help, create a <a href="https://github.com/golangci/golangci-lint/issues/new/choose"target="_blank" rel="noopener">GitHub issue</a> with the output from the error and #2 above.</li> +</ol> +<h2>Why do you have <code>typecheck</code> errors?<span class="hx:absolute hx:-mt-20" id="why-do-you-have-typecheck-errors"></span> +<a href="#why-do-you-have-typecheck-errors" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><code>typecheck</code> is like a front-end for the Go compiler errors. +Compilation errors are identified/labeled as reports of <code>typecheck</code> but they are not produced by a linter called <code>typecheck</code>.</p> +<p><code>typecheck</code> is not a linter, it doesn&rsquo;t perform any analysis, +it&rsquo;s just a way to identify, parse, and display compiling errors (produced by the <code>types.Checker</code>) and some linter errors.</p> +<p>It cannot be disabled because of that.</p> +<p>Of course, this is just as good as the compiler itself, and a lot of compilation issues will not properly show where in the code your error lies.</p> +<p>As a consequence, the code to analyze should compile. +It means that if you try to run an analysis on a single file or a group of files or a package or a group of packages, +with dependencies on other files or packages of your project, as it doesn&rsquo;t compile (because of the missing pieces of code), +it also cannot be analyzed.</p> +<p>If there are <code>typecheck</code> errors, golangci-lint will not be able to produce other reports because that kind of error doesn&rsquo;t allow it to perform any analysis.</p> +<p>How to troubleshoot:</p> +<ol> +<li>Ensure the version of golangci-lint is built with a compatible version of Go (<code>golangci-lint version</code>).</li> +<li>Ensure dependencies are up to date with <code>go mod tidy</code>.</li> +<li>Ensure building works with <code>go run ./...</code>/<code>go build ./...</code> - whole package.</li> +<li>Ensure you are not running an analysis on code that depends on files/packages outside the scope of the analyzed elements.</li> +<li>If using CGO, ensure all required system libraries are installed.</li> +<li>If you are using private repositories/dependencies, ensure the <a href="https://go.dev/ref/mod#module-proxy"target="_blank" rel="noopener">Go proxy</a> (<code>GOPROXY</code>) and <a href="https://go.dev/ref/mod#checksum-database"target="_blank" rel="noopener">checksum database</a> (<code>GOSUMDB</code>) are right and/or your git configuration.</li> +</ol> +<h2>Why is it not possible to skip/ignore <code>typecheck</code> errors?<span class="hx:absolute hx:-mt-20" id="why-is-it-not-possible-to-skipignore-typecheck-errors"></span> +<a href="#why-is-it-not-possible-to-skipignore-typecheck-errors" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For mainly the same reasons that you cannot compile when you have a compiler error.</p> +<p><code>typecheck</code> errors are reported in the same style as linter reports/issues, +but are completely different because they are related to problems that block the analysis (<code>typecheck</code> is not a linter).</p> +<p>When there are <code>typecheck</code> errors, +most linters are not able to perform the analysis, +and they simply do not produce any reports, +so it&rsquo;s not possible to skip/ignore <code>typecheck</code> errors.</p> +<h2>Why running with <code>--fast-only</code> can be slow on the first run?<span class="hx:absolute hx:-mt-20" id="why-running-with---fast-only-can-be-slow-on-the-first-run"></span> +<a href="#why-running-with---fast-only-can-be-slow-on-the-first-run" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Because the first run caches type information. +All subsequent runs will be faster. +Usually this option is used during development on a local machine and compilation was already performed.</p> +<h2>How do you add a custom linter?<span class="hx:absolute hx:-mt-20" id="how-do-you-add-a-custom-linter"></span> +<a href="#how-do-you-add-a-custom-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>You can integrate it yourself, see this <a href="https://golangci-lint.run/docs/contributing/new-linters/">manual</a>. +Or you can create a <a href="https://github.com/golangci/golangci-lint/issues/new?assignees=&amp;labels=enhancement&amp;projects=&amp;template=feature_request.yml"target="_blank" rel="noopener">GitHub Issue</a> and we will integrate when time permits.</p> +<h2>How to integrate golangci-lint into a large project with thousands of issues<span class="hx:absolute hx:-mt-20" id="how-to-integrate-golangci-lint-into-a-large-project-with-thousands-of-issues"></span> +<a href="#how-to-integrate-golangci-lint-into-a-large-project-with-thousands-of-issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We are sure that every project can easily integrate golangci-lint, even the large one.</p> +<p>The idea is to not fix all existing issues. +Fix only newly added issue: issues in new code.</p> +<p>To do this, set up the CI to run golangci-lint with options <code>--new-from-merge-base=main</code> or <code>--new-from-rev=HEAD~1</code>.</p> +<p>Also, take a look at option <code>--new</code>, +but consider that CI scripts that generate unstaged files will make <code>--new</code> only point out issues in those files and not in the last commit. +In that regard <code>--new-from-merge-base=main</code> or <code>--new-from-rev=HEAD~1</code> are safer.</p> +<p>By doing this you won&rsquo;t create new issues in your code and can choose fix existing issues (or not).</p> +<h2>Why <code>--new-from-xxx</code> don&rsquo;t seem to be working in some cases?<span class="hx:absolute hx:-mt-20" id="why---new-from-xxx-dont-seem-to-be-working-in-some-cases"></span> +<a href="#why---new-from-xxx-dont-seem-to-be-working-in-some-cases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The options <code>--new-from-merge-base</code>, <code>--new-from-rev</code>, and <code>--new-from-patch</code> work by comparing <code>git diff</code> output and issues.</p> +<p>If an issue is not reported as the same line as the changes then the issue will be skipped. +This is the line of the issue is not inside the lines changed.</p> +<p>To fix that, you have to use the option <code>--whole-files</code>.</p> +<p>The side effect is the issues inside the file that contain changes but not directly related to the changes themselves will be reported.</p>FAQhttps://golangci-lint.run/docs/contributing/faq/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/faq/ +<h2>How to add a new open-source linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-new-open-source-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-new-open-source-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>See <a href="https://golangci-lint.run/docs/contributing/new-linters/#how-to-add-a-public-linter-to-golangci-lint">there</a>.</p> +<h2>How to add a new private linter to <code>golangci-lint</code><span class="hx:absolute hx:-mt-20" id="how-to-add-a-new-private-linter-to-golangci-lint"></span> +<a href="#how-to-add-a-new-private-linter-to-golangci-lint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>See <a href="https://golangci-lint.run/docs/contributing/new-linters/#how-to-add-a-private-linter-to-golangci-lint">there</a>.</p> +<h2>How to update an existing linter<span class="hx:absolute hx:-mt-20" id="how-to-update-an-existing-linter"></span> +<a href="#how-to-update-an-existing-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.github/dependabot.yml"target="_blank" rel="noopener">Dependabot</a> to update dependencies, including linters.<br> +The updates happen at least automatically once a week (Sunday 11am UTC).</p> +<p>No pull requests to update a linter will be accepted unless you are the author of the linter and specific changes are required.</p> +<h2>How to add a configuration option to an existing linter<span class="hx:absolute hx:-mt-20" id="how-to-add-a-configuration-option-to-an-existing-linter"></span> +<a href="#how-to-add-a-configuration-option-to-an-existing-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add a new field to the <a href="https://github.com/golangci/golangci-lint/blob/HEAD/pkg/config/linters_settings.go"target="_blank" rel="noopener">linter settings struct</a>.<br> +Document it in <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.next.reference.yml"target="_blank" rel="noopener">.golangci.next.reference.yml</a>.<br> +Pass it to the linter.</p> +<h2>How to see <code>INFO</code> or <code>DEBUG</code> logs<span class="hx:absolute hx:-mt-20" id="how-to-see-info-or-debug-logs"></span> +<a href="#how-to-see-info-or-debug-logs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>See <a href="https://golangci-lint.run/docs/contributing/debug/">tutorial about debugging</a>.</p>This Websitehttps://golangci-lint.run/docs/contributing/website/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/contributing/website/ +<h2>Technology<span class="hx:absolute hx:-mt-20" id="technology"></span> +<a href="#technology" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use <a href="https://gohugo.io/"target="_blank" rel="noopener">Hugo</a> for static site generation because sites built with it are very fast.</p> +<h2>Source Code<span class="hx:absolute hx:-mt-20" id="source-code"></span> +<a href="#source-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The website lives in <code>docs/</code> directory of <a href="https://github.com/golangci/golangci-lint"target="_blank" rel="noopener">golangci-lint repository</a>.</p> +<h2>Theme<span class="hx:absolute hx:-mt-20" id="theme"></span> +<a href="#theme" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The site is based on <a href="https://github.com/imfing/hextra"target="_blank" rel="noopener">hextra</a> theme.</p> +<h2>Templating<span class="hx:absolute hx:-mt-20" id="templating"></span> +<a href="#templating" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use <a href="https://gohugo.io/templates/types/#shortcode"target="_blank" rel="noopener">shortcodes</a> and <a href="https://gohugo.io/templates/types/#partial"target="_blank" rel="noopener">partials</a> based on files from <code>./docs/.tmp/</code> and <code>./docs/data/</code>.</p> +<ul> +<li>The files in <code>./docs/.tmp/</code> are used to be embedded with the shortcode <code>{{% golangci/embed file=&quot;filename.ext&quot; %}}</code>.</li> +<li>The files in <code>./docs/data/</code> are used as <a href="https://gohugo.io/content-management/data-sources/"target="_blank" rel="noopener">data sources</a>.</li> +</ul> +<p>These files are created by running:</p> +<ul> +<li><code>make website_expand_templates</code> in the root of the repository.</li> +<li><code>make website_dump_info</code> in the root of the repository. (only during a release)</li> +</ul> +<h3>Some Notes<span class="hx:absolute hx:-mt-20" id="some-notes"></span> +<a href="#some-notes" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://gohugo.io/templates/types/#shortcode"target="_blank" rel="noopener">shortcodes</a>:</p> +<ul> +<li>cannot be used inside another shortcode</li> +<li>can only be used inside a page</li> +<li>can contain Markdown or HTML, but the tag is different: <code>{{% shortcode %}}</code> vs <code>{{&lt; shortcode &gt;}}</code></li> +</ul> +<p><a href="https://gohugo.io/templates/types/#partial"target="_blank" rel="noopener">partials</a>:</p> +<ul> +<li>are reusable HTML blocks or &ldquo;functions&rdquo;</li> +<li>cannot be used inside a page</li> +<li>can be used inside another partial</li> +<li>can be used inside a shortcode</li> +<li>can be used inside a layout</li> +</ul> +<h2>Hosting<span class="hx:absolute hx:-mt-20" id="hosting"></span> +<a href="#hosting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We use GitHub Pages for static website hosting and CD.</p> +<p>GitHub deploys the website to production after merging anything to a <code>main</code> branch.</p> +<h2>Local Testing<span class="hx:absolute hx:-mt-20" id="local-testing"></span> +<a href="#local-testing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Install Hugo Extended (v0.148.1 or newer).</p> +<p>Run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make docs_serve</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>or</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make website_expand_templates +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="nb">cd</span> docs/ +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># (inside the docs/ folder)</span> +</span></span><span class="line"><span class="cl">make serve</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>And navigate to <code>http://localhost:1313</code> after a successful build.</p> +<p>There is no need to restart the Hugo server for almost all changes: it supports hot reload.<br> +Also, there is no need to refresh a webpage: hot reload updates changed content on the open page.</p> +<h2>Website Build<span class="hx:absolute hx:-mt-20" id="website-build"></span> +<a href="#website-build" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To do this, run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make docs_build</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>or</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># (in the root of the repository)</span> +</span></span><span class="line"><span class="cl">make website_copy_jsonschema website_expand_templates +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="nb">cd</span> docs/ +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># (inside the docs/ folder)</span> +</span></span><span class="line"><span class="cl">make build</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> \ No newline at end of file diff --git a/docs/linters/configuration/index.html b/docs/linters/configuration/index.html new file mode 100644 index 000000000000..ead5d3db7c1e --- /dev/null +++ b/docs/linters/configuration/index.html @@ -0,0 +1,4139 @@ +Settings – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Settings

    arangolint +

    Opinionated best practices for arangodb client.

    Since golangci-lint v2.2.0
    +Repository

    No settings available.

    asasalint +

    Check for pass []any as any in variadic func(…any).

    Since golangci-lint v1.47.0
    +Repository

    linters:
    +  settings:
    +    asasalint:
    +      # To specify a set of function names to exclude.
    +      # The values are merged with the builtin exclusions.
    +      # The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`.
    +      # Default: ["^(fmt|log|logger|t|)\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$"]
    +      exclude:
    +        - Append
    +        - \.Wrapf
    +      # To enable/disable the asasalint builtin exclusions of function names.
    +      # See the default value of `exclude` to get the builtin exclusions.
    +      # Default: true
    +      use-builtin-exclusions: false

    asciicheck +

    Checks that all code identifiers does not have non-ASCII symbols in the name.

    Since golangci-lint v1.26.0
    +Repository

    No settings available.

    bidichk +

    Checks for dangerous unicode character sequences.

    Since golangci-lint v1.43.0
    +Repository

    linters:
    +  settings:
    +    bidichk:
    +      # The following configurations check for all mentioned invisible Unicode runes.
    +      # All runes are enabled by default.
    +      left-to-right-embedding: false
    +      right-to-left-embedding: false
    +      pop-directional-formatting: false
    +      left-to-right-override: false
    +      right-to-left-override: false
    +      left-to-right-isolate: false
    +      right-to-left-isolate: false
    +      first-strong-isolate: false
    +      pop-directional-isolate: false

    bodyclose +

    Checks whether HTTP response body is closed successfully.

    Since golangci-lint v1.18.0
    +Repository

    No settings available.

    canonicalheader +

    Canonicalheader checks whether net/http.Header uses canonical header.

    Since golangci-lint v1.58.0
    Autofix
    +Repository

    No settings available.

    containedctx +

    Containedctx is a linter that detects struct contained context.Context field.

    Since golangci-lint v1.44.0
    +Repository

    No settings available.

    contextcheck +

    Check whether the function uses a non-inherited context.

    Since golangci-lint v1.43.0
    +Repository

    No settings available.

    copyloopvar +

    A linter detects places where loop variables are copied.

    Since golangci-lint v1.57.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    copyloopvar:
    +      # Check all assigning the loop variable to another variable.
    +      # Default: false
    +      check-alias: true

    cyclop +

    Checks function and package cyclomatic complexity.

    Since golangci-lint v1.37.0
    +Repository

    linters:
    +  settings:
    +    cyclop:
    +      # The maximal code complexity to report.
    +      # Default: 10
    +      max-complexity: 10
    +      # The maximal average package complexity.
    +      # If it's higher than 0.0 (float) the check is enabled.
    +      # Default: 0.0
    +      package-average: 0.5

    decorder +

    Check declaration order and count of types, constants, variables and functions.

    Since golangci-lint v1.44.0
    +Repository

    linters:
    +  settings:
    +    decorder:
    +      # Required order of `type`, `const`, `var` and `func` declarations inside a file.
    +      # Default: types before constants before variables before functions.
    +      dec-order:
    +        - type
    +        - const
    +        - var
    +        - func
    +      # If true, underscore vars (vars with "_" as the name) will be ignored at all checks.
    +      # Default: false (underscore vars are not ignored)
    +      ignore-underscore-vars: false
    +      # If true, order of declarations is not checked at all.
    +      # Default: true (disabled)
    +      disable-dec-order-check: false
    +      # If true, `init` func can be anywhere in file (does not have to be declared before all other functions).
    +      # Default: true (disabled)
    +      disable-init-func-first-check: false
    +      # If true, multiple global `type`, `const` and `var` declarations are allowed.
    +      # Default: true (disabled)
    +      disable-dec-num-check: false
    +      # If true, type declarations will be ignored for dec num check.
    +      # Default: false (type statements are not ignored)
    +      disable-type-dec-num-check: false
    +      # If true, const declarations will be ignored for dec num check.
    +      # Default: false (const statements are not ignored)
    +      disable-const-dec-num-check: false
    +      # If true, var declarations will be ignored for dec num check.
    +      # Default: false (var statements are not ignored)
    +      disable-var-dec-num-check: false

    depguard +

    Go linter that checks if package imports are in a list of acceptable packages.

    Since golangci-lint v1.4.0
    +Repository

    linters:
    +  settings:
    +    depguard:
    +      # Rules to apply.
    +      #
    +      # Variables:
    +      # - File Variables
    +      #   Use an exclamation mark `!` to negate a variable.
    +      #   Example: `!$test` matches any file that is not a go test file.
    +      #
    +      #   `$all` - matches all go files
    +      #   `$test` - matches all go test files
    +      #
    +      # - Package Variables
    +      #
    +      #   `$gostd` - matches all of go's standard library (Pulled from `GOROOT`)
    +      #
    +      # Default (applies if no custom rules are defined): Only allow $gostd in all files.
    +      rules:
    +        # Name of a rule.
    +        main:
    +          # Defines package matching behavior. Available modes:
    +          # - `original`: allowed if it doesn't match the deny list and either matches the allow list or the allow list is empty.
    +          # - `strict`: allowed only if it matches the allow list and either doesn't match the deny list or the allow rule is more specific (longer) than the deny rule.
    +          # - `lax`: allowed if it doesn't match the deny list or the allow rule is more specific (longer) than the deny rule.
    +          # Default: "original"
    +          list-mode: lax
    +          # List of file globs that will match this list of settings to compare against.
    +          # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.
    +          # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.
    +          # The placeholder '${config-path}' is substituted with a path relative to the configuration file.
    +          # Default: $all
    +          files:
    +            - "!**/*_a _file.go"
    +          # List of allowed packages.
    +          # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).
    +          # Default: []
    +          allow:
    +            - $gostd
    +            - github.com/OpenPeeDeeP
    +          # List of packages that are not allowed.
    +          # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).
    +          # Default: []
    +          deny:
    +            - pkg: "math/rand$"
    +              desc: use math/rand/v2
    +            - pkg: "github.com/sirupsen/logrus"
    +              desc: not allowed
    +            - pkg: "github.com/pkg/errors"
    +              desc: Should be replaced by standard lib errors package

    dogsled +

    Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()).

    Since golangci-lint v1.19.0
    +Repository

    linters:
    +  settings:
    +    dogsled:
    +      # Checks assignments with too many blank identifiers.
    +      # Default: 2
    +      max-blank-identifiers: 3

    dupl +

    Detects duplicate fragments of code.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    dupl:
    +      # Tokens count to trigger issue.
    +      # Default: 150
    +      threshold: 100

    dupword +

    Checks for duplicate words in the source code.

    Since golangci-lint v1.50.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    dupword:
    +      # Keywords for detecting duplicate words.
    +      # If this list is not empty, only the words defined in this list will be detected.
    +      # Default: []
    +      keywords:
    +        - "the"
    +        - "and"
    +        - "a"
    +      # Keywords used to ignore detection.
    +      # Default: []
    +      ignore:
    +        - "0C0C"

    durationcheck +

    Check for two durations multiplied together.

    Since golangci-lint v1.37.0
    +Repository

    No settings available.

    embeddedstructfieldcheck +

    Embedded types should be at the top of the field list of a struct, and there must be an empty line separating embedded fields from regular fields.

    Since golangci-lint v2.2.0
    +Repository

    linters:
    +  settings:
    +    embeddedstructfieldcheck:
    +      # Checks that there is an empty space between the embedded fields and regular fields.
    +      # Default: true
    +      empty-line: false
    +      # Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.
    +      # Default: false
    +      forbid-mutex: true

    err113 +

    Check errors handling expressions.

    Since golangci-lint v1.26.0
    Autofix
    +Repository

    No settings available.

    errcheck +

    Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    errcheck:
    +      # Report about not checking of errors in type assertions: `a := b.(MyStruct)`.
    +      # Such cases aren't reported by default.
    +      # Default: false
    +      check-type-assertions: true
    +      # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.
    +      # Such cases aren't reported by default.
    +      # Default: false
    +      check-blank: true
    +      # To disable the errcheck built-in exclude list.
    +      # See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details.
    +      # Default: false
    +      disable-default-exclusions: true
    +      # List of functions to exclude from checking, where each entry is a single function to exclude.
    +      # See https://github.com/kisielk/errcheck#excluding-functions for details.
    +      exclude-functions:
    +        - io/ioutil.ReadFile
    +        - io.Copy(*bytes.Buffer)
    +        - io.Copy(os.Stdout)
    +      # Display function signature instead of selector.
    +      # Default: false
    +      verbose: true

    errchkjson +

    Checks types passed to the json encoding functions. Reports unsupported types and reports occurrences where the check for the returned error can be omitted.

    Since golangci-lint v1.44.0
    +Repository

    linters:
    +  settings:
    +    errchkjson:
    +      # With check-error-free-encoding set to true, errchkjson does warn about errors
    +      # from json encoding functions that are safe to be ignored,
    +      # because they are not possible to happen.
    +      #
    +      # if check-error-free-encoding is set to true and errcheck linter is enabled,
    +      # it is recommended to add the following exceptions to prevent from false positives:
    +      #
    +      #     linters:
    +      #       settings:
    +      #         errcheck:
    +      #           exclude-functions:
    +      #             - encoding/json.Marshal
    +      #             - encoding/json.MarshalIndent
    +      #
    +      # Default: false
    +      check-error-free-encoding: true
    +      # Issue on struct encoding that doesn't have exported fields.
    +      # Default: false
    +      report-no-exported: false

    errname +

    Checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error.

    Since golangci-lint v1.42.0
    +Repository

    No settings available.

    errorlint +

    Find code that can cause problems with the error wrapping scheme introduced in Go 1.13.

    Since golangci-lint v1.32.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    errorlint:
    +      # Check whether fmt.Errorf uses the %w verb for formatting errors.
    +      # See the https://github.com/polyfloyd/go-errorlint for caveats.
    +      # Default: true
    +      errorf: false
    +      # Permit more than 1 %w verb, valid per Go 1.20 (requires `errorf: true`).
    +      # Default: true
    +      errorf-multi: false
    +      # Check for plain type assertions and type switches.
    +      # Default: true
    +      asserts: false
    +      # Check for plain error comparisons.
    +      # Default: true
    +      comparison: false
    +      # Allowed errors.
    +      # Default: []
    +      allowed-errors:
    +        - err: "io.EOF"
    +          fun: "example.com/pkg.Read"
    +      # Allowed error "wildcards".
    +      # Default: []
    +      allowed-errors-wildcard:
    +        - err: "example.com/pkg.ErrMagic"
    +          fun: "example.com/pkg.Magic"

    exhaustive +

    Check exhaustiveness of enum switch statements.

    Since golangci-lint v1.28.0
    +Repository

    linters:
    +  settings:
    +    exhaustive:
    +      # Program elements to check for exhaustiveness.
    +      # Default: [ switch ]
    +      check:
    +        - switch
    +        - map
    +      # Presence of "default" case in switch statements satisfies exhaustiveness,
    +      # even if all enum members are not listed.
    +      # Default: false
    +      default-signifies-exhaustive: true
    +      # Enum members matching the supplied regex do not have to be listed in
    +      # switch statements to satisfy exhaustiveness.
    +      # Default: ""
    +      ignore-enum-members: "Example.+"
    +      # Enum types matching the supplied regex do not have to be listed in
    +      # switch statements to satisfy exhaustiveness.
    +      # Default: ""
    +      ignore-enum-types: "Example.+"
    +      # Consider enums only in package scopes, not in inner scopes.
    +      # Default: false
    +      package-scope-only: true
    +      # Only run exhaustive check on switches with "//exhaustive:enforce" comment.
    +      # Default: false
    +      explicit-exhaustive-switch: true
    +      # Only run exhaustive check on map literals with "//exhaustive:enforce" comment.
    +      # Default: false
    +      explicit-exhaustive-map: true
    +      # Switch statement requires default case even if exhaustive.
    +      # Default: false
    +      default-case-required: true

    exhaustruct +

    Checks if all structure fields are initialized.

    Since golangci-lint v1.46.0
    +Repository

    linters:
    +  settings:
    +    exhaustruct:
    +      # List of regular expressions to match type names that should be processed.
    +      # Anonymous structs can be matched by '<anonymous>' alias.
    +      #
    +      # Each regular expression must match the full type name, including package path.
    +      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,
    +      # but not `http\.Cookie`.
    +      # Default: []
    +      include:
    +        - '.+\.Test'
    +        - 'example\.com/package\.ExampleStruct[\d]{1,2}'
    +      # List of regular expressions to match type names that should be excluded from processing.
    +      # Anonymous structs can be matched by '<anonymous>' alias.
    +      # Has precedence over `include`.
    +      # Each regular expression must match the full type name, including package path.
    +      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,
    +      # but not `http\.Cookie`.
    +      # Default: []
    +      exclude:
    +        - '.+/cobra\.Command$'
    +      # Allows empty structures, effectively excluding them from the check.
    +      # Default: false
    +      allow-empty: true
    +      # List of regular expressions to match type names that should be allowed to be empty.
    +      # Anonymous structs can be matched by '<anonymous>' alias.
    +      # Each regular expression must match the full type name, including package path.
    +      # For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,
    +      # but not `http\.Cookie`.
    +      # Default: []
    +      allow-empty-rx:
    +        - '.*/http\.Cookie'
    +      # Allows empty structures in return statements.
    +      # Default: false
    +      allow-empty-returns: true
    +      # Allows empty structures in variable declarations.
    +      # Default: false
    +      allow-empty-declarations: true

    exptostd +

    Detects functions from golang.org/x/exp/ that can be replaced by std functions.

    Since golangci-lint v1.63.0
    Autofix
    +Repository

    No settings available.

    fatcontext +

    Detects nested contexts in loops and function literals.

    Since golangci-lint v1.58.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    fatcontext:
    +      # Check for potential fat contexts in struct pointers.
    +      # May generate false positives.
    +      # Default: false
    +      check-struct-pointers: true

    forbidigo +

    Forbids identifiers.

    Since golangci-lint v1.34.0
    +Repository

    linters:
    +  settings:
    +    forbidigo:
    +      # Forbid the following identifiers (list of regexp).
    +      # Default: ["^(fmt\\.Print(|f|ln)|print|println)$"]
    +      forbid:
    +        # Built-in bootstrapping functions.
    +        - pattern: ^print(ln)?$
    +        # Optional message that gets included in error reports.
    +        - pattern: ^fmt\.Print.*$
    +          msg: Do not commit print statements.
    +        # Alternatively, put messages at the end of the regex, surrounded by `(# )?`.
    +        # Escape any special characters. Those messages get included in error reports.
    +        - pattern: 'fmt\.Print.*(# Do not commit print statements\.)?'
    +        # Forbid spew Dump, whether it is called as function or method.
    +        # Depends on analyze-types below.
    +        - pattern: ^spew\.(ConfigState\.)?Dump$
    +        # The package name might be ambiguous.
    +        # The full import path can be used as additional criteria.
    +        # Depends on analyze-types below.
    +        - pattern: ^v1.Dump$
    +          pkg: ^example.com/pkg/api/v1$
    +      # Exclude godoc examples from forbidigo checks.
    +      # Default: true
    +      exclude-godoc-examples: false
    +      # Instead of matching the literal source code,
    +      # use type information to replace expressions with strings that contain the package name
    +      # and (for methods and fields) the type name.
    +      # This makes it possible to handle import renaming and forbid struct fields and methods.
    +      # Default: false
    +      analyze-types: true

    forcetypeassert +

    Find forced type assertions.

    Since golangci-lint v1.38.0
    +Repository

    No settings available.

    funcorder +

    Checks the order of functions, methods, and constructors.

    Since golangci-lint v2.1.0
    +Repository

    linters:
    +  settings:
    +    funcorder:
    +      # Checks that constructors are placed after the structure declaration.
    +      # Default: true
    +      constructor: false
    +      # Checks if the exported methods of a structure are placed before the non-exported ones.
    +      # Default: true
    +      struct-method: false
    +      # Checks if the constructors and/or structure methods are sorted alphabetically.
    +      # Default: false
    +      alphabetical: true

    funlen +

    Checks for long functions.

    Since golangci-lint v1.18.0
    +Repository

    linters:
    +  settings:
    +    funlen:
    +      # Checks the number of lines in a function.
    +      # If lower than 0, disable the check.
    +      # Default: 60
    +      lines: -1
    +      # Checks the number of statements in a function.
    +      # If lower than 0, disable the check.
    +      # Default: 40
    +      statements: -1
    +      # Ignore comments when counting lines.
    +      # Default: true
    +      ignore-comments: false

    ginkgolinter +

    Enforces standards of using ginkgo and gomega.

    Since golangci-lint v1.51.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    ginkgolinter:
    +      # Suppress the wrong length assertion warning.
    +      # Default: false
    +      suppress-len-assertion: true
    +      # Suppress the wrong nil assertion warning.
    +      # Default: false
    +      suppress-nil-assertion: true
    +      # Suppress the wrong error assertion warning.
    +      # Default: false
    +      suppress-err-assertion: true
    +      # Suppress the wrong comparison assertion warning.
    +      # Default: false
    +      suppress-compare-assertion: true
    +      # Suppress the function all in async assertion warning.
    +      # Default: false
    +      suppress-async-assertion: true
    +      # Suppress warning for comparing values from different types, like `int32` and `uint32`.
    +      # Default: false
    +      suppress-type-compare-assertion: true
    +      # Trigger warning for ginkgo focus containers like `FDescribe`, `FContext`, `FWhen` or `FIt`.
    +      # Default: false
    +      forbid-focus-container: true
    +      # Don't trigger warnings for HaveLen(0)
    +      # Default: false
    +      allow-havelen-zero: true
    +      # Force using `Expect` with `To`, `ToNot` or `NotTo`.
    +      # Reject using `Expect` with `Should` or `ShouldNot`.
    +      # Default: false
    +      force-expect-to: true
    +      # Best effort validation of async intervals (timeout and polling).
    +      # Ignored the `suppress-async-assertion` is true.
    +      # Default: false
    +      validate-async-intervals: true
    +      # Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.
    +      # Default: false
    +      forbid-spec-pollution: true
    +      # Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.
    +      # Default: false
    +      force-succeed: true
    +      # Force adding assertion descriptions to gomega matchers.
    +      # Default: false
    +      force-assertion-description: true
    +      # Force using `ToNot`, `ShouldNot` instead of `To(Not())`.
    +      # Default: false
    +      force-tonot: true

    gocheckcompilerdirectives +

    Checks that go compiler directive comments (//go:) are valid.

    Since golangci-lint v1.51.0
    +Repository

    No settings available.

    gochecknoglobals +

    Check that no global variables exist.

    Since golangci-lint v1.12.0
    +Repository

    No settings available.

    gochecknoinits +

    Checks that no init functions are present in Go code.

    Since golangci-lint v1.12.0

    No settings available.

    gochecksumtype +

    Run exhaustiveness checks on Go "sum types".

    Since golangci-lint v1.55.0
    +Repository

    linters:
    +  settings:
    +    gochecksumtype:
    +      # Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.
    +      # Default: true
    +      default-signifies-exhaustive: false
    +      # Include shared interfaces in the exhaustiveness check.
    +      # Default: false
    +      include-shared-interfaces: true

    gocognit +

    Computes and checks the cognitive complexity of functions.

    Since golangci-lint v1.20.0
    +Repository

    linters:
    +  settings:
    +    gocognit:
    +      # Minimal code complexity to report.
    +      # Default: 30 (but we recommend 10-20)
    +      min-complexity: 10

    goconst +

    Finds repeated strings that could be replaced by a constant.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    goconst:
    +      # Minimal length of string constant.
    +      # Default: 3
    +      min-len: 2
    +      # Minimum occurrences of constant string count to trigger issue.
    +      # Default: 3
    +      min-occurrences: 2
    +      # Look for existing constants matching the values.
    +      # Default: true
    +      match-constant: false
    +      # Search also for duplicated numbers.
    +      # Default: false
    +      numbers: true
    +      # Minimum value, only works with `goconst.numbers`.
    +      # Default: 3
    +      min: 2
    +      # Maximum value, only works with `goconst.numbers`.
    +      # Default: 3
    +      max: 2
    +      # Ignore when constant is not used as function argument.
    +      # Default: true
    +      ignore-calls: false
    +      # Exclude strings matching the given regular expression.
    +      # Default: ""
    +      ignore-string-values:
    +        - 'foo.+'
    +      # Detects constants with identical values.
    +      # Default: false
    +      find-duplicates: true
    +      # Evaluates of constant expressions like Prefix + "suffix".
    +      # Default: false
    +      eval-const-expressions: true

    gocritic +

    Provides diagnostics that check for bugs, performance and style issues. +Extensible without recompilation through dynamic rules. +Dynamic rules are written declaratively with AST patterns, filters, report message and optional suggestion.

    Since golangci-lint v1.12.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    gocritic:
    +      # Disable all checks.
    +      # Default: false
    +      disable-all: true
    +      # Which checks should be enabled in addition to default checks; can't be combined with 'disabled-checks'.
    +      # By default, list of stable checks is used (https://go-critic.com/overview#checks-overview):
    +      #   appendAssign, argOrder, assignOp, badCall, badCond, captLocal, caseOrder, codegenComment, commentFormatting,
    +      #   defaultCaseOrder, deprecatedComment, dupArg, dupBranchBody, dupCase, dupSubExpr, elseif, exitAfterDefer,
    +      #   flagDeref, flagName, ifElseChain, mapKey, newDeref, offBy1, regexpMust, singleCaseSwitch, sloppyLen,
    +      #   sloppyTypeAssert, switchTrue, typeSwitchVar, underef, unlambda, unslice, valSwap, wrapperFunc
    +      # To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`.
    +      enabled-checks:
    +        # Detects suspicious append result assignments.
    +        # https://go-critic.com/overview.html#appendassign
    +        - appendAssign
    +        # Detects `append` chains to the same slice that can be done in a single `append` call.
    +        # https://go-critic.com/overview.html#appendcombine
    +        - appendCombine
    +        # Detects suspicious arguments order.
    +        # https://go-critic.com/overview.html#argorder
    +        - argOrder
    +        # Detects assignments that can be simplified by using assignment operators.
    +        # https://go-critic.com/overview.html#assignop
    +        - assignOp
    +        # Detects suspicious function calls.
    +        # https://go-critic.com/overview.html#badcall
    +        - badCall
    +        # Detects suspicious condition expressions.
    +        # https://go-critic.com/overview.html#badcond
    +        - badCond
    +        # Detects suspicious mutex lock/unlock operations.
    +        # https://go-critic.com/overview.html#badlock
    +        - badLock
    +        # Detects suspicious regexp patterns.
    +        # https://go-critic.com/overview.html#badregexp
    +        - badRegexp
    +        # Detects bad usage of sort package.
    +        # https://go-critic.com/overview.html#badsorting
    +        - badSorting
    +        # Detects bad usage of sync.OnceFunc.
    +        # https://go-critic.com/overview.html#badsynconcefunc
    +        - badSyncOnceFunc
    +        # Detects bool expressions that can be simplified.
    +        # https://go-critic.com/overview.html#boolexprsimplify
    +        - boolExprSimplify
    +        # Detects when predeclared identifiers are shadowed in assignments.
    +        # https://go-critic.com/overview.html#builtinshadow
    +        - builtinShadow
    +        # Detects top-level declarations that shadow the predeclared identifiers.
    +        # https://go-critic.com/overview.html#builtinshadowdecl
    +        - builtinShadowDecl
    +        # Detects capitalized names for local variables.
    +        # https://go-critic.com/overview.html#captlocal
    +        - captLocal
    +        # Detects erroneous case order inside switch statements.
    +        # https://go-critic.com/overview.html#caseorder
    +        - caseOrder
    +        # Detects malformed 'code generated' file comments.
    +        # https://go-critic.com/overview.html#codegencomment
    +        - codegenComment
    +        # Detects comments with non-idiomatic formatting.
    +        # https://go-critic.com/overview.html#commentformatting
    +        - commentFormatting
    +        # Detects commented-out code inside function bodies.
    +        # https://go-critic.com/overview.html#commentedoutcode
    +        - commentedOutCode
    +        # Detects commented-out imports.
    +        # https://go-critic.com/overview.html#commentedoutimport
    +        - commentedOutImport
    +        # Detects when default case in switch isn't on 1st or last position.
    +        # https://go-critic.com/overview.html#defaultcaseorder
    +        - defaultCaseOrder
    +        # Detects loops inside functions that use defer.
    +        # https://go-critic.com/overview.html#deferinloop
    +        - deferInLoop
    +        # Detects deferred function literals that can be simplified.
    +        # https://go-critic.com/overview.html#deferunlambda
    +        - deferUnlambda
    +        # Detects malformed 'deprecated' doc-comments.
    +        # https://go-critic.com/overview.html#deprecatedcomment
    +        - deprecatedComment
    +        # Detects comments that silence go lint complaints about doc-comment.
    +        # https://go-critic.com/overview.html#docstub
    +        - docStub
    +        # Detects suspicious duplicated arguments.
    +        # https://go-critic.com/overview.html#duparg
    +        - dupArg
    +        # Detects duplicated branch bodies inside conditional statements.
    +        # https://go-critic.com/overview.html#dupbranchbody
    +        - dupBranchBody
    +        # Detects duplicated case clauses inside switch or select statements.
    +        # https://go-critic.com/overview.html#dupcase
    +        - dupCase
    +        # Detects multiple imports of the same package under different aliases.
    +        # https://go-critic.com/overview.html#dupimport
    +        - dupImport
    +        # Detects suspicious duplicated sub-expressions.
    +        # https://go-critic.com/overview.html#dupsubexpr
    +        - dupSubExpr
    +        # Detects suspicious formatting strings usage.
    +        # https://go-critic.com/overview.html#dynamicfmtstring
    +        - dynamicFmtString
    +        # Detects else with nested if statement that can be replaced with else-if.
    +        # https://go-critic.com/overview.html#elseif
    +        - elseif
    +        # Detects suspicious empty declarations blocks.
    +        # https://go-critic.com/overview.html#emptydecl
    +        - emptyDecl
    +        # Detects fallthrough that can be avoided by using multi case values.
    +        # https://go-critic.com/overview.html#emptyfallthrough
    +        - emptyFallthrough
    +        # Detects empty string checks that can be written more idiomatically.
    +        # https://go-critic.com/overview.html#emptystringtest
    +        - emptyStringTest
    +        # Detects unoptimal strings/bytes case-insensitive comparison.
    +        # https://go-critic.com/overview.html#equalfold
    +        - equalFold
    +        # Detects unwanted dependencies on the evaluation order.
    +        # https://go-critic.com/overview.html#evalorder
    +        - evalOrder
    +        # Detects calls to exit/fatal inside functions that use defer.
    +        # https://go-critic.com/overview.html#exitafterdefer
    +        - exitAfterDefer
    +        # Detects exposed methods from sync.Mutex and sync.RWMutex.
    +        # https://go-critic.com/overview.html#exposedsyncmutex
    +        - exposedSyncMutex
    +        # Detects suspicious reassignment of error from another package.
    +        # https://go-critic.com/overview.html#externalerrorreassign
    +        - externalErrorReassign
    +        # Detects problems in filepath.Join() function calls.
    +        # https://go-critic.com/overview.html#filepathjoin
    +        - filepathJoin
    +        # Detects immediate dereferencing of `flag` package pointers.
    +        # https://go-critic.com/overview.html#flagderef
    +        - flagDeref
    +        # Detects suspicious flag names.
    +        # https://go-critic.com/overview.html#flagname
    +        - flagName
    +        # Detects hex literals that have mixed case letter digits.
    +        # https://go-critic.com/overview.html#hexliteral
    +        - hexLiteral
    +        # Detects nil usages in http.NewRequest calls, suggesting http.NoBody as an alternative.
    +        # https://go-critic.com/overview.html#httpnobody
    +        - httpNoBody
    +        # Detects params that incur excessive amount of copying.
    +        # https://go-critic.com/overview.html#hugeparam
    +        - hugeParam
    +        # Detects repeated if-else statements and suggests to replace them with switch statement.
    +        # https://go-critic.com/overview.html#ifelsechain
    +        - ifElseChain
    +        # Detects when imported package names shadowed in the assignments.
    +        # https://go-critic.com/overview.html#importshadow
    +        - importShadow
    +        # Detects strings.Index calls that may cause unwanted allocs.
    +        # https://go-critic.com/overview.html#indexalloc
    +        - indexAlloc
    +        # Detects non-assignment statements inside if/switch init clause.
    +        # https://go-critic.com/overview.html#initclause
    +        - initClause
    +        # Detects suspicious map literal keys.
    +        # https://go-critic.com/overview.html#mapkey
    +        - mapKey
    +        # Detects method expression call that can be replaced with a method call.
    +        # https://go-critic.com/overview.html#methodexprcall
    +        - methodExprCall
    +        # Finds where nesting level could be reduced.
    +        # https://go-critic.com/overview.html#nestingreduce
    +        - nestingReduce
    +        # Detects immediate dereferencing of `new` expressions.
    +        # https://go-critic.com/overview.html#newderef
    +        - newDeref
    +        # Detects return statements those results evaluate to nil.
    +        # https://go-critic.com/overview.html#nilvalreturn
    +        - nilValReturn
    +        # Detects old-style octal literals.
    +        # https://go-critic.com/overview.html#octalliteral
    +        - octalLiteral
    +        # Detects various off-by-one kind of errors.
    +        # https://go-critic.com/overview.html#offby1
    +        - offBy1
    +        # Detects if function parameters could be combined by type and suggest the way to do it.
    +        # https://go-critic.com/overview.html#paramtypecombine
    +        - paramTypeCombine
    +        # Detects expressions like []rune(s)[0] that may cause unwanted rune slice allocation.
    +        # https://go-critic.com/overview.html#preferdecoderune
    +        - preferDecodeRune
    +        # Detects concatenation with os.PathSeparator which can be replaced with filepath.Join.
    +        # https://go-critic.com/overview.html#preferfilepathjoin
    +        - preferFilepathJoin
    +        # Detects fmt.Sprint(f/ln) calls which can be replaced with fmt.Fprint(f/ln).
    +        # https://go-critic.com/overview.html#preferfprint
    +        - preferFprint
    +        # Detects w.Write or io.WriteString calls which can be replaced with w.WriteString.
    +        # https://go-critic.com/overview.html#preferstringwriter
    +        - preferStringWriter
    +        # Detects WriteRune calls with rune literal argument that is single byte and reports to use WriteByte instead.
    +        # https://go-critic.com/overview.html#preferwritebyte
    +        - preferWriteByte
    +        # Detects input and output parameters that have a type of pointer to referential type.
    +        # https://go-critic.com/overview.html#ptrtorefparam
    +        - ptrToRefParam
    +        # Detects append all its data while range it.
    +        # https://go-critic.com/overview.html#rangeappendall
    +        - rangeAppendAll
    +        # Detects expensive copies of `for` loop range expressions.
    +        # https://go-critic.com/overview.html#rangeexprcopy
    +        - rangeExprCopy
    +        # Detects loops that copy big objects during each iteration.
    +        # https://go-critic.com/overview.html#rangevalcopy
    +        - rangeValCopy
    +        # Detects redundant fmt.Sprint calls.
    +        # https://go-critic.com/overview.html#redundantsprint
    +        - redundantSprint
    +        # Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`.
    +        # https://go-critic.com/overview.html#regexpmust
    +        - regexpMust
    +        # Detects suspicious regexp patterns.
    +        # https://go-critic.com/overview.html#regexppattern
    +        - regexpPattern
    +        # Detects regexp patterns that can be simplified.
    +        # https://go-critic.com/overview.html#regexpsimplify
    +        - regexpSimplify
    +        # Detects suspicious http.Error call without following return.
    +        # https://go-critic.com/overview.html#returnafterhttperror
    +        - returnAfterHttpError
    +        # Runs user-defined rules using ruleguard linter.
    +        # https://go-critic.com/overview.html#ruleguard
    +        - ruleguard
    +        # Detects switch statements that could be better written as if statement.
    +        # https://go-critic.com/overview.html#singlecaseswitch
    +        - singleCaseSwitch
    +        # Detects slice clear loops, suggests an idiom that is recognized by the Go compiler.
    +        # https://go-critic.com/overview.html#sliceclear
    +        - sliceClear
    +        # Detects usage of `len` when result is obvious or doesn't make sense.
    +        # https://go-critic.com/overview.html#sloppylen
    +        - sloppyLen
    +        # Detects suspicious/confusing re-assignments.
    +        # https://go-critic.com/overview.html#sloppyreassign
    +        - sloppyReassign
    +        # Detects redundant type assertions.
    +        # https://go-critic.com/overview.html#sloppytypeassert
    +        - sloppyTypeAssert
    +        # Detects suspicious sort.Slice calls.
    +        # https://go-critic.com/overview.html#sortslice
    +        - sortSlice
    +        # Detects "%s" formatting directives that can be replaced with %q.
    +        # https://go-critic.com/overview.html#sprintfquotedstring
    +        - sprintfQuotedString
    +        # Detects issue in Query() and Exec() calls.
    +        # https://go-critic.com/overview.html#sqlquery
    +        - sqlQuery
    +        # Detects string concat operations that can be simplified.
    +        # https://go-critic.com/overview.html#stringconcatsimplify
    +        - stringConcatSimplify
    +        # Detects redundant conversions between string and []byte.
    +        # https://go-critic.com/overview.html#stringxbytes
    +        - stringXbytes
    +        # Detects strings.Compare usage.
    +        # https://go-critic.com/overview.html#stringscompare
    +        - stringsCompare
    +        # Detects switch-over-bool statements that use explicit `true` tag value.
    +        # https://go-critic.com/overview.html#switchtrue
    +        - switchTrue
    +        # Detects sync.Map load+delete operations that can be replaced with LoadAndDelete.
    +        # https://go-critic.com/overview.html#syncmaploadanddelete
    +        - syncMapLoadAndDelete
    +        # Detects manual conversion to milli- or microseconds.
    +        # https://go-critic.com/overview.html#timeexprsimplify
    +        - timeExprSimplify
    +        # Detects TODO comments without detail/assignee.
    +        # https://go-critic.com/overview.html#todocommentwithoutdetail
    +        - todoCommentWithoutDetail
    +        # Detects function with too many results.
    +        # https://go-critic.com/overview.html#toomanyresultschecker
    +        - tooManyResultsChecker
    +        # Detects potential truncation issues when comparing ints of different sizes.
    +        # https://go-critic.com/overview.html#truncatecmp
    +        - truncateCmp
    +        # Detects repeated type assertions and suggests to replace them with type switch statement.
    +        # https://go-critic.com/overview.html#typeassertchain
    +        - typeAssertChain
    +        # Detects method declarations preceding the type definition itself.
    +        # https://go-critic.com/overview.html#typedeffirst
    +        - typeDefFirst
    +        # Detects type switches that can benefit from type guard clause with variable.
    +        # https://go-critic.com/overview.html#typeswitchvar
    +        - typeSwitchVar
    +        # Detects unneeded parenthesis inside type expressions and suggests to remove them.
    +        # https://go-critic.com/overview.html#typeunparen
    +        - typeUnparen
    +        # Detects unchecked errors in if statements.
    +        # https://go-critic.com/overview.html#uncheckedinlineerr
    +        - uncheckedInlineErr
    +        # Detects dereference expressions that can be omitted.
    +        # https://go-critic.com/overview.html#underef
    +        - underef
    +        # Detects redundant statement labels.
    +        # https://go-critic.com/overview.html#unlabelstmt
    +        - unlabelStmt
    +        # Detects function literals that can be simplified.
    +        # https://go-critic.com/overview.html#unlambda
    +        - unlambda
    +        # Detects unnamed results that may benefit from names.
    +        # https://go-critic.com/overview.html#unnamedresult
    +        - unnamedResult
    +        # Detects unnecessary braced statement blocks.
    +        # https://go-critic.com/overview.html#unnecessaryblock
    +        - unnecessaryBlock
    +        # Detects redundantly deferred calls.
    +        # https://go-critic.com/overview.html#unnecessarydefer
    +        - unnecessaryDefer
    +        # Detects slice expressions that can be simplified to sliced expression itself.
    +        # https://go-critic.com/overview.html#unslice
    +        - unslice
    +        # Detects value swapping code that are not using parallel assignment.
    +        # https://go-critic.com/overview.html#valswap
    +        - valSwap
    +        # Detects conditions that are unsafe due to not being exhaustive.
    +        # https://go-critic.com/overview.html#weakcond
    +        - weakCond
    +        # Ensures that `//nolint` comments include an explanation.
    +        # https://go-critic.com/overview.html#whynolint
    +        - whyNoLint
    +        # Detects function calls that can be replaced with convenience wrappers.
    +        # https://go-critic.com/overview.html#wrapperfunc
    +        - wrapperFunc
    +        # Detects Yoda style expressions and suggests to replace them.
    +        # https://go-critic.com/overview.html#yodastyleexpr
    +        - yodaStyleExpr
    +      # Enable all checks.
    +      # Default: false
    +      enable-all: true
    +      # Which checks should be disabled; can't be combined with 'enabled-checks'.
    +      # Default: []
    +      disabled-checks:
    +        - appendAssign
    +        - appendCombine
    +        - argOrder
    +        - assignOp
    +        - badCall
    +        - badCond
    +        - badLock
    +        - badRegexp
    +        - badSorting
    +        - badSyncOnceFunc
    +        - boolExprSimplify
    +        - builtinShadow
    +        - builtinShadowDecl
    +        - captLocal
    +        - caseOrder
    +        - codegenComment
    +        - commentFormatting
    +        - commentedOutCode
    +        - commentedOutImport
    +        - defaultCaseOrder
    +        - deferInLoop
    +        - deferUnlambda
    +        - deprecatedComment
    +        - docStub
    +        - dupArg
    +        - dupBranchBody
    +        - dupCase
    +        - dupImport
    +        - dupSubExpr
    +        - dynamicFmtString
    +        - elseif
    +        - emptyDecl
    +        - emptyFallthrough
    +        - emptyStringTest
    +        - equalFold
    +        - evalOrder
    +        - exitAfterDefer
    +        - exposedSyncMutex
    +        - externalErrorReassign
    +        - filepathJoin
    +        - flagDeref
    +        - flagName
    +        - hexLiteral
    +        - httpNoBody
    +        - hugeParam
    +        - ifElseChain
    +        - importShadow
    +        - indexAlloc
    +        - initClause
    +        - mapKey
    +        - methodExprCall
    +        - nestingReduce
    +        - newDeref
    +        - nilValReturn
    +        - octalLiteral
    +        - offBy1
    +        - paramTypeCombine
    +        - preferDecodeRune
    +        - preferFilepathJoin
    +        - preferFprint
    +        - preferStringWriter
    +        - preferWriteByte
    +        - ptrToRefParam
    +        - rangeAppendAll
    +        - rangeExprCopy
    +        - rangeValCopy
    +        - redundantSprint
    +        - regexpMust
    +        - regexpPattern
    +        - regexpSimplify
    +        - returnAfterHttpError
    +        - ruleguard
    +        - singleCaseSwitch
    +        - sliceClear
    +        - sloppyLen
    +        - sloppyReassign
    +        - sloppyTypeAssert
    +        - sortSlice
    +        - sprintfQuotedString
    +        - sqlQuery
    +        - stringConcatSimplify
    +        - stringXbytes
    +        - stringsCompare
    +        - switchTrue
    +        - syncMapLoadAndDelete
    +        - timeExprSimplify
    +        - todoCommentWithoutDetail
    +        - tooManyResultsChecker
    +        - truncateCmp
    +        - typeAssertChain
    +        - typeDefFirst
    +        - typeSwitchVar
    +        - typeUnparen
    +        - uncheckedInlineErr
    +        - underef
    +        - unlabelStmt
    +        - unlambda
    +        - unnamedResult
    +        - unnecessaryBlock
    +        - unnecessaryDefer
    +        - unslice
    +        - valSwap
    +        - weakCond
    +        - whyNoLint
    +        - wrapperFunc
    +        - yodaStyleExpr
    +      # Enable multiple checks by tags in addition to default checks.
    +      # Run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic` to see all tags and checks.
    +      # See https://github.com/go-critic/go-critic#usage -> section "Tags".
    +      # Default: []
    +      enabled-tags:
    +        - diagnostic
    +        - style
    +        - performance
    +        - experimental
    +        - opinionated
    +      disabled-tags:
    +        - diagnostic
    +        - style
    +        - performance
    +        - experimental
    +        - opinionated
    +      # Settings passed to gocritic.
    +      # The settings key is the name of a supported gocritic checker.
    +      # The list of supported checkers can be found at https://go-critic.com/overview.
    +      settings:
    +        # Must be valid enabled check name.
    +        captLocal:
    +          # Whether to restrict checker to params only.
    +          # Default: true
    +          paramsOnly: false
    +        commentedOutCode:
    +          # Min length of the comment that triggers a warning.
    +          # Default: 15
    +          minLength: 50
    +        elseif:
    +          # Whether to skip balanced if-else pairs.
    +          # Default: true
    +          skipBalanced: false
    +        hugeParam:
    +          # Size in bytes that makes the warning trigger.
    +          # Default: 80
    +          sizeThreshold: 70
    +        ifElseChain:
    +          # Min number of if-else blocks that makes the warning trigger.
    +          # Default: 2
    +          minThreshold: 4
    +        nestingReduce:
    +          # Min number of statements inside a branch to trigger a warning.
    +          # Default: 5
    +          bodyWidth: 4
    +        rangeExprCopy:
    +          # Size in bytes that makes the warning trigger.
    +          # Default: 512
    +          sizeThreshold: 516
    +          # Whether to check test functions
    +          # Default: true
    +          skipTestFuncs: false
    +        rangeValCopy:
    +          # Size in bytes that makes the warning trigger.
    +          # Default: 128
    +          sizeThreshold: 32
    +          # Whether to check test functions.
    +          # Default: true
    +          skipTestFuncs: false
    +        ruleguard:
    +          # Enable debug to identify which 'Where' condition was rejected.
    +          # The value of the parameter is the name of a function in a ruleguard file.
    +          #
    +          # When a rule is evaluated:
    +          # If:
    +          #   The Match() clause is accepted; and
    +          #   One of the conditions in the Where() clause is rejected,
    +          # Then:
    +          #   ruleguard prints the specific Where() condition that was rejected.
    +          #
    +          # The option is passed to the ruleguard 'debug-group' argument.
    +          # Default: ""
    +          debug: 'emptyDecl'
    +          # Determines the behavior when an error occurs while parsing ruleguard files.
    +          # If flag is not set, log error and skip rule files that contain an error.
    +          # If flag is set, the value must be a comma-separated list of error conditions.
    +          # - 'all':    fail on all errors.
    +          # - 'import': ruleguard rule imports a package that cannot be found.
    +          # - 'dsl':    gorule file does not comply with the ruleguard DSL.
    +          # Default: ""
    +          failOn: dsl,import
    +          # Comma-separated list of file paths containing ruleguard rules.
    +          # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.
    +          # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.
    +          # The placeholder '${config-path}' is substituted with a path relative to the configuration file.
    +          # Glob patterns such as 'rules-*.go' may be specified.
    +          # Default: ""
    +          rules: '${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go'
    +          # Comma-separated list of enabled groups or skip empty to enable everything.
    +          # Tags can be defined with # character prefix.
    +          # Default: "<all>"
    +          enable: "myGroupName,#myTagName"
    +          # Comma-separated list of disabled groups or skip empty to enable everything.
    +          # Tags can be defined with # character prefix.
    +          # Default: ""
    +          disable: "myGroupName,#myTagName"
    +        tooManyResultsChecker:
    +          # Maximum number of results.
    +          # Default: 5
    +          maxResults: 10
    +        truncateCmp:
    +          # Whether to skip int/uint/uintptr types.
    +          # Default: true
    +          skipArchDependent: false
    +        underef:
    +          # Whether to skip (*x).method() calls where x is a pointer receiver.
    +          # Default: true
    +          skipRecvDeref: false
    +        unnamedResult:
    +          # Whether to check exported functions.
    +          # Default: false
    +          checkExported: true

    gocyclo +

    Computes and checks the cyclomatic complexity of functions.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    gocyclo:
    +      # Minimal code complexity to report.
    +      # Default: 30 (but we recommend 10-20)
    +      min-complexity: 10

    godoclint +

    Checks Golang's documentation practice (godoc).

    Since golangci-lint v2.5.0
    New
    +Repository

    linters:
    +  settings:
    +    godoclint:
    +      # Default set of rules to enable.
    +      # Possible values are: `basic`, `all` or `none`.
    +      # Default: `basic` (enables `pkg-doc`, `single-pkg-doc`, `start-with-name`, and `deprecated`)
    +      default: all
    +      # List of rules to enable in addition to the default set.
    +      # Default: empty
    +      enable:
    +        # Check proper package-level godoc, if any.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#pkg-doc
    +        - pkg-doc
    +        # Assert at most one godoc per package.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#single-pkg-doc
    +        - single-pkg-doc
    +        # Require all packages to have a godoc.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-pkg-doc
    +        - require-pkg-doc
    +        # Assert symbol godocs start with the symbol name.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#start-with-name
    +        - start-with-name
    +        # Require godoc for all public symbols.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-doc
    +        - require-doc
    +        # Assert correct formatting of deprecation notes.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#deprecated
    +        - deprecated
    +        # Assert maximum line length for godocs.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#max-len
    +        - max-len
    +        # Assert no unused link in godocs.
    +        # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#no-unused-link
    +        - no-unused-link
    +      # List of rules to disable.
    +      # Default: empty
    +      disable:
    +        - pkg-doc
    +        - single-pkg-doc
    +        - require-pkg-doc
    +        - start-with-name
    +        - require-doc
    +        - deprecated
    +        - max-len
    +        - no-unused-link
    +      # A map for fine-tuning individual rules.
    +      # All subkeys are optional.
    +      options:
    +        max-len:
    +          # Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.
    +          # Default: 77
    +          length: 127
    +        require-doc:
    +          # Ignore exported (public) symbols when applying the `require-doc` rule.
    +          # Default: false
    +          ignore-exported: true
    +          # Ignore unexported (private) symbols when applying the `require-doc` rule.
    +          # Default: true
    +          ignore-unexported: false
    +        start-with-name:
    +          # Include unexported symbols when applying the `start-with-name` rule.
    +          # Default: false
    +          include-unexported: true

    godot +

    Check if comments end in a period.

    Since golangci-lint v1.25.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    godot:
    +      # Comments to be checked: `declarations`, `toplevel`, `noinline` or `all`.
    +      # Default: declarations
    +      scope: toplevel
    +      # List of regexps for excluding particular comment lines from check.
    +      # Default: []
    +      exclude:
    +        # Exclude todo and fixme comments.
    +        - "^fixme:"
    +        - "^todo:"
    +      # Check that each sentence ends with a period.
    +      # Default: true
    +      period: false
    +      # Check that each sentence starts with a capital letter.
    +      # Default: false
    +      capital: true

    godox +

    Detects usage of FIXME, TODO and other keywords inside comments.

    Since golangci-lint v1.19.0
    +Repository

    linters:
    +  settings:
    +    godox:
    +      # Report any comments starting with keywords, this is useful for TODO or FIXME comments that
    +      # might be left in the code accidentally and should be resolved before merging.
    +      # Default: ["TODO", "BUG", "FIXME"]
    +      keywords:
    +        - NOTE
    +        - OPTIMIZE # marks code that should be optimized before merging
    +        - HACK # marks hack-around that should be removed before merging

    goheader +

    Check if file header matches to pattern.

    Since golangci-lint v1.28.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    goheader:
    +      # Supports two types 'const` and `regexp`.
    +      # Values can be used recursively.
    +      # Default: {}
    +      values:
    +        const:
    +          # Define here const type values in format k:v.
    +          # For example:
    +          COMPANY: MY COMPANY
    +        regexp:
    +          # Define here regexp type values.
    +          # for example:
    +          AUTHOR: .*@mycompany\.com
    +      # The template used for checking.
    +      # Put here copyright header template for source code files.
    +      # Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.
    +      # Default: ""
    +      template: |-
    +        {{ AUTHOR }} {{ COMPANY }} {{ YEAR }}
    +        SPDX-License-Identifier: Apache-2.0
    +
    +        Licensed under the Apache License, Version 2.0 (the "License");
    +        you may not use this file except in compliance with the License.
    +        You may obtain a copy of the License at:
    +
    +          http://www.apache.org/licenses/LICENSE-2.0
    +
    +        Unless required by applicable law or agreed to in writing, software
    +        distributed under the License is distributed on an "AS IS" BASIS,
    +        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +        See the License for the specific language governing permissions and
    +        limitations under the License.
    +      # As alternative of directive 'template', you may put the path to file with the template source.
    +      # Useful if you need to load the template from a specific file.
    +      # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.
    +      # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`.
    +      # The placeholder '${config-path}' is substituted with a path relative to the configuration file.
    +      # Default: ""
    +      template-path: /path/to/my/template.tmpl

    gomoddirectives +

    Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.

    Since golangci-lint v1.39.0
    +Repository

    linters:
    +  settings:
    +    gomoddirectives:
    +      # Allow local `replace` directives.
    +      # Default: false
    +      replace-local: true
    +      # List of allowed `replace` directives.
    +      # Default: []
    +      replace-allow-list:
    +        - launchpad.net/gocheck
    +      # Allow to not explain why the version has been retracted in the `retract` directives.
    +      # Default: false
    +      retract-allow-no-explanation: true
    +      # Forbid the use of the `exclude` directives.
    +      # Default: false
    +      exclude-forbidden: true
    +      # Forbid the use of the `ignore` directives (>= go1.25).
    +      # Default: false
    +      ignore-forbidden: true
    +      # Forbid the use of the `toolchain` directive.
    +      # Default: false
    +      toolchain-forbidden: true
    +      # Defines a pattern to validate `toolchain` directive.
    +      # Default: '' (no match)
    +      toolchain-pattern: 'go1\.23\.\d+$'
    +      # Forbid the use of the `tool` directives.
    +      # Default: false
    +      tool-forbidden: true
    +      # Forbid the use of the `godebug` directive.
    +      # Default: false
    +      go-debug-forbidden: true
    +      # Defines a pattern to validate `go` minimum version directive.
    +      # Default: '' (no match)
    +      go-version-pattern: '\d\.\d+(\.0)?'

    gomodguard +

    Allow and blocklist linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.

    Since golangci-lint v1.25.0
    +Repository

    linters:
    +  settings:
    +    gomodguard:
    +      allowed:
    +        # List of allowed modules.
    +        # Default: []
    +        modules:
    +          - gopkg.in/yaml.v2
    +        # List of allowed module domains.
    +        # Default: []
    +        domains:
    +          - golang.org
    +      blocked:
    +        # List of blocked modules.
    +        # Default: []
    +        modules:
    +          # Blocked module.
    +          - github.com/uudashr/go-module:
    +              # Recommended modules that should be used instead. (Optional)
    +              recommendations:
    +                - golang.org/x/mod
    +              # Reason why the recommended module should be used. (Optional)
    +              reason: "`mod` is the official go.mod parser library."
    +        # List of blocked module version constraints.
    +        # Default: []
    +        versions:
    +          # Blocked module with version constraint.
    +          - github.com/mitchellh/go-homedir:
    +              # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons.
    +              version: "< 1.1.0"
    +              # Reason why the version constraint exists. (Optional)
    +              reason: "testing if blocked version constraint works."
    +        # Set to true to raise lint issues for packages that are loaded from a local path via replace directive.
    +        # Default: false
    +        local-replace-directives: false

    goprintffuncname +

    Checks that printf-like functions are named with f at the end.

    Since golangci-lint v1.23.0
    +Repository

    No settings available.

    gosec +

    Inspects source code for security problems.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    gosec:
    +      # To select a subset of rules to run.
    +      # Available rules: https://github.com/securego/gosec#available-rules
    +      # Default: [] - means include all rules
    +      includes:
    +        - G101 # Look for hard coded credentials
    +        - G102 # Bind to all interfaces
    +        - G103 # Audit the use of unsafe block
    +        - G104 # Audit errors not checked
    +        - G106 # Audit the use of ssh.InsecureIgnoreHostKey
    +        - G107 # Url provided to HTTP request as taint input
    +        - G108 # Profiling endpoint automatically exposed on /debug/pprof
    +        - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32
    +        - G110 # Potential DoS vulnerability via decompression bomb
    +        - G111 # Potential directory traversal
    +        - G112 # Potential slowloris attack
    +        - G114 # Use of net/http serve function that has no support for setting timeouts
    +        - G115 # Potential integer overflow when converting between integer types
    +        - G201 # SQL query construction using format string
    +        - G202 # SQL query construction using string concatenation
    +        - G203 # Use of unescaped data in HTML templates
    +        - G204 # Audit use of command execution
    +        - G301 # Poor file permissions used when creating a directory
    +        - G302 # Poor file permissions used with chmod
    +        - G303 # Creating tempfile using a predictable path
    +        - G304 # File path provided as taint input
    +        - G305 # File traversal when extracting zip/tar archive
    +        - G306 # Poor file permissions used when writing to a new file
    +        - G307 # Poor file permissions used when creating a file with os.Create
    +        - G401 # Detect the usage of MD5 or SHA1
    +        - G402 # Look for bad TLS connection settings
    +        - G403 # Ensure minimum RSA key length of 2048 bits
    +        - G404 # Insecure random number source (rand)
    +        - G405 # Detect the usage of DES or RC4
    +        - G406 # Detect the usage of MD4 or RIPEMD160
    +        - G501 # Import blocklist: crypto/md5
    +        - G502 # Import blocklist: crypto/des
    +        - G503 # Import blocklist: crypto/rc4
    +        - G504 # Import blocklist: net/http/cgi
    +        - G505 # Import blocklist: crypto/sha1
    +        - G506 # Import blocklist: golang.org/x/crypto/md4
    +        - G507 # Import blocklist: golang.org/x/crypto/ripemd160
    +        - G601 # Implicit memory aliasing of items from a range statement
    +        - G602 # Slice access out of bounds
    +      # To specify a set of rules to explicitly exclude.
    +      # Available rules: https://github.com/securego/gosec#available-rules
    +      # Default: []
    +      excludes:
    +        - G101 # Look for hard coded credentials
    +        - G102 # Bind to all interfaces
    +        - G103 # Audit the use of unsafe block
    +        - G104 # Audit errors not checked
    +        - G106 # Audit the use of ssh.InsecureIgnoreHostKey
    +        - G107 # Url provided to HTTP request as taint input
    +        - G108 # Profiling endpoint automatically exposed on /debug/pprof
    +        - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32
    +        - G110 # Potential DoS vulnerability via decompression bomb
    +        - G111 # Potential directory traversal
    +        - G112 # Potential slowloris attack
    +        - G114 # Use of net/http serve function that has no support for setting timeouts
    +        - G115 # Potential integer overflow when converting between integer types
    +        - G201 # SQL query construction using format string
    +        - G202 # SQL query construction using string concatenation
    +        - G203 # Use of unescaped data in HTML templates
    +        - G204 # Audit use of command execution
    +        - G301 # Poor file permissions used when creating a directory
    +        - G302 # Poor file permissions used with chmod
    +        - G303 # Creating tempfile using a predictable path
    +        - G304 # File path provided as taint input
    +        - G305 # File traversal when extracting zip/tar archive
    +        - G306 # Poor file permissions used when writing to a new file
    +        - G307 # Poor file permissions used when creating a file with os.Create
    +        - G401 # Detect the usage of MD5 or SHA1
    +        - G402 # Look for bad TLS connection settings
    +        - G403 # Ensure minimum RSA key length of 2048 bits
    +        - G404 # Insecure random number source (rand)
    +        - G405 # Detect the usage of DES or RC4
    +        - G406 # Detect the usage of MD4 or RIPEMD160
    +        - G501 # Import blocklist: crypto/md5
    +        - G502 # Import blocklist: crypto/des
    +        - G503 # Import blocklist: crypto/rc4
    +        - G504 # Import blocklist: net/http/cgi
    +        - G505 # Import blocklist: crypto/sha1
    +        - G506 # Import blocklist: golang.org/x/crypto/md4
    +        - G507 # Import blocklist: golang.org/x/crypto/ripemd160
    +        - G601 # Implicit memory aliasing of items from a range statement
    +        - G602 # Slice access out of bounds
    +      # Filter out the issues with a lower severity than the given value.
    +      # Valid options are: low, medium, high.
    +      # Default: low
    +      severity: medium
    +      # Filter out the issues with a lower confidence than the given value.
    +      # Valid options are: low, medium, high.
    +      # Default: low
    +      confidence: medium
    +      # Concurrency value.
    +      # Default: the number of logical CPUs usable by the current process.
    +      concurrency: 12
    +      # To specify the configuration of rules.
    +      config:
    +        # Globals are applicable to all rules.
    +        global:
    +          # If true, ignore #nosec in comments (and an alternative as well).
    +          # Default: false
    +          nosec: true
    +          # Add an alternative comment prefix to #nosec (both will work at the same time).
    +          # Default: ""
    +          "#nosec": "#my-custom-nosec"
    +          # Define whether nosec issues are counted as finding or not.
    +          # Default: false
    +          show-ignored: true
    +          # Audit mode enables addition checks that for normal code analysis might be too nosy.
    +          # Default: false
    +          audit: true
    +        G101:
    +          # Regexp pattern for variables and constants to find.
    +          # Default: "(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred"
    +          pattern: "(?i)example"
    +          # If true, complain about all cases (even with low entropy).
    +          # Default: false
    +          ignore_entropy: false
    +          # Maximum allowed entropy of the string.
    +          # Default: "80.0"
    +          entropy_threshold: "80.0"
    +          # Maximum allowed value of entropy/string length.
    +          # Is taken into account if entropy >= entropy_threshold/2.
    +          # Default: "3.0"
    +          per_char_threshold: "3.0"
    +          # Calculate entropy for first N chars of the string.
    +          # Default: "16"
    +          truncate: "32"
    +        # Additional functions to ignore while checking unhandled errors.
    +        # Following functions always ignored:
    +        #   bytes.Buffer:
    +        #     - Write
    +        #     - WriteByte
    +        #     - WriteRune
    +        #     - WriteString
    +        #   fmt:
    +        #     - Print
    +        #     - Printf
    +        #     - Println
    +        #     - Fprint
    +        #     - Fprintf
    +        #     - Fprintln
    +        #   strings.Builder:
    +        #     - Write
    +        #     - WriteByte
    +        #     - WriteRune
    +        #     - WriteString
    +        #   io.PipeWriter:
    +        #     - CloseWithError
    +        #   hash.Hash:
    +        #     - Write
    +        #   os:
    +        #     - Unsetenv
    +        # Default: {}
    +        G104:
    +          fmt:
    +            - Fscanf
    +        G111:
    +          # Regexp pattern to find potential directory traversal.
    +          # Default: "http\\.Dir\\(\"\\/\"\\)|http\\.Dir\\('\\/'\\)"
    +          pattern: "custom\\.Dir\\(\\)"
    +        # Maximum allowed permissions mode for os.Mkdir and os.MkdirAll.
    +        # Default: "0750"
    +        G301: "0750"
    +        # Maximum allowed permissions mode for os.OpenFile and os.Chmod.
    +        # Default: "0600"
    +        G302: "0600"
    +        # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile.
    +        # Default: "0600"
    +        G306: "0600"

    gosmopolitan +

    Report certain i18n/l10n anti-patterns in your Go codebase.

    Since golangci-lint v1.53.0
    +Repository

    linters:
    +  settings:
    +    gosmopolitan:
    +      # Allow and ignore `time.Local` usages.
    +      #
    +      # Default: false
    +      allow-time-local: true
    +      # List of fully qualified names in the `full/pkg/path.name` form, to act as "i18n escape hatches".
    +      # String literals inside call-like expressions to, or struct literals of those names,
    +      # are exempt from the writing system check.
    +      #
    +      # Default: []
    +      escape-hatches:
    +        - 'github.com/nicksnyder/go-i18n/v2/i18n.Message'
    +        - 'example.com/your/project/i18n/markers.Raw'
    +        - 'example.com/your/project/i18n/markers.OK'
    +        - 'example.com/your/project/i18n/markers.TODO'
    +        - 'command-line-arguments.Simple'
    +      # List of Unicode scripts to watch for any usage in string literals.
    +      # https://pkg.go.dev/unicode#pkg-variables
    +      #
    +      # Default: ["Han"]
    +      watch-for-scripts:
    +        - Devanagari
    +        - Han
    +        - Hangul
    +        - Hiragana
    +        - Katakana

    govet +

    Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes.

    Since golangci-lint v1.0.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    govet:
    +      # Disable all analyzers.
    +      # Default: false
    +      disable-all: true
    +      # Enable analyzers by name.
    +      # (In addition to default:
    +      #   appends, asmdecl, assign, atomic, bools, buildtag, cgocall, composites, copylocks, defers, directive, errorsas,
    +      #   framepointer, httpresponse, ifaceassert, loopclosure, lostcancel, nilfunc, printf, shift, sigchanyzer, slog,
    +      #   stdmethods, stringintconv, structtag, testinggoroutine, tests, timeformat, unmarshal, unreachable, unsafeptr,
    +      #   unusedresult
    +      # ).
    +      # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.
    +      # Default: []
    +      enable:
    +        # Check for missing values after append.
    +        - appends
    +        # Report mismatches between assembly files and Go declarations.
    +        - asmdecl
    +        # Check for useless assignments.
    +        - assign
    +        # Check for common mistakes using the sync/atomic package.
    +        - atomic
    +        # Check for non-64-bits-aligned arguments to sync/atomic functions.
    +        - atomicalign
    +        # Check for common mistakes involving boolean operators.
    +        - bools
    +        # Check //go:build and // +build directives.
    +        - buildtag
    +        # Detect some violations of the cgo pointer passing rules.
    +        - cgocall
    +        # Check for unkeyed composite literals.
    +        - composites
    +        # Check for locks erroneously passed by value.
    +        - copylocks
    +        # Check for calls of reflect.DeepEqual on error values.
    +        - deepequalerrors
    +        # Report common mistakes in defer statements.
    +        - defers
    +        # Check Go toolchain directives such as //go:debug.
    +        - directive
    +        # Report passing non-pointer or non-error values to errors.As.
    +        - errorsas
    +        # Find structs that would use less memory if their fields were sorted.
    +        - fieldalignment
    +        # Find calls to a particular function.
    +        - findcall
    +        # Report assembly that clobbers the frame pointer before saving it.
    +        - framepointer
    +        # Check format of addresses passed to net.Dial.
    +        - hostport
    +        # Report using Go 1.22 enhanced ServeMux patterns in older Go versions.
    +        - httpmux
    +        # Check for mistakes using HTTP responses.
    +        - httpresponse
    +        # Detect impossible interface-to-interface type assertions.
    +        - ifaceassert
    +        # Check references to loop variables from within nested functions.
    +        - loopclosure
    +        # Check cancel func returned by context.WithCancel is called.
    +        - lostcancel
    +        # Check for useless comparisons between functions and nil.
    +        - nilfunc
    +        # Check for redundant or impossible nil comparisons.
    +        - nilness
    +        # Check consistency of Printf format strings and arguments.
    +        - printf
    +        # Check for comparing reflect.Value values with == or reflect.DeepEqual.
    +        - reflectvaluecompare
    +        # Check for possible unintended shadowing of variables.
    +        - shadow
    +        # Check for shifts that equal or exceed the width of the integer.
    +        - shift
    +        # Check for unbuffered channel of os.Signal.
    +        - sigchanyzer
    +        # Check for invalid structured logging calls.
    +        - slog
    +        # Check the argument type of sort.Slice.
    +        - sortslice
    +        # Check signature of methods of well-known interfaces.
    +        - stdmethods
    +        # Report uses of too-new standard library symbols.
    +        - stdversion
    +        # Check for string(int) conversions.
    +        - stringintconv
    +        # Check that struct field tags conform to reflect.StructTag.Get.
    +        - structtag
    +        # Report calls to (*testing.T).Fatal from goroutines started by a test.
    +        - testinggoroutine
    +        # Check for common mistaken usages of tests and examples.
    +        - tests
    +        # Check for calls of (time.Time).Format or time.Parse with 2006-02-01.
    +        - timeformat
    +        # Report passing non-pointer or non-interface values to unmarshal.
    +        - unmarshal
    +        # Check for unreachable code.
    +        - unreachable
    +        # Check for invalid conversions of uintptr to unsafe.Pointer.
    +        - unsafeptr
    +        # Check for unused results of calls to some functions.
    +        - unusedresult
    +        # Checks for unused writes.
    +        - unusedwrite
    +        # Check for misuses of sync.WaitGroup.
    +        - waitgroup
    +      # Enable all analyzers.
    +      # Default: false
    +      enable-all: true
    +      # Disable analyzers by name.
    +      # (In addition to default
    +      #   atomicalign, deepequalerrors, fieldalignment, findcall, nilness, reflectvaluecompare, shadow, sortslice,
    +      #   timeformat, unusedwrite
    +      # ).
    +      # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.
    +      # Default: []
    +      disable:
    +        - appends
    +        - asmdecl
    +        - assign
    +        - atomic
    +        - atomicalign
    +        - bools
    +        - buildtag
    +        - cgocall
    +        - composites
    +        - copylocks
    +        - deepequalerrors
    +        - defers
    +        - directive
    +        - errorsas
    +        - fieldalignment
    +        - findcall
    +        - framepointer
    +        - hostport
    +        - httpmux
    +        - httpresponse
    +        - ifaceassert
    +        - loopclosure
    +        - lostcancel
    +        - nilfunc
    +        - nilness
    +        - printf
    +        - reflectvaluecompare
    +        - shadow
    +        - shift
    +        - sigchanyzer
    +        - slog
    +        - sortslice
    +        - stdmethods
    +        - stdversion
    +        - stringintconv
    +        - structtag
    +        - testinggoroutine
    +        - tests
    +        - timeformat
    +        - unmarshal
    +        - unreachable
    +        - unsafeptr
    +        - unusedresult
    +        - unusedwrite
    +        - waitgroup
    +      # Settings per analyzer.
    +      settings:
    +        # Analyzer name, run `go tool vet help` to see all analyzers.
    +        printf:
    +          # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`).
    +          # Default: []
    +          funcs:
    +            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof
    +            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf
    +            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf
    +            - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf
    +        shadow:
    +          # Whether to be strict about shadowing; can be noisy.
    +          # Default: false
    +          strict: true
    +        unusedresult:
    +          # Comma-separated list of functions whose results must be used.
    +          # (In addition to default:
    +          #   context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, errors.New, fmt.Errorf,
    +          #   fmt.Sprint, fmt.Sprintf, sort.Reverse
    +          # ).
    +          # Default: []
    +          funcs:
    +            - pkg.MyFunc
    +          # Comma-separated list of names of methods of type func() string whose results must be used.
    +          # (In addition to default Error,String).
    +          # Default: []
    +          stringmethods:
    +            - MyMethod

    grouper +

    Analyze expression groups.

    Since golangci-lint v1.44.0
    +Repository

    linters:
    +  settings:
    +    grouper:
    +      # Require the use of a single global 'const' declaration only.
    +      # Default: false
    +      const-require-single-const: true
    +      # Require the use of grouped global 'const' declarations.
    +      # Default: false
    +      const-require-grouping: true
    +      # Require the use of a single 'import' declaration only.
    +      # Default: false
    +      import-require-single-import: true
    +      # Require the use of grouped 'import' declarations.
    +      # Default: false
    +      import-require-grouping: true
    +      # Require the use of a single global 'type' declaration only.
    +      # Default: false
    +      type-require-single-type: true
    +      # Require the use of grouped global 'type' declarations.
    +      # Default: false
    +      type-require-grouping: true
    +      # Require the use of a single global 'var' declaration only.
    +      # Default: false
    +      var-require-single-var: true
    +      # Require the use of grouped global 'var' declarations.
    +      # Default: false
    +      var-require-grouping: true

    iface +

    Detect the incorrect use of interfaces, helping developers avoid interface pollution.

    Since golangci-lint v1.62.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    iface:
    +      # List of analyzers.
    +      # Default: ["identical"]
    +      enable:
    +        - identical # Identifies interfaces in the same package that have identical method sets.
    +        - unused # Identifies interfaces that are not used anywhere in the same package where the interface is defined.
    +        - opaque # Identifies functions that return interfaces, but the actual returned value is always a single concrete implementation.
    +        - unexported # Identifies interfaces that are not exported but are used in exported functions or methods.
    +      settings:
    +        unused:
    +          # List of packages path to exclude from the check.
    +          # Default: []
    +          exclude:
    +            - github.com/example/log

    importas +

    Enforces consistent import aliases.

    Since golangci-lint v1.38.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    importas:
    +      # Do not allow unaliased imports of aliased packages.
    +      # Default: false
    +      no-unaliased: true
    +      # Do not allow non-required aliases.
    +      # Default: false
    +      no-extra-aliases: true
    +      # List of aliases
    +      # Default: []
    +      alias:
    +        # Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package.
    +        - pkg: knative.dev/serving/pkg/apis/serving/v1
    +          alias: servingv1
    +        # Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package.
    +        - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1
    +          alias: autoscalingv1alpha1
    +        # You can specify the package path by regular expression,
    +        # and alias by regular expression expansion syntax like below.
    +        # See https://github.com/julz/importas#use-regular-expression for details.
    +        - pkg: knative.dev/serving/pkg/apis/(\w+)/(v[\w\d]+)
    +          alias: $1$2
    +        # An explicit empty alias can be used to ensure no aliases are used for a package.
    +        # This can be useful if `no-extra-aliases: true` doesn't fit your need.
    +        # Multiple packages can use an empty alias.
    +        - pkg: errors
    +          alias: ""

    inamedparam +

    Reports interfaces with unnamed method parameters.

    Since golangci-lint v1.55.0
    +Repository

    linters:
    +  settings:
    +    inamedparam:
    +      # Skips check for interface methods with only a single parameter.
    +      # Default: false
    +      skip-single-param: true

    ineffassign +

    Detects when assignments to existing variables are not used.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    ineffassign:
    +      # Check escaping variables of type error, may cause false positives.
    +      # Default: false
    +      check-escaping-errors: true

    interfacebloat +

    A linter that checks the number of methods inside an interface.

    Since golangci-lint v1.49.0
    +Repository

    linters:
    +  settings:
    +    interfacebloat:
    +      # The maximum number of methods allowed for an interface.
    +      # Default: 10
    +      max: 5

    intrange +

    Intrange is a linter to find places where for loops could make use of an integer range.

    Since golangci-lint v1.57.0
    Autofix
    +Repository

    No settings available.

    iotamixing +

    Checks if iotas are being used in const blocks with other non-iota declarations.

    Since golangci-lint v2.5.0
    New
    +Repository

    linters:
    +  settings:
    +    iotamixing:
    +      # Whether to report individual consts rather than just the const block.
    +      # Default: false
    +      report-individual: true

    ireturn +

    Accept Interfaces, Return Concrete Types.

    Since golangci-lint v1.43.0
    +Repository

    linters:
    +  settings:
    +    ireturn:
    +      # List of interfaces to allow.
    +      # Lists of the keywords and regular expressions matched to interface or package names can be used.
    +      # `allow` and `reject` settings cannot be used at the same time.
    +      #
    +      # Keywords:
    +      # - `empty` for `interface{}`
    +      # - `error` for errors
    +      # - `stdlib` for standard library
    +      # - `anon` for anonymous interfaces
    +      # - `generic` for generic interfaces added in go 1.18
    +      #
    +      # Default: [anon, error, empty, stdlib]
    +      allow:
    +        - anon
    +        # You can specify idiomatic endings for interface
    +        - (or|er)$
    +      # List of interfaces to reject.
    +      # Lists of the keywords and regular expressions matched to interface or package names can be used.
    +      # `allow` and `reject` settings cannot be used at the same time.
    +      #
    +      # Keywords:
    +      # - `empty` for `interface{}`
    +      # - `error` for errors
    +      # - `stdlib` for standard library
    +      # - `anon` for anonymous interfaces
    +      # - `generic` for generic interfaces added in go 1.18
    +      #
    +      # Default: []
    +      reject:
    +        - github.com\/user\/package\/v4\.Type

    lll +

    Reports long lines.

    Since golangci-lint v1.8.0

    linters:
    +  settings:
    +    lll:
    +      # Max line length, lines longer will be reported.
    +      # '\t' is counted as 1 character by default, and can be changed with the tab-width option.
    +      # Default: 120.
    +      line-length: 120
    +      # Tab width in spaces.
    +      # Default: 1
    +      tab-width: 1

    loggercheck +

    Checks key value pairs for common logger libraries (kitlog,klog,logr,slog,zap).

    Since golangci-lint v1.49.0
    +Repository

    linters:
    +  settings:
    +    loggercheck:
    +      # Allow check for the github.com/go-kit/log library.
    +      # Default: true
    +      kitlog: false
    +      # Allow check for the k8s.io/klog/v2 library.
    +      # Default: true
    +      klog: false
    +      # Allow check for the github.com/go-logr/logr library.
    +      # Default: true
    +      logr: false
    +      # Allow check for the log/slog library.
    +      # Default: true
    +      slog: false
    +      # Allow check for the "sugar logger" from go.uber.org/zap library.
    +      # Default: true
    +      zap: false
    +      # Require all logging keys to be inlined constant strings.
    +      # Default: false
    +      require-string-key: true
    +      # Require printf-like format specifier (%s, %d for example) not present.
    +      # Default: false
    +      no-printf-like: true
    +      # List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.
    +      # For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt
    +      # Default: empty
    +      rules:
    +        - k8s.io/klog/v2.InfoS # package level exported functions
    +        - (github.com/go-logr/logr.Logger).Error # "Methods"
    +        - (*go.uber.org/zap.SugaredLogger).With # Also "Methods", but with a pointer receiver

    maintidx +

    Maintidx measures the maintainability index of each function.

    Since golangci-lint v1.44.0
    +Repository

    linters:
    +  settings:
    +    maintidx:
    +      # Show functions with maintainability index lower than N.
    +      # A high index indicates better maintainability (it's kind of the opposite of complexity).
    +      # Default: 20
    +      under: 100

    makezero +

    Find slice declarations with non-zero initial length.

    Since golangci-lint v1.34.0
    +Repository

    linters:
    +  settings:
    +    makezero:
    +      # Allow only slices initialized with a length of zero.
    +      # Default: false
    +      always: true

    mirror +

    Reports wrong mirror patterns of bytes/strings usage.

    Since golangci-lint v1.53.0
    Autofix
    +Repository

    No settings available.

    misspell +

    Finds commonly misspelled English words.

    Since golangci-lint v1.8.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    misspell:
    +      # Correct spellings using locale preferences for US or UK.
    +      # Setting locale to US will correct the British spelling of 'colour' to 'color'.
    +      # Default is to use a neutral variety of English.
    +      locale: US
    +      # Typos to ignore.
    +      # Should be in lower case.
    +      # Default: []
    +      ignore-rules:
    +        - someword
    +      # Extra word corrections.
    +      # `typo` and `correction` should only contain letters.
    +      # The words are case-insensitive.
    +      # Default: []
    +      extra-words:
    +        - typo: "iff"
    +          correction: "if"
    +        - typo: "cancelation"
    +          correction: "cancellation"
    +      # Mode of the analysis:
    +      # - default: checks all the file content.
    +      # - restricted: checks only comments.
    +      # Default: ""
    +      mode: restricted

    mnd +

    An analyzer to detect magic numbers.

    Since golangci-lint v1.22.0
    +Repository

    linters:
    +  settings:
    +    mnd:
    +      # List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.
    +      # Default: ["argument", "case", "condition", "operation", "return", "assign"]
    +      checks:
    +        - argument
    +        - case
    +        - condition
    +        - operation
    +        - return
    +        - assign
    +      # List of numbers to exclude from analysis.
    +      # The numbers should be written as string.
    +      # Values always ignored: "1", "1.0", "0" and "0.0".
    +      # Default: []
    +      ignored-numbers:
    +        - '0666'
    +        - '0755'
    +        - '42'
    +      # List of file patterns to exclude from analysis.
    +      # Values always ignored: `.+_test.go`.
    +      # Default: []
    +      ignored-files:
    +        - 'magic1_.+\.go$'
    +      # List of function patterns to exclude from analysis.
    +      # Following functions are always ignored: `time.Date`,
    +      # `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`,
    +      # `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`.
    +      # Default: []
    +      ignored-functions:
    +        - '^math\.'
    +        - '^http\.StatusText$'

    musttag +

    Enforce field tags in (un)marshaled structs.

    Since golangci-lint v1.51.0
    +Repository

    linters:
    +  settings:
    +    musttag:
    +      # A set of custom functions to check in addition to the builtin ones.
    +      # Default: json, xml, gopkg.in/yaml.v3, BurntSushi/toml, mitchellh/mapstructure, jmoiron/sqlx
    +      functions:
    +        # The full name of the function, including the package.
    +        - name: github.com/hashicorp/hcl/v2/hclsimple.DecodeFile
    +          # The struct tag whose presence should be ensured.
    +          tag: hcl
    +          # The position of the argument to check.
    +          arg-pos: 2

    nakedret +

    Checks that functions with naked returns are not longer than a maximum size (can be zero).

    Since golangci-lint v1.19.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    nakedret:
    +      # Make an issue if func has more lines of code than this setting, and it has naked returns.
    +      # Default: 30
    +      max-func-lines: 31

    nestif +

    Reports deeply nested if statements.

    Since golangci-lint v1.25.0
    +Repository

    linters:
    +  settings:
    +    nestif:
    +      # Minimal complexity of if statements to report.
    +      # Default: 5
    +      min-complexity: 4

    nilerr +

    Find the code that returns nil even if it checks that the error is not nil.

    Since golangci-lint v1.38.0
    +Repository

    No settings available.

    nilnesserr +

    Reports constructs that checks for err != nil, but returns a different nil value error. +Powered by nilness and nilerr.

    Since golangci-lint v1.63.0
    +Repository

    No settings available.

    nilnil +

    Checks that there is no simultaneous return of nil error and an invalid value.

    Since golangci-lint v1.43.0
    +Repository

    linters:
    +  settings:
    +    nilnil:
    +      # To check functions with only two return values (`return nil, nil`).
    +      # If disabled then returns like `return nil, nil, ..., nil` are supported.
    +      # Default: true
    +      only-two: false
    +      # In addition, detect opposite situation (simultaneous return of non-nil error and valid value).
    +      # E.g, `return clone, fh.indexer.Update(clone)` will be considered as invalid.
    +      # Default: false
    +      detect-opposite: true
    +      # List of return types to check.
    +      # Default: ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"]
    +      checked-types:
    +        - chan
    +        - func
    +        - iface
    +        - map
    +        - ptr
    +        - uintptr
    +        - unsafeptr

    nlreturn +

    Checks for a new line before return and branch statements to increase code clarity.

    Since golangci-lint v1.30.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    nlreturn:
    +      # Size of the block (including return statement that is still "OK"),
    +      # so no return split required.
    +      # Default: 1
    +      block-size: 2

    noctx +

    Detects function and method with missing usage of context.Context.

    Since golangci-lint v1.28.0
    +Repository

    No settings available.

    noinlineerr +

    Disallows inline error handling (if err := ...; err != nil {).

    Since golangci-lint v2.2.0
    +Repository

    No settings available.

    nolintlint +

    Reports ill-formed or insufficient nolint directives.

    Since golangci-lint v1.26.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    nolintlint:
    +      # Disable to ensure that all nolint directives actually have an effect.
    +      # Default: false
    +      allow-unused: true
    +      # Exclude following linters from requiring an explanation.
    +      # Default: []
    +      allow-no-explanation: []
    +      # Enable to require an explanation of nonzero length after each nolint directive.
    +      # Default: false
    +      require-explanation: true
    +      # Enable to require nolint directives to mention the specific linter being suppressed.
    +      # Default: false
    +      require-specific: true

    nonamedreturns +

    Reports all named returns.

    Since golangci-lint v1.46.0
    +Repository

    linters:
    +  settings:
    +    nonamedreturns:
    +      # Report named error if it is assigned inside defer.
    +      # Default: false
    +      report-error-in-defer: true

    nosprintfhostport +

    Checks for misuse of Sprintf to construct a host with port in a URL.

    Since golangci-lint v1.46.0
    +Repository

    No settings available.

    paralleltest +

    Detects missing usage of t.Parallel() method in your Go test.

    Since golangci-lint v1.33.0
    +Repository

    linters:
    +  settings:
    +    paralleltest:
    +      # Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.
    +      # Default: false
    +      ignore-missing: true
    +      # Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are
    +      # still required to have `t.Parallel`, but subtests are allowed to skip it.
    +      # Default: false
    +      ignore-missing-subtests: true

    perfsprint +

    Checks that fmt.Sprintf can be replaced with a faster alternative.

    Since golangci-lint v1.55.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    perfsprint:
    +      # Enable/disable optimization of integer formatting.
    +      # Default: true
    +      integer-format: false
    +      # Optimizes even if it requires an int or uint type cast.
    +      # Default: true
    +      int-conversion: false
    +      # Enable/disable optimization of error formatting.
    +      # Default: true
    +      error-format: false
    +      # Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.
    +      # Default: false
    +      err-error: true
    +      # Optimizes `fmt.Errorf`.
    +      # Default: true
    +      errorf: false
    +      # Enable/disable optimization of string formatting.
    +      # Default: true
    +      string-format: false
    +      # Optimizes `fmt.Sprintf` with only one argument.
    +      # Default: true
    +      sprintf1: false
    +      # Optimizes into strings concatenation.
    +      # Default: true
    +      strconcat: false
    +      # Enable/disable optimization of bool formatting.
    +      # Default: true
    +      bool-format: false
    +      # Enable/disable optimization of hex formatting.
    +      # Default: true
    +      hex-format: false

    prealloc +

    Find slice declarations that could potentially be pre-allocated.

    Since golangci-lint v1.19.0
    +Repository

    linters:
    +  settings:
    +    prealloc:
    +      # IMPORTANT: we don't recommend using this linter before doing performance profiling.
    +      # For most programs usage of prealloc will be a premature optimization.
    +
    +      # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.
    +      # Default: true
    +      simple: false
    +      # Report pre-allocation suggestions on range loops.
    +      # Default: true
    +      range-loops: false
    +      # Report pre-allocation suggestions on for loops.
    +      # Default: false
    +      for-loops: true

    predeclared +

    Find code that shadows one of Go's predeclared identifiers.

    Since golangci-lint v1.35.0
    +Repository

    linters:
    +  settings:
    +    predeclared:
    +      # List of predeclared identifiers to not report on.
    +      # Default: []
    +      ignore:
    +        - new
    +        - int
    +      # Include method names and field names in checks.
    +      # Default: false
    +      qualified-name: true

    promlinter +

    Check Prometheus metrics naming via promlint.

    Since golangci-lint v1.40.0
    +Repository

    linters:
    +  settings:
    +    promlinter:
    +      # Promlinter cannot infer all metrics name in static analysis.
    +      # Enable strict mode will also include the errors caused by failing to parse the args.
    +      # Default: false
    +      strict: true
    +      # Please refer to https://github.com/yeya24/promlinter#usage for detailed usage.
    +      # Default: []
    +      disabled-linters:
    +        # Help detects issues related to the help text for a metric.
    +        - Help
    +        # MetricUnits detects issues with metric unit names.
    +        - MetricUnits
    +        # Counter detects issues specific to counters, as well as patterns that should only be used with counters.
    +        - Counter
    +        # HistogramSummaryReserved detects when other types of metrics use names or labels reserved for use by histograms and/or summaries.
    +        - HistogramSummaryReserved
    +        # MetricTypeInName detects when metric types are included in the metric name.
    +        - MetricTypeInName
    +        # ReservedChars detects colons in metric names.
    +        - ReservedChars
    +        # CamelCase detects metric names and label names written in camelCase.
    +        - CamelCase
    +        # UnitAbbreviations detects abbreviated units in the metric name.
    +        - UnitAbbreviations

    protogetter +

    Reports direct reads from proto message fields when getters should be used.

    Since golangci-lint v1.55.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    protogetter:
    +      # Skip files generated by specified generators from the checking.
    +      # Checks only the file's initial comment, which must follow the format: "// Code generated by <generator-name>".
    +      # Files generated by protoc-gen-go, protoc-gen-go-grpc, and protoc-gen-grpc-gateway are always excluded automatically.
    +      # Default: []
    +      skip-generated-by: ["protoc-gen-go-my-own-generator"]
    +      # Skip files matching the specified glob pattern from the checking.
    +      # Default: []
    +      skip-files:
    +        - "*.pb.go"
    +        - "*/vendor/*"
    +        - "/full/path/to/file.go"
    +      # Skip any generated files from the checking.
    +      # Default: false
    +      skip-any-generated: true
    +      # Skip first argument of append function.
    +      # Default: false
    +      replace-first-arg-in-append: true

    reassign +

    Checks that package variables are not reassigned.

    Since golangci-lint v1.49.0
    +Repository

    linters:
    +  settings:
    +    reassign:
    +      # Patterns for global variable names that are checked for reassignment.
    +      # See https://github.com/curioswitch/go-reassign#usage
    +      # Default: ["EOF", "Err.*"]
    +      patterns:
    +        - ".*"

    recvcheck +

    Checks for receiver type consistency.

    Since golangci-lint v1.62.0
    +Repository

    linters:
    +  settings:
    +    recvcheck:
    +      # Disables the built-in method exclusions:
    +      # - `MarshalText`
    +      # - `MarshalJSON`
    +      # - `MarshalYAML`
    +      # - `MarshalXML`
    +      # - `MarshalBinary`
    +      # - `GobEncode`
    +      # Default: false
    +      disable-builtin: true
    +      # User-defined method exclusions.
    +      # The format is `struct_name.method_name` (ex: `Foo.MethodName`).
    +      # A wildcard `*` can use as a struct name (ex: `*.MethodName`).
    +      # Default: []
    +      exclusions:
    +        - "*.Value"

    revive +

    Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.

    Since golangci-lint v1.37.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    revive:
    +      # Maximum number of open files at the same time.
    +      # See https://github.com/mgechev/revive#command-line-flags
    +      # Defaults to unlimited.
    +      max-open-files: 2048
    +      # Sets the default severity.
    +      # See https://github.com/mgechev/revive#configuration
    +      # Default: warning
    +      severity: error
    +      # Enable all available rules.
    +      # Default: false
    +      enable-all-rules: true
    +      # Enable validation of comment directives.
    +      # See https://github.com/mgechev/revive#comment-directives
    +      directives:
    +        - name: specify-disable-reason
    +          severity: error
    +      # Sets the default failure confidence.
    +      # This means that linting errors with less than 0.8 confidence will be ignored.
    +      # Default: 0.8
    +      confidence: 0.1
    +      # Revive handles the default rules in a way that can be unexpected:
    +      # - If there are no explicit rules, the default rules are used.
    +      # - If there is at least one explicit rule, the default rules are not used.
    +      # Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules.
    +      rules:
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#add-constant
    +        - name: add-constant
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - max-lit-count: "3"
    +              allow-strs: '""'
    +              allow-ints: "0,1,2"
    +              allow-floats: "0.0,0.,1.0,1.,2.0,2."
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#argument-limit
    +        - name: argument-limit
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [4]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#atomic
    +        - name: atomic
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#banned-characters
    +        - name: banned-characters
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: ["Ω", "Σ", "σ", "7"]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bare-return
    +        - name: bare-return
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#blank-imports
    +        - name: blank-imports
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bool-literal-in-expr
    +        - name: bool-literal-in-expr
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#call-to-gc
    +        - name: call-to-gc
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cognitive-complexity
    +        - name: cognitive-complexity
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [7]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comment-spacings
    +        - name: comment-spacings
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - mypragma
    +            - otherpragma
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comments-density
    +        - name: comments-density
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [15]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-naming
    +        - name: confusing-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-results
    +        - name: confusing-results
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#constant-logical-expr
    +        - name: constant-logical-expr
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-as-argument
    +        - name: context-as-argument
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - allow-types-before: "*testing.T,*github.com/user/repo/testing.Harness"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-keys-type
    +        - name: context-keys-type
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cyclomatic
    +        - name: cyclomatic
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [3]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#datarace
    +        - name: datarace
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#deep-exit
    +        - name: deep-exit
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#defer
    +        - name: defer
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "call-chain"
    +            - "loop"
    +            - "method-call"
    +            - "recover"
    +            - "immediate-recover"
    +            - "return"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#dot-imports
    +        - name: dot-imports
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - allowed-packages: ["github.com/onsi/ginkgo/v2", "github.com/onsi/gomega"]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#duplicated-imports
    +        - name: duplicated-imports
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#early-return
    +        - name: early-return
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "preserve-scope"
    +            - "allow-jump"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-block
    +        - name: empty-block
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-lines
    +        - name: empty-lines
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-map-style
    +        - name: enforce-map-style
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "make"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-repeated-arg-type-style
    +        - name: enforce-repeated-arg-type-style
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "short"
    +            # Or this parameter:
    +            - func-arg-style: "full"
    +              func-ret-val-style: "short"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-slice-style
    +        - name: enforce-slice-style
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "make"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-switch-style
    +        - name: enforce-switch-style
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: ["allowNoDefault"]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-naming
    +        - name: error-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-return
    +        - name: error-return
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-strings
    +        - name: error-strings
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "xerrors.New"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#errorf
    +        - name: errorf
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#exported
    +        - name: exported
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "check-private-receivers"
    +            - "disable-stuttering-check"
    +            - "say-repetitive-instead-of-stutters"
    +            - "check-public-interface"
    +            - "disable-checks-on-constants"
    +            - "disable-checks-on-functions"
    +            - "disable-checks-on-methods"
    +            - "disable-checks-on-types"
    +            - "disable-checks-on-variables"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-header
    +        - name: file-header
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - This is the text that must appear at the top of source files.
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-length-limit
    +        - name: file-length-limit
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - max: 100
    +              skip-comments: true
    +              skip-blank-lines: true
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#filename-format
    +        - name: filename-format
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "^[_a-z][_a-z0-9]*\\.go$"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#flag-parameter
    +        - name: flag-parameter
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-length
    +        - name: function-length
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [10, 0]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-result-limit
    +        - name: function-result-limit
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [3]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#get-return
    +        - name: get-return
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-branches
    +        - name: identical-branches
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-branches
    +        - name: identical-ifelseif-branches
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-conditions
    +        - name: identical-ifelseif-conditions
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-branches
    +        - name: identical-switch-branches
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-conditions
    +        - name: identical-switch-conditions
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#if-return
    +        - name: if-return
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-alias-naming
    +        - name: import-alias-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "^[a-z][a-z0-9]{0,}$"
    +            # Or this parameter:
    +            - allow-regex: "^[a-z][a-z0-9]{0,}$"
    +              deny-regex: '^v\d+$'
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-shadowing
    +        - name: import-shadowing
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#imports-blocklist
    +        - name: imports-blocklist
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "crypto/md5"
    +            - "crypto/sha1"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#increment-decrement
    +        - name: increment-decrement
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#indent-error-flow
    +        - name: indent-error-flow
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "preserve-scope"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#line-length-limit
    +        - name: line-length-limit
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [80]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-control-nesting
    +        - name: max-control-nesting
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [3]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-public-structs
    +        - name: max-public-structs
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments: [3]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-parameter
    +        - name: modifies-parameter
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-value-receiver
    +        - name: modifies-value-receiver
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#nested-structs
    +        - name: nested-structs
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#optimize-operands-order
    +        - name: optimize-operands-order
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-comments
    +        - name: package-comments
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-directory-mismatch
    +        - name: package-directory-mismatch
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - ignore-directories: ["testcases", "testinfo"]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range
    +        - name: range
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-address
    +        - name: range-val-address
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-in-closure
    +        - name: range-val-in-closure
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#receiver-naming
    +        - name: receiver-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - max-length: 2
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redefines-builtin-id
    +        - name: redefines-builtin-id
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-build-tag
    +        - name: redundant-build-tag
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-import-alias
    +        - name: redundant-import-alias
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-test-main-exit
    +        - name: redundant-test-main-exit
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-format
    +        - name: string-format
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - - 'core.WriteError[1].Message'
    +              - '/^([^A-Z]|$)/'
    +              - must not start with a capital letter
    +            - - 'fmt.Errorf[0]'
    +              - '/(^|[^\.!?])$/'
    +              - must not end in punctuation
    +            - - panic
    +              - '/^[^\n]*$/'
    +              - must not contain line breaks
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-of-int
    +        - name: string-of-int
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#struct-tag
    +        - name: struct-tag
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "json,inline"
    +            - "bson,outline,gnu"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#superfluous-else
    +        - name: superfluous-else
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "preserve-scope"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-date
    +        - name: time-date
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-equal
    +        - name: time-equal
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-naming
    +        - name: time-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unchecked-type-assertion
    +        - name: unchecked-type-assertion
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - accept-ignored-assertion-result: true
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unconditional-recursion
    +        - name: unconditional-recursion
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-naming
    +        - name: unexported-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-return
    +        - name: unexported-return
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unhandled-error
    +        - name: unhandled-error
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - "^fmt.Printf"
    +            - "myFunction"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-format
    +        - name: unnecessary-format
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-stmt
    +        - name: unnecessary-stmt
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unreachable-code
    +        - name: unreachable-code
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unsecure-url-scheme
    +        - name: unsecure-url-scheme
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-parameter
    +        - name: unused-parameter
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - allow-regex: "^_"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-receiver
    +        - name: unused-receiver
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - allow-regex: "^_"
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-any
    +        - name: use-any
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-errors-new
    +        - name: use-errors-new
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-fmt-print
    +        - name: use-fmt-print
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-waitgroup-go
    +        - name: use-waitgroup-go
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-break
    +        - name: useless-break
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-fallthrough
    +        - name: useless-fallthrough
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-declaration
    +        - name: var-declaration
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-naming
    +        - name: var-naming
    +          severity: warning
    +          disabled: false
    +          exclude: [""]
    +          arguments:
    +            - ["ID"] # AllowList
    +            - ["VM"] # DenyList
    +            - - skip-initialism-name-checks: true
    +                upper-case-const: true
    +                skip-package-name-checks: true
    +                extra-bad-package-names:
    +                  - helpers
    +                  - models
    +        # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#waitgroup-by-value
    +        - name: waitgroup-by-value
    +          severity: warning
    +          disabled: false
    +          exclude: [""]

    rowserrcheck +

    Checks whether Rows.Err of rows is checked successfully.

    Since golangci-lint v1.23.0
    +Repository

    linters:
    +  settings:
    +    rowserrcheck:
    +      # database/sql is always checked.
    +      # Default: []
    +      packages:
    +        - github.com/jmoiron/sqlx

    sloglint +

    Ensure consistent code style when using log/slog.

    Since golangci-lint v1.55.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    sloglint:
    +      # Enforce not mixing key-value pairs and attributes.
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-mixed-arguments
    +      # Default: true
    +      no-mixed-args: false
    +      # Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only).
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-value-pairs-only
    +      # Default: false
    +      kv-only: true
    +      # Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only).
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#attributes-only
    +      # Default: false
    +      attr-only: true
    +      # Enforce not using global loggers.
    +      # Values:
    +      # - "": disabled
    +      # - "all": report all global loggers
    +      # - "default": report only the default slog logger
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global
    +      # Default: ""
    +      no-global: "all"
    +      # Enforce using methods that accept a context.
    +      # Values:
    +      # - "": disabled
    +      # - "all": report all contextless calls
    +      # - "scope": report only if a context exists in the scope of the outermost function
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only
    +      # Default: ""
    +      context: "all"
    +      # Enforce using static values for log messages.
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#static-messages
    +      # Default: false
    +      static-msg: true
    +      # Enforce message style.
    +      # Values: lowercased, capitalized
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#message-style
    +      # Default: ""
    +      msg-style: capitalized
    +      # Enforce using constants instead of raw keys.
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-raw-keys
    +      # Default: false
    +      no-raw-keys: true
    +      # Enforce key naming convention.
    +      # Values: snake, kebab, camel, pascal
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-naming-convention
    +      # Default: ""
    +      key-naming-case: snake
    +      # Enforce not using specific keys.
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#forbidden-keys
    +      # Default: []
    +      forbidden-keys:
    +        - time
    +        - level
    +        - msg
    +        - source
    +        - foo
    +      # Enforce putting arguments on separate lines.
    +      # https://github.com/go-simpler/sloglint?tab=readme-ov-file#arguments-on-separate-lines
    +      # Default: false
    +      args-on-sep-lines: true

    spancheck +

    Checks for mistakes with OpenTelemetry/Census spans.

    Since golangci-lint v1.56.0
    +Repository

    linters:
    +  settings:
    +    spancheck:
    +      # Checks to enable.
    +      # Options include:
    +      # - `end`: check that `span.End()` is called
    +      # - `record-error`: check that `span.RecordError(err)` is called when an error is returned
    +      # - `set-status`: check that `span.SetStatus(codes.Error, msg)` is called when an error is returned
    +      # Default: ["end"]
    +      checks:
    +        - end
    +        - record-error
    +        - set-status
    +      # A list of regexes for function signatures that silence `record-error` and `set-status` reports
    +      # if found in the call path to a returned error.
    +      # https://github.com/jjti/go-spancheck#ignore-check-signatures
    +      # Default: []
    +      ignore-check-signatures:
    +        - "telemetry.RecordError"
    +      # A list of regexes for additional function signatures that create spans.
    +      # This is useful if you have a utility method to create spans.
    +      # Each entry should be of the form `<regex>:<telemetry-type>`, where `telemetry-type` can be `opentelemetry` or `opencensus`.
    +      # https://github.com/jjti/go-spancheck#extra-start-span-signatures
    +      # Default: []
    +      extra-start-span-signatures:
    +        - "github.com/user/repo/telemetry/trace.Start:opentelemetry"

    sqlclosecheck +

    Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed.

    Since golangci-lint v1.28.0
    +Repository

    No settings available.

    staticcheck +

    It's the set of rules from staticcheck.

    Since golangci-lint v1.0.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    staticcheck:
    +      # https://staticcheck.dev/docs/configuration/options/#dot_import_whitelist
    +      # Default: ["github.com/mmcloughlin/avo/build", "github.com/mmcloughlin/avo/operand", "github.com/mmcloughlin/avo/reg"]
    +      dot-import-whitelist:
    +        - fmt
    +      # https://staticcheck.dev/docs/configuration/options/#initialisms
    +      # Default: ["ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "QPS", "RAM", "RPC", "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "GID", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", "XSS", "SIP", "RTP", "AMQP", "DB", "TS"]
    +      initialisms: ["ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "QPS", "RAM", "RPC", "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "GID", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", "XSS", "SIP", "RTP", "AMQP", "DB", "TS"]
    +      # https://staticcheck.dev/docs/configuration/options/#http_status_code_whitelist
    +      # Default: ["200", "400", "404", "500"]
    +      http-status-code-whitelist: ["200", "400", "404", "500"]
    +      # SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks
    +      # Example (to disable some checks): [ "all", "-SA1000", "-SA1001"]
    +      # Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks.
    +      # Default: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022"]
    +      checks:
    +        # Invalid regular expression.
    +        # https://staticcheck.dev/docs/checks/#SA1000
    +        - SA1000
    +        # Invalid template.
    +        # https://staticcheck.dev/docs/checks/#SA1001
    +        - SA1001
    +        # Invalid format in 'time.Parse'.
    +        # https://staticcheck.dev/docs/checks/#SA1002
    +        - SA1002
    +        # Unsupported argument to functions in 'encoding/binary'.
    +        # https://staticcheck.dev/docs/checks/#SA1003
    +        - SA1003
    +        # Suspiciously small untyped constant in 'time.Sleep'.
    +        # https://staticcheck.dev/docs/checks/#SA1004
    +        - SA1004
    +        # Invalid first argument to 'exec.Command'.
    +        # https://staticcheck.dev/docs/checks/#SA1005
    +        - SA1005
    +        # 'Printf' with dynamic first argument and no further arguments.
    +        # https://staticcheck.dev/docs/checks/#SA1006
    +        - SA1006
    +        # Invalid URL in 'net/url.Parse'.
    +        # https://staticcheck.dev/docs/checks/#SA1007
    +        - SA1007
    +        # Non-canonical key in 'http.Header' map.
    +        # https://staticcheck.dev/docs/checks/#SA1008
    +        - SA1008
    +        # '(*regexp.Regexp).FindAll' called with 'n == 0', which will always return zero results.
    +        # https://staticcheck.dev/docs/checks/#SA1010
    +        - SA1010
    +        # Various methods in the "strings" package expect valid UTF-8, but invalid input is provided.
    +        # https://staticcheck.dev/docs/checks/#SA1011
    +        - SA1011
    +        # A nil 'context.Context' is being passed to a function, consider using 'context.TODO' instead.
    +        # https://staticcheck.dev/docs/checks/#SA1012
    +        - SA1012
    +        # 'io.Seeker.Seek' is being called with the whence constant as the first argument, but it should be the second.
    +        # https://staticcheck.dev/docs/checks/#SA1013
    +        - SA1013
    +        # Non-pointer value passed to 'Unmarshal' or 'Decode'.
    +        # https://staticcheck.dev/docs/checks/#SA1014
    +        - SA1014
    +        # Using 'time.Tick' in a way that will leak. Consider using 'time.NewTicker', and only use 'time.Tick' in tests, commands and endless functions.
    +        # https://staticcheck.dev/docs/checks/#SA1015
    +        - SA1015
    +        # Trapping a signal that cannot be trapped.
    +        # https://staticcheck.dev/docs/checks/#SA1016
    +        - SA1016
    +        # Channels used with 'os/signal.Notify' should be buffered.
    +        # https://staticcheck.dev/docs/checks/#SA1017
    +        - SA1017
    +        # 'strings.Replace' called with 'n == 0', which does nothing.
    +        # https://staticcheck.dev/docs/checks/#SA1018
    +        - SA1018
    +        # Using a deprecated function, variable, constant or field.
    +        # https://staticcheck.dev/docs/checks/#SA1019
    +        - SA1019
    +        # Using an invalid host:port pair with a 'net.Listen'-related function.
    +        # https://staticcheck.dev/docs/checks/#SA1020
    +        - SA1020
    +        # Using 'bytes.Equal' to compare two 'net.IP'.
    +        # https://staticcheck.dev/docs/checks/#SA1021
    +        - SA1021
    +        # Modifying the buffer in an 'io.Writer' implementation.
    +        # https://staticcheck.dev/docs/checks/#SA1023
    +        - SA1023
    +        # A string cutset contains duplicate characters.
    +        # https://staticcheck.dev/docs/checks/#SA1024
    +        - SA1024
    +        # It is not possible to use '(*time.Timer).Reset''s return value correctly.
    +        # https://staticcheck.dev/docs/checks/#SA1025
    +        - SA1025
    +        # Cannot marshal channels or functions.
    +        # https://staticcheck.dev/docs/checks/#SA1026
    +        - SA1026
    +        # Atomic access to 64-bit variable must be 64-bit aligned.
    +        # https://staticcheck.dev/docs/checks/#SA1027
    +        - SA1027
    +        # 'sort.Slice' can only be used on slices.
    +        # https://staticcheck.dev/docs/checks/#SA1028
    +        - SA1028
    +        # Inappropriate key in call to 'context.WithValue'.
    +        # https://staticcheck.dev/docs/checks/#SA1029
    +        - SA1029
    +        # Invalid argument in call to a 'strconv' function.
    +        # https://staticcheck.dev/docs/checks/#SA1030
    +        - SA1030
    +        # Overlapping byte slices passed to an encoder.
    +        # https://staticcheck.dev/docs/checks/#SA1031
    +        - SA1031
    +        # Wrong order of arguments to 'errors.Is'.
    +        # https://staticcheck.dev/docs/checks/#SA1032
    +        - SA1032
    +        # 'sync.WaitGroup.Add' called inside the goroutine, leading to a race condition.
    +        # https://staticcheck.dev/docs/checks/#SA2000
    +        - SA2000
    +        # Empty critical section, did you mean to defer the unlock?.
    +        # https://staticcheck.dev/docs/checks/#SA2001
    +        - SA2001
    +        # Called 'testing.T.FailNow' or 'SkipNow' in a goroutine, which isn't allowed.
    +        # https://staticcheck.dev/docs/checks/#SA2002
    +        - SA2002
    +        # Deferred 'Lock' right after locking, likely meant to defer 'Unlock' instead.
    +        # https://staticcheck.dev/docs/checks/#SA2003
    +        - SA2003
    +        # 'TestMain' doesn't call 'os.Exit', hiding test failures.
    +        # https://staticcheck.dev/docs/checks/#SA3000
    +        - SA3000
    +        # Assigning to 'b.N' in benchmarks distorts the results.
    +        # https://staticcheck.dev/docs/checks/#SA3001
    +        - SA3001
    +        # Binary operator has identical expressions on both sides.
    +        # https://staticcheck.dev/docs/checks/#SA4000
    +        - SA4000
    +        # '&*x' gets simplified to 'x', it does not copy 'x'.
    +        # https://staticcheck.dev/docs/checks/#SA4001
    +        - SA4001
    +        # Comparing unsigned values against negative values is pointless.
    +        # https://staticcheck.dev/docs/checks/#SA4003
    +        - SA4003
    +        # The loop exits unconditionally after one iteration.
    +        # https://staticcheck.dev/docs/checks/#SA4004
    +        - SA4004
    +        # Field assignment that will never be observed. Did you mean to use a pointer receiver?.
    +        # https://staticcheck.dev/docs/checks/#SA4005
    +        - SA4005
    +        # A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?.
    +        # https://staticcheck.dev/docs/checks/#SA4006
    +        - SA4006
    +        # The variable in the loop condition never changes, are you incrementing the wrong variable?.
    +        # https://staticcheck.dev/docs/checks/#SA4008
    +        - SA4008
    +        # A function argument is overwritten before its first use.
    +        # https://staticcheck.dev/docs/checks/#SA4009
    +        - SA4009
    +        # The result of 'append' will never be observed anywhere.
    +        # https://staticcheck.dev/docs/checks/#SA4010
    +        - SA4010
    +        # Break statement with no effect. Did you mean to break out of an outer loop?.
    +        # https://staticcheck.dev/docs/checks/#SA4011
    +        - SA4011
    +        # Comparing a value against NaN even though no value is equal to NaN.
    +        # https://staticcheck.dev/docs/checks/#SA4012
    +        - SA4012
    +        # Negating a boolean twice ('!!b') is the same as writing 'b'. This is either redundant, or a typo.
    +        # https://staticcheck.dev/docs/checks/#SA4013
    +        - SA4013
    +        # An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either.
    +        # https://staticcheck.dev/docs/checks/#SA4014
    +        - SA4014
    +        # Calling functions like 'math.Ceil' on floats converted from integers doesn't do anything useful.
    +        # https://staticcheck.dev/docs/checks/#SA4015
    +        - SA4015
    +        # Certain bitwise operations, such as 'x ^ 0', do not do anything useful.
    +        # https://staticcheck.dev/docs/checks/#SA4016
    +        - SA4016
    +        # Discarding the return values of a function without side effects, making the call pointless.
    +        # https://staticcheck.dev/docs/checks/#SA4017
    +        - SA4017
    +        # Self-assignment of variables.
    +        # https://staticcheck.dev/docs/checks/#SA4018
    +        - SA4018
    +        # Multiple, identical build constraints in the same file.
    +        # https://staticcheck.dev/docs/checks/#SA4019
    +        - SA4019
    +        # Unreachable case clause in a type switch.
    +        # https://staticcheck.dev/docs/checks/#SA4020
    +        - SA4020
    +        # "x = append(y)" is equivalent to "x = y".
    +        # https://staticcheck.dev/docs/checks/#SA4021
    +        - SA4021
    +        # Comparing the address of a variable against nil.
    +        # https://staticcheck.dev/docs/checks/#SA4022
    +        - SA4022
    +        # Impossible comparison of interface value with untyped nil.
    +        # https://staticcheck.dev/docs/checks/#SA4023
    +        - SA4023
    +        # Checking for impossible return value from a builtin function.
    +        # https://staticcheck.dev/docs/checks/#SA4024
    +        - SA4024
    +        # Integer division of literals that results in zero.
    +        # https://staticcheck.dev/docs/checks/#SA4025
    +        - SA4025
    +        # Go constants cannot express negative zero.
    +        # https://staticcheck.dev/docs/checks/#SA4026
    +        - SA4026
    +        # '(*net/url.URL).Query' returns a copy, modifying it doesn't change the URL.
    +        # https://staticcheck.dev/docs/checks/#SA4027
    +        - SA4027
    +        # 'x % 1' is always zero.
    +        # https://staticcheck.dev/docs/checks/#SA4028
    +        - SA4028
    +        # Ineffective attempt at sorting slice.
    +        # https://staticcheck.dev/docs/checks/#SA4029
    +        - SA4029
    +        # Ineffective attempt at generating random number.
    +        # https://staticcheck.dev/docs/checks/#SA4030
    +        - SA4030
    +        # Checking never-nil value against nil.
    +        # https://staticcheck.dev/docs/checks/#SA4031
    +        - SA4031
    +        # Comparing 'runtime.GOOS' or 'runtime.GOARCH' against impossible value.
    +        # https://staticcheck.dev/docs/checks/#SA4032
    +        - SA4032
    +        # Assignment to nil map.
    +        # https://staticcheck.dev/docs/checks/#SA5000
    +        - SA5000
    +        # Deferring 'Close' before checking for a possible error.
    +        # https://staticcheck.dev/docs/checks/#SA5001
    +        - SA5001
    +        # The empty for loop ("for {}") spins and can block the scheduler.
    +        # https://staticcheck.dev/docs/checks/#SA5002
    +        - SA5002
    +        # Defers in infinite loops will never execute.
    +        # https://staticcheck.dev/docs/checks/#SA5003
    +        - SA5003
    +        # "for { select { ..." with an empty default branch spins.
    +        # https://staticcheck.dev/docs/checks/#SA5004
    +        - SA5004
    +        # The finalizer references the finalized object, preventing garbage collection.
    +        # https://staticcheck.dev/docs/checks/#SA5005
    +        - SA5005
    +        # Infinite recursive call.
    +        # https://staticcheck.dev/docs/checks/#SA5007
    +        - SA5007
    +        # Invalid struct tag.
    +        # https://staticcheck.dev/docs/checks/#SA5008
    +        - SA5008
    +        # Invalid Printf call.
    +        # https://staticcheck.dev/docs/checks/#SA5009
    +        - SA5009
    +        # Impossible type assertion.
    +        # https://staticcheck.dev/docs/checks/#SA5010
    +        - SA5010
    +        # Possible nil pointer dereference.
    +        # https://staticcheck.dev/docs/checks/#SA5011
    +        - SA5011
    +        # Passing odd-sized slice to function expecting even size.
    +        # https://staticcheck.dev/docs/checks/#SA5012
    +        - SA5012
    +        # Using 'regexp.Match' or related in a loop, should use 'regexp.Compile'.
    +        # https://staticcheck.dev/docs/checks/#SA6000
    +        - SA6000
    +        # Missing an optimization opportunity when indexing maps by byte slices.
    +        # https://staticcheck.dev/docs/checks/#SA6001
    +        - SA6001
    +        # Storing non-pointer values in 'sync.Pool' allocates memory.
    +        # https://staticcheck.dev/docs/checks/#SA6002
    +        - SA6002
    +        # Converting a string to a slice of runes before ranging over it.
    +        # https://staticcheck.dev/docs/checks/#SA6003
    +        - SA6003
    +        # Inefficient string comparison with 'strings.ToLower' or 'strings.ToUpper'.
    +        # https://staticcheck.dev/docs/checks/#SA6005
    +        - SA6005
    +        # Using io.WriteString to write '[]byte'.
    +        # https://staticcheck.dev/docs/checks/#SA6006
    +        - SA6006
    +        # Defers in range loops may not run when you expect them to.
    +        # https://staticcheck.dev/docs/checks/#SA9001
    +        - SA9001
    +        # Using a non-octal 'os.FileMode' that looks like it was meant to be in octal.
    +        # https://staticcheck.dev/docs/checks/#SA9002
    +        - SA9002
    +        # Empty body in an if or else branch.
    +        # https://staticcheck.dev/docs/checks/#SA9003
    +        - SA9003
    +        # Only the first constant has an explicit type.
    +        # https://staticcheck.dev/docs/checks/#SA9004
    +        - SA9004
    +        # Trying to marshal a struct with no public fields nor custom marshaling.
    +        # https://staticcheck.dev/docs/checks/#SA9005
    +        - SA9005
    +        # Dubious bit shifting of a fixed size integer value.
    +        # https://staticcheck.dev/docs/checks/#SA9006
    +        - SA9006
    +        # Deleting a directory that shouldn't be deleted.
    +        # https://staticcheck.dev/docs/checks/#SA9007
    +        - SA9007
    +        # 'else' branch of a type assertion is probably not reading the right value.
    +        # https://staticcheck.dev/docs/checks/#SA9008
    +        - SA9008
    +        # Ineffectual Go compiler directive.
    +        # https://staticcheck.dev/docs/checks/#SA9009
    +        - SA9009
    +        # Incorrect or missing package comment.
    +        # https://staticcheck.dev/docs/checks/#ST1000
    +        - ST1000
    +        # Dot imports are discouraged.
    +        # https://staticcheck.dev/docs/checks/#ST1001
    +        - ST1001
    +        # Poorly chosen identifier.
    +        # https://staticcheck.dev/docs/checks/#ST1003
    +        - ST1003
    +        # Incorrectly formatted error string.
    +        # https://staticcheck.dev/docs/checks/#ST1005
    +        - ST1005
    +        # Poorly chosen receiver name.
    +        # https://staticcheck.dev/docs/checks/#ST1006
    +        - ST1006
    +        # A function's error value should be its last return value.
    +        # https://staticcheck.dev/docs/checks/#ST1008
    +        - ST1008
    +        # Poorly chosen name for variable of type 'time.Duration'.
    +        # https://staticcheck.dev/docs/checks/#ST1011
    +        - ST1011
    +        # Poorly chosen name for error variable.
    +        # https://staticcheck.dev/docs/checks/#ST1012
    +        - ST1012
    +        # Should use constants for HTTP error codes, not magic numbers.
    +        # https://staticcheck.dev/docs/checks/#ST1013
    +        - ST1013
    +        # A switch's default case should be the first or last case.
    +        # https://staticcheck.dev/docs/checks/#ST1015
    +        - ST1015
    +        # Use consistent method receiver names.
    +        # https://staticcheck.dev/docs/checks/#ST1016
    +        - ST1016
    +        # Don't use Yoda conditions.
    +        # https://staticcheck.dev/docs/checks/#ST1017
    +        - ST1017
    +        # Avoid zero-width and control characters in string literals.
    +        # https://staticcheck.dev/docs/checks/#ST1018
    +        - ST1018
    +        # Importing the same package multiple times.
    +        # https://staticcheck.dev/docs/checks/#ST1019
    +        - ST1019
    +        # The documentation of an exported function should start with the function's name.
    +        # https://staticcheck.dev/docs/checks/#ST1020
    +        - ST1020
    +        # The documentation of an exported type should start with type's name.
    +        # https://staticcheck.dev/docs/checks/#ST1021
    +        - ST1021
    +        # The documentation of an exported variable or constant should start with variable's name.
    +        # https://staticcheck.dev/docs/checks/#ST1022
    +        - ST1022
    +        # Redundant type in variable declaration.
    +        # https://staticcheck.dev/docs/checks/#ST1023
    +        - ST1023
    +        # Use plain channel send or receive instead of single-case select.
    +        # https://staticcheck.dev/docs/checks/#S1000
    +        - S1000
    +        # Replace for loop with call to copy.
    +        # https://staticcheck.dev/docs/checks/#S1001
    +        - S1001
    +        # Omit comparison with boolean constant.
    +        # https://staticcheck.dev/docs/checks/#S1002
    +        - S1002
    +        # Replace call to 'strings.Index' with 'strings.Contains'.
    +        # https://staticcheck.dev/docs/checks/#S1003
    +        - S1003
    +        # Replace call to 'bytes.Compare' with 'bytes.Equal'.
    +        # https://staticcheck.dev/docs/checks/#S1004
    +        - S1004
    +        # Drop unnecessary use of the blank identifier.
    +        # https://staticcheck.dev/docs/checks/#S1005
    +        - S1005
    +        # Use "for { ... }" for infinite loops.
    +        # https://staticcheck.dev/docs/checks/#S1006
    +        - S1006
    +        # Simplify regular expression by using raw string literal.
    +        # https://staticcheck.dev/docs/checks/#S1007
    +        - S1007
    +        # Simplify returning boolean expression.
    +        # https://staticcheck.dev/docs/checks/#S1008
    +        - S1008
    +        # Omit redundant nil check on slices, maps, and channels.
    +        # https://staticcheck.dev/docs/checks/#S1009
    +        - S1009
    +        # Omit default slice index.
    +        # https://staticcheck.dev/docs/checks/#S1010
    +        - S1010
    +        # Use a single 'append' to concatenate two slices.
    +        # https://staticcheck.dev/docs/checks/#S1011
    +        - S1011
    +        # Replace 'time.Now().Sub(x)' with 'time.Since(x)'.
    +        # https://staticcheck.dev/docs/checks/#S1012
    +        - S1012
    +        # Use a type conversion instead of manually copying struct fields.
    +        # https://staticcheck.dev/docs/checks/#S1016
    +        - S1016
    +        # Replace manual trimming with 'strings.TrimPrefix'.
    +        # https://staticcheck.dev/docs/checks/#S1017
    +        - S1017
    +        # Use "copy" for sliding elements.
    +        # https://staticcheck.dev/docs/checks/#S1018
    +        - S1018
    +        # Simplify "make" call by omitting redundant arguments.
    +        # https://staticcheck.dev/docs/checks/#S1019
    +        - S1019
    +        # Omit redundant nil check in type assertion.
    +        # https://staticcheck.dev/docs/checks/#S1020
    +        - S1020
    +        # Merge variable declaration and assignment.
    +        # https://staticcheck.dev/docs/checks/#S1021
    +        - S1021
    +        # Omit redundant control flow.
    +        # https://staticcheck.dev/docs/checks/#S1023
    +        - S1023
    +        # Replace 'x.Sub(time.Now())' with 'time.Until(x)'.
    +        # https://staticcheck.dev/docs/checks/#S1024
    +        - S1024
    +        # Don't use 'fmt.Sprintf("%s", x)' unnecessarily.
    +        # https://staticcheck.dev/docs/checks/#S1025
    +        - S1025
    +        # Simplify error construction with 'fmt.Errorf'.
    +        # https://staticcheck.dev/docs/checks/#S1028
    +        - S1028
    +        # Range over the string directly.
    +        # https://staticcheck.dev/docs/checks/#S1029
    +        - S1029
    +        # Use 'bytes.Buffer.String' or 'bytes.Buffer.Bytes'.
    +        # https://staticcheck.dev/docs/checks/#S1030
    +        - S1030
    +        # Omit redundant nil check around loop.
    +        # https://staticcheck.dev/docs/checks/#S1031
    +        - S1031
    +        # Use 'sort.Ints(x)', 'sort.Float64s(x)', and 'sort.Strings(x)'.
    +        # https://staticcheck.dev/docs/checks/#S1032
    +        - S1032
    +        # Unnecessary guard around call to "delete".
    +        # https://staticcheck.dev/docs/checks/#S1033
    +        - S1033
    +        # Use result of type assertion to simplify cases.
    +        # https://staticcheck.dev/docs/checks/#S1034
    +        - S1034
    +        # Redundant call to 'net/http.CanonicalHeaderKey' in method call on 'net/http.Header'.
    +        # https://staticcheck.dev/docs/checks/#S1035
    +        - S1035
    +        # Unnecessary guard around map access.
    +        # https://staticcheck.dev/docs/checks/#S1036
    +        - S1036
    +        # Elaborate way of sleeping.
    +        # https://staticcheck.dev/docs/checks/#S1037
    +        - S1037
    +        # Unnecessarily complex way of printing formatted string.
    +        # https://staticcheck.dev/docs/checks/#S1038
    +        - S1038
    +        # Unnecessary use of 'fmt.Sprint'.
    +        # https://staticcheck.dev/docs/checks/#S1039
    +        - S1039
    +        # Type assertion to current type.
    +        # https://staticcheck.dev/docs/checks/#S1040
    +        - S1040
    +        # Apply De Morgan's law.
    +        # https://staticcheck.dev/docs/checks/#QF1001
    +        - QF1001
    +        # Convert untagged switch to tagged switch.
    +        # https://staticcheck.dev/docs/checks/#QF1002
    +        - QF1002
    +        # Convert if/else-if chain to tagged switch.
    +        # https://staticcheck.dev/docs/checks/#QF1003
    +        - QF1003
    +        # Use 'strings.ReplaceAll' instead of 'strings.Replace' with 'n == -1'.
    +        # https://staticcheck.dev/docs/checks/#QF1004
    +        - QF1004
    +        # Expand call to 'math.Pow'.
    +        # https://staticcheck.dev/docs/checks/#QF1005
    +        - QF1005
    +        # Lift 'if'+'break' into loop condition.
    +        # https://staticcheck.dev/docs/checks/#QF1006
    +        - QF1006
    +        # Merge conditional assignment into variable declaration.
    +        # https://staticcheck.dev/docs/checks/#QF1007
    +        - QF1007
    +        # Omit embedded fields from selector expression.
    +        # https://staticcheck.dev/docs/checks/#QF1008
    +        - QF1008
    +        # Use 'time.Time.Equal' instead of '==' operator.
    +        # https://staticcheck.dev/docs/checks/#QF1009
    +        - QF1009
    +        # Convert slice of bytes to string when printing it.
    +        # https://staticcheck.dev/docs/checks/#QF1010
    +        - QF1010
    +        # Omit redundant type from variable declaration.
    +        # https://staticcheck.dev/docs/checks/#QF1011
    +        - QF1011
    +        # Use 'fmt.Fprintf(x, ...)' instead of 'x.Write(fmt.Sprintf(...))'.
    +        # https://staticcheck.dev/docs/checks/#QF1012
    +        - QF1012

    tagalign +

    Check that struct tags are well aligned.

    Since golangci-lint v1.53.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    tagalign:
    +      # Align and sort can be used together or separately.
    +      #
    +      # Whether enable align. If true, the struct tags will be aligned.
    +      # E.g.:
    +      # type FooBar struct {
    +      #     Bar    string `json:"bar" validate:"required"`
    +      #     FooFoo int8   `json:"foo_foo" validate:"required"`
    +      # }
    +      # will be formatted to:
    +      # type FooBar struct {
    +      #     Bar    string `json:"bar"     validate:"required"`
    +      #     FooFoo int8   `json:"foo_foo" validate:"required"`
    +      # }
    +      # Default: true.
    +      align: false
    +      # Whether enable tags sort.
    +      # If true, the tags will be sorted by name in ascending order.
    +      # E.g.: `xml:"bar" json:"bar" validate:"required"` -> `json:"bar" validate:"required" xml:"bar"`.
    +      # Default: true
    +      sort: false
    +      # Specify the order of tags, the other tags will be sorted by name.
    +      # This option will be ignored if `sort` is false.
    +      # Default: []
    +      order:
    +        - json
    +        - yaml
    +        - yml
    +        - toml
    +        - mapstructure
    +        - binding
    +        - validate
    +      # Whether enable strict style.
    +      # In this style, the tags will be sorted and aligned in the dictionary order,
    +      # and the tags with the same name will be aligned together.
    +      # Note: This option will be ignored if 'align' or 'sort' is false.
    +      # Default: false
    +      strict: true

    tagliatelle +

    Checks the struct tags.

    Since golangci-lint v1.40.0
    +Repository

    linters:
    +  settings:
    +    tagliatelle:
    +      # Checks the struct tag name case.
    +      case:
    +        # Defines the association between tag name and case.
    +        # Any struct tag name can be used.
    +        # Supported string cases:
    +        # - `camel`
    +        # - `pascal`
    +        # - `kebab`
    +        # - `snake`
    +        # - `upperSnake`
    +        # - `goCamel`
    +        # - `goPascal`
    +        # - `goKebab`
    +        # - `goSnake`
    +        # - `upper`
    +        # - `lower`
    +        # - `header`
    +        rules:
    +          json: camel
    +          yaml: camel
    +          xml: camel
    +          toml: camel
    +          bson: camel
    +          avro: snake
    +          mapstructure: kebab
    +          env: upperSnake
    +          envconfig: upperSnake
    +          whatever: snake
    +        # Defines the association between tag name and case.
    +        # Important: the `extended-rules` overrides `rules`.
    +        # Default: empty
    +        extended-rules:
    +          json:
    +            # Supported string cases:
    +            # - `camel`
    +            # - `pascal`
    +            # - `kebab`
    +            # - `snake`
    +            # - `upperSnake`
    +            # - `goCamel`
    +            # - `goPascal`
    +            # - `goKebab`
    +            # - `goSnake`
    +            # - `header`
    +            # - `lower`
    +            # - `header`
    +            #
    +            # Required
    +            case: camel
    +            # Adds 'AMQP', 'DB', 'GID', 'RTP', 'SIP', 'TS' to initialisms,
    +            # and removes 'LHS', 'RHS' from initialisms.
    +            # Default: false
    +            extra-initialisms: true
    +            # Defines initialism additions and overrides.
    +            # Default: empty
    +            initialism-overrides:
    +              DB: true # add a new initialism
    +              LHS: false # disable a default initialism.
    +              # ...
    +        # Uses the struct field name to check the name of the struct tag.
    +        # Default: false
    +        use-field-name: true
    +        # The field names to ignore.
    +        # Default: []
    +        ignored-fields:
    +          - Bar
    +          - Foo
    +        # Overrides the default/root configuration.
    +        # Default: []
    +        overrides:
    +          - # The package path (uses `/` only as a separator).
    +            # Required
    +            pkg: foo/bar
    +            # Default: empty or the same as the default/root configuration.
    +            rules:
    +              json: snake
    +              xml: pascal
    +            # Default: empty or the same as the default/root configuration.
    +            extended-rules:
    +            # Same options as the base `extended-rules`.
    +            # Default: false (WARNING: it doesn't follow the default/root configuration)
    +            use-field-name: true
    +            # The field names to ignore.
    +            # Default: [] or the same as the default/root configuration.
    +            ignored-fields:
    +              - Bar
    +              - Foo
    +            # Ignore the package (takes precedence over all other configurations).
    +            # Default: false
    +            ignore: true

    testableexamples +

    Linter checks if examples are testable (have an expected output).

    Since golangci-lint v1.50.0
    +Repository

    No settings available.

    testifylint +

    Checks usage of github.com/stretchr/testify.

    Since golangci-lint v1.55.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    testifylint:
    +      # Enable all checkers (https://github.com/Antonboom/testifylint#checkers).
    +      # Default: false
    +      enable-all: true
    +      # Disable checkers by name
    +      # (in addition to default
    +      #   suite-thelper
    +      # ).
    +      disable:
    +        - blank-import
    +        - bool-compare
    +        - compares
    +        - contains
    +        - empty
    +        - encoded-compare
    +        - equal-values
    +        - error-is-as
    +        - error-nil
    +        - expected-actual
    +        - float-compare
    +        - formatter
    +        - go-require
    +        - len
    +        - negative-positive
    +        - nil-compare
    +        - regexp
    +        - require-error
    +        - suite-broken-parallel
    +        - suite-dont-use-pkg
    +        - suite-extra-assert-call
    +        - suite-method-signature
    +        - suite-subtest-run
    +        - suite-thelper
    +        - useless-assert
    +      # Disable all checkers (https://github.com/Antonboom/testifylint#checkers).
    +      # Default: false
    +      disable-all: true
    +      # Enable checkers by name
    +      # (in addition to default
    +      #   blank-import, bool-compare, compares, contains, empty, encoded-compare, equal-values, error-is-as, error-nil,
    +      #   expected-actual, go-require, float-compare, formatter, len, negative-positive, nil-compare, regexp, require-error,
    +      #   suite-broken-parallel, suite-dont-use-pkg, suite-extra-assert-call, suite-subtest-run, suite-method-signature,
    +      #   useless-assert
    +      # ).
    +      enable:
    +        - blank-import
    +        - bool-compare
    +        - compares
    +        - contains
    +        - empty
    +        - encoded-compare
    +        - equal-values
    +        - error-is-as
    +        - error-nil
    +        - expected-actual
    +        - float-compare
    +        - formatter
    +        - go-require
    +        - len
    +        - negative-positive
    +        - nil-compare
    +        - regexp
    +        - require-error
    +        - suite-broken-parallel
    +        - suite-dont-use-pkg
    +        - suite-extra-assert-call
    +        - suite-method-signature
    +        - suite-subtest-run
    +        - suite-thelper
    +        - useless-assert
    +      bool-compare:
    +        # To ignore user defined types (over builtin bool).
    +        # Default: false
    +        ignore-custom-types: true
    +      expected-actual:
    +        # Regexp for expected variable name.
    +        # Default: (^(exp(ected)?|want(ed)?)([A-Z]\w*)?$)|(^(\w*[a-z])?(Exp(ected)?|Want(ed)?)$)
    +        pattern: ^expected
    +      formatter:
    +        # To enable go vet's printf checks.
    +        # Default: true
    +        check-format-string: false
    +        # To require f-assertions (e.g. `assert.Equalf`) if format string is used, even if there are no variable-length
    +        # variables, i.e. it requires `require.NoErrorf` for both these cases:
    +        # - require.NoErrorf(t, err, "unexpected error")
    +        # - require.NoErrorf(t, err, "unexpected error for sid: %v", sid)
    +        # To understand this behavior, please read the
    +        # https://github.com/Antonboom/testifylint?tab=readme-ov-file#historical-reference-of-formatter.
    +        # Default: false
    +        require-f-funcs: true
    +        # To require that the first element of msgAndArgs (msg) has a string type.
    +        # For example, in such case assertion like `assert.True(t, b, tt.case)` will be considered as invalid.
    +        # Default: true
    +        require-string-msg: false
    +      go-require:
    +        # To ignore HTTP handlers (like http.HandlerFunc).
    +        # Default: false
    +        ignore-http-handlers: true
    +      require-error:
    +        # Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.
    +        # Default: ""
    +        fn-pattern: ^(Errorf?|NoErrorf?)$
    +      suite-extra-assert-call:
    +        # To require or remove extra Assert() call?
    +        # Default: remove
    +        mode: require

    testpackage +

    Linter that makes you use a separate _test package.

    Since golangci-lint v1.25.0
    +Repository

    linters:
    +  settings:
    +    testpackage:
    +      # Regexp pattern to skip files.
    +      # Default: "(export|internal)_test\\.go"
    +      skip-regexp: (export|internal)_test\.go
    +      # List of packages that don't end with _test that tests are allowed to be in.
    +      # Default: "main"
    +      allow-packages:
    +        - example
    +        - main

    thelper +

    Thelper detects tests helpers which do not start with the t.Helper() method.

    Since golangci-lint v1.34.0
    +Repository

    linters:
    +  settings:
    +    thelper:
    +      test:
    +        # Check *testing.T is first param (or after context.Context) of helper function.
    +        # Default: true
    +        first: false
    +        # Check *testing.T param has name t.
    +        # Default: true
    +        name: false
    +        # Check t.Helper() begins helper function.
    +        # Default: true
    +        begin: false
    +      benchmark:
    +        # Check *testing.B is first param (or after context.Context) of helper function.
    +        # Default: true
    +        first: false
    +        # Check *testing.B param has name b.
    +        # Default: true
    +        name: false
    +        # Check b.Helper() begins helper function.
    +        # Default: true
    +        begin: false
    +      tb:
    +        # Check *testing.TB is first param (or after context.Context) of helper function.
    +        # Default: true
    +        first: false
    +        # Check *testing.TB param has name tb.
    +        # Default: true
    +        name: false
    +        # Check tb.Helper() begins helper function.
    +        # Default: true
    +        begin: false
    +      fuzz:
    +        # Check *testing.F is first param (or after context.Context) of helper function.
    +        # Default: true
    +        first: false
    +        # Check *testing.F param has name f.
    +        # Default: true
    +        name: false
    +        # Check f.Helper() begins helper function.
    +        # Default: true
    +        begin: false

    tparallel +

    Tparallel detects inappropriate usage of t.Parallel() method in your Go test codes.

    Since golangci-lint v1.32.0
    +Repository

    No settings available.

    unconvert +

    Remove unnecessary type conversions.

    Since golangci-lint v1.0.0
    +Repository

    linters:
    +  settings:
    +    unconvert:
    +      # Remove conversions that force intermediate rounding.
    +      # Default: false
    +      fast-math: true
    +      # Be more conservative (experimental).
    +      # Default: false
    +      safe: true

    unparam +

    Reports unused function parameters.

    Since golangci-lint v1.9.0
    +Repository

    linters:
    +  settings:
    +    unparam:
    +      # Inspect exported functions.
    +      #
    +      # Set to true if no external program/library imports your code.
    +      # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:
    +      # if it's called for subdir of a project it can't find external interfaces. All text editor integrations
    +      # with golangci-lint call it on a directory with the changed file.
    +      #
    +      # Default: false
    +      check-exported: true

    unqueryvet +

    Detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection.

    Since golangci-lint v2.5.0
    New
    +Repository

    linters:
    +  settings:
    +    unqueryvet:
    +      # Enable SQL builder checking.
    +      # Default: true
    +      check-sql-builders: false
    +      # Regex patterns for acceptable SELECT * usage.
    +      # Default:
    +      # - "SELECT \\* FROM information_schema\\..*"
    +      # - "SELECT \\* FROM pg_catalog\\..*"
    +      # - "SELECT COUNT\\(\\*\\)"
    +      # - "SELECT MAX\\(\\*\\)"
    +      # - "SELECT MIN\\(\\*\\)"
    +      allowed-patterns:
    +        - "SELECT \\* FROM temp_.*"
    +        - "SELECT \\* FROM.*-- migration"

    unused +

    Checks Go code for unused constants, variables, functions and types.

    Since golangci-lint v1.20.0
    +Repository

    linters:
    +  settings:
    +    unused:
    +      # Mark all struct fields that have been written to as used.
    +      # Default: true
    +      field-writes-are-uses: false
    +      # Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write.
    +      # Default: false
    +      post-statements-are-reads: true
    +      # Mark all exported fields as used.
    +      # default: true
    +      exported-fields-are-used: false
    +      # Mark all function parameters as used.
    +      # default: true
    +      parameters-are-used: false
    +      # Mark all local variables as used.
    +      # default: true
    +      local-variables-are-used: false
    +      # Mark all identifiers inside generated files as used.
    +      # Default: true
    +      generated-is-used: false

    usestdlibvars +

    A linter that detect the possibility to use variables/constants from the Go standard library.

    Since golangci-lint v1.48.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    usestdlibvars:
    +      # Suggest the use of http.MethodXX.
    +      # Default: true
    +      http-method: false
    +      # Suggest the use of http.StatusXX.
    +      # Default: true
    +      http-status-code: false
    +      # Suggest the use of time.Month in time.Date.
    +      # Default: false
    +      time-date-month: true
    +      # Suggest the use of time.Weekday.String().
    +      # Default: true
    +      time-weekday: true
    +      # Suggest the use of time.Month.String().
    +      # Default: false
    +      time-month: true
    +      # Suggest the use of time.Layout.
    +      # Default: false
    +      time-layout: true
    +      # Suggest the use of crypto.Hash.String().
    +      # Default: false
    +      crypto-hash: true
    +      # Suggest the use of rpc.DefaultXXPath.
    +      # Default: false
    +      default-rpc-path: true
    +      # Suggest the use of sql.LevelXX.String().
    +      # Default: false
    +      sql-isolation-level: true
    +      # Suggest the use of tls.SignatureScheme.String().
    +      # Default: false
    +      tls-signature-scheme: true
    +      # Suggest the use of constant.Kind.String().
    +      # Default: false
    +      constant-kind: true

    usetesting +

    Reports uses of functions with replacement inside the testing package.

    Since golangci-lint v1.63.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    usetesting:
    +      # Enable/disable `os.CreateTemp("", ...)` detections.
    +      # Default: true
    +      os-create-temp: false
    +      # Enable/disable `os.MkdirTemp()` detections.
    +      # Default: true
    +      os-mkdir-temp: false
    +      # Enable/disable `os.Setenv()` detections.
    +      # Default: true
    +      os-setenv: false
    +      # Enable/disable `os.TempDir()` detections.
    +      # Default: false
    +      os-temp-dir: true
    +      # Enable/disable `os.Chdir()` detections.
    +      # Disabled if Go < 1.24.
    +      # Default: true
    +      os-chdir: false
    +      # Enable/disable `context.Background()` detections.
    +      # Disabled if Go < 1.24.
    +      # Default: false
    +      context-background: true
    +      # Enable/disable `context.TODO()` detections.
    +      # Disabled if Go < 1.24.
    +      # Default: false
    +      context-todo: true

    varnamelen +

    Checks that the length of a variable's name matches its scope.

    Since golangci-lint v1.43.0
    +Repository

    linters:
    +  settings:
    +    varnamelen:
    +      # The longest distance, in source lines, that is being considered a "small scope".
    +      # Variables used in at most this many lines will be ignored.
    +      # Default: 5
    +      max-distance: 6
    +      # The minimum length of a variable's name that is considered "long".
    +      # Variable names that are at least this long will be ignored.
    +      # Default: 3
    +      min-name-length: 2
    +      # Check method receivers.
    +      # Default: false
    +      check-receiver: true
    +      # Check named return values.
    +      # Default: false
    +      check-return: true
    +      # Check type parameters.
    +      # Default: false
    +      check-type-param: true
    +      # Ignore "ok" variables that hold the bool return value of a type assertion.
    +      # Default: false
    +      ignore-type-assert-ok: true
    +      # Ignore "ok" variables that hold the bool return value of a map index.
    +      # Default: false
    +      ignore-map-index-ok: true
    +      # Ignore "ok" variables that hold the bool return value of a channel receive.
    +      # Default: false
    +      ignore-chan-recv-ok: true
    +      # Optional list of variable names that should be ignored completely.
    +      # Default: []
    +      ignore-names:
    +        - err
    +      # Optional list of variable declarations that should be ignored completely.
    +      # Entries must be in one of the following forms (see below for examples):
    +      # - for variables, parameters, named return values, method receivers, or type parameters:
    +      #   <name> <type>  (<type> can also be a pointer/slice/map/chan/...)
    +      # - for constants: const <name>
    +      #
    +      # Default: []
    +      ignore-decls:
    +        - c echo.Context
    +        - t testing.T
    +        - f *foo.Bar
    +        - e error
    +        - i int
    +        - const C
    +        - T any
    +        - m map[string]int

    wastedassign +

    Finds wasted assignment statements.

    Since golangci-lint v1.38.0
    +Repository

    No settings available.

    whitespace +

    Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc.

    Since golangci-lint v1.19.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    whitespace:
    +      # Enforces newlines (or comments) after every multi-line if statement.
    +      # Default: false
    +      multi-if: true
    +      # Enforces newlines (or comments) after every multi-line function signature.
    +      # Default: false
    +      multi-func: true

    wrapcheck +

    Checks that errors returned from external packages are wrapped.

    Since golangci-lint v1.32.0
    +Repository

    linters:
    +  settings:
    +    wrapcheck:
    +      # An array of strings specifying additional substrings of signatures to ignore.
    +      # Unlike 'ignore-sigs', this option extends the default set (or the set specified in 'ignore-sigs') without replacing it entirely.
    +      # This allows you to add specific signatures to the ignore list
    +      # while retaining the defaults or any items in 'ignore-sigs'.
    +      # Default: []
    +      extra-ignore-sigs:
    +        - .CustomError(
    +        - .SpecificWrap(
    +      # An array of strings that specify substrings of signatures to ignore.
    +      # If this set, it will override the default set of ignored signatures.
    +      # See https://github.com/tomarrell/wrapcheck#configuration for more information.
    +      # Default: [".Errorf(", "errors.New(", "errors.Unwrap(", "errors.Join(", ".Wrap(", ".Wrapf(", ".WithMessage(", ".WithMessagef(", ".WithStack("]
    +      ignore-sigs:
    +        - .Errorf(
    +        - errors.New(
    +        - errors.Unwrap(
    +        - errors.Join(
    +        - .Wrap(
    +        - .Wrapf(
    +        - .WithMessage(
    +        - .WithMessagef(
    +        - .WithStack(
    +      # An array of strings that specify regular expressions of signatures to ignore.
    +      # Default: []
    +      ignore-sig-regexps:
    +        - \.New.*Error\(
    +      # An array of strings that specify globs of packages to ignore.
    +      # Default: []
    +      ignore-package-globs:
    +        - encoding/*
    +        - github.com/pkg/*
    +      # An array of strings that specify regular expressions of interfaces to ignore.
    +      # Default: []
    +      ignore-interface-regexps:
    +        - ^(?i)c(?-i)ach(ing|e)
    +      # Determines whether wrapcheck should report errors returned from inside the package.
    +      # Default: false
    +      report-internal-errors: true

    wsl +

    New major version. Use wsl_v5 instead.

    Since golangci-lint v1.20.0
    Deprecated since v2.2.0
    +Repository

    No settings available.

    wsl_v5 +

    Add or remove empty lines.

    Since golangci-lint v2.2.0
    Autofix
    +Repository

    linters:
    +  settings:
    +    wsl_v5:
    +      # Allow cuddling a variable if it's used first in the immediate following block,
    +      # even if the statement with the block doesn't use the variable.
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration
    +      # Default: true
    +      allow-first-in-block: false
    +      # Same as above,
    +      # but allows cuddling if the variable is used anywhere in the following (or nested) block.
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration
    +      # Default: false
    +      allow-whole-block: true
    +      # If a block contains more than this number of lines,
    +      # the branch statement needs to be separated by whitespace.
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration
    +      # Default: 2
    +      branch-max-lines: 4
    +      # If set to a non-negative number,
    +      # case blocks need to end with whitespace if exceeding this number
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration
    +      # Default: 0
    +      case-max-lines: 2
    +      # Default checks to use.
    +      # Can be `all`, `none`, `default` or empty.
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration
    +      # Default: ""
    +      default: all
    +      # Enabled checks.
    +      # Will be additive to any presets.
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration
    +      # Default: []
    +      enable:
    +        - assign
    +        - branch
    +        - decl
    +        - defer
    +        - expr
    +        - for
    +        - go
    +        - if
    +        - inc-dec
    +        - label
    +        - range
    +        - return
    +        - select
    +        - send
    +        - switch
    +        - type-switch
    +        - append
    +        - assign-exclusive
    +        - assign-expr
    +        - err
    +        - leading-whitespace
    +        - trailing-whitespace
    +      # Disable checks.
    +      # Will be subtractive to any preset.
    +      # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration
    +      # Default: []
    +      disable:
    +        - assign
    +        - branch
    +        - decl
    +        - defer
    +        - expr
    +        - for
    +        - go
    +        - if
    +        - inc-dec
    +        - label
    +        - range
    +        - return
    +        - select
    +        - send
    +        - switch
    +        - type-switch
    +        - append
    +        - assign-exclusive
    +        - assign-expr
    +        - err
    +        - leading-whitespace
    +        - trailing-whitespace

    zerologlint +

    Detects the wrong usage of zerolog that a user forgets to dispatch with Send or Msg.

    Since golangci-lint v1.53.0
    +Repository

    No settings available.

    Last updated on
    \ No newline at end of file diff --git a/docs/linters/false-positives/index.html b/docs/linters/false-positives/index.html new file mode 100644 index 000000000000..f92172e4fa3e --- /dev/null +++ b/docs/linters/false-positives/index.html @@ -0,0 +1,195 @@ +False Positives – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    False Positives

    False positives are inevitable, but we did our best to reduce their count.

    If a false positive occurred, you have several choices.

    Specific Linter Excludes +

    Most of the linters have a configuration, sometimes false-positives can be related to a bad configuration of a linter. +So it’s recommended to check the linter configurations.

    Otherwise, some linters have dedicated configuration to exclude or disable rules.

    An example with staticcheck:

    linters:
    +  settings:
    +    staticcheck:
    +      checks:
    +        - all
    +        - '-SA1000' # disable the rule SA1000
    +        - '-SA1004' # disable the rule SA1004

    Exclude +

    Exclude Issue by Text +

    You can use linters.exclusions.rules config option for per-path or per-linter configuration.

    In the following example, all the reports from the linters (linters) that contains the text (text) are excluded:

    linters:
    +  exclusions:
    +    rules:
    +      - linters:
    +          - mnd
    +        text: "Magic number: 9"

    In the following example, all the reports from the linters (linters) that originated from the source (source) are excluded:

    linters:
    +  exclusions:
    +    rules:
    +      - linters:
    +          - lll
    +        source: "^//go:generate "

    In the following example, all the reports that contains the text (text) in the path (path) are excluded:

    linters:
    +  exclusions:
    +    rules:
    +      - path: path/to/a/file.go
    +        text: "string `example` has (\\d+) occurrences, make it a constant"

    Exclude Issues by Path +

    Exclude issues in path by linters.exclusions.paths or linters.exclusions.rules config options.

    In the following example, all the reports from the linters (linters) that concerns the path (path) are excluded:

    linters:
    +  exclusions:
    +    rules:
    +      - path: '(.+)_test\.go'
    +        linters:
    +          - funlen
    +          - goconst

    The opposite, excluding reports except for specific paths, is also possible. +In the following example, only test files get checked:

    linters:
    +  exclusions:
    +    rules:
    +      - path-except: '(.+)_test\.go'
    +        linters:
    +          - funlen
    +          - goconst

    In the following example, all the reports related to the files (paths) are excluded:

    linters:
    +  exclusions:
    +    paths:
    +      - path/to/a/file.go

    In the following example, all the reports related to the directories (paths) are excluded:

    linters:
    +  exclusions:
    +    paths:
    +      - path/to/a/dir/

    Nolint Directive +

    To exclude issues from all linters use //nolint:all. +For example, if it’s used inline (not from the beginning of the line) it excludes issues only for this line.

    var bad_name int //nolint:all

    To exclude issues from specific linters only:

    var bad_name int //nolint:wsl,unused

    To exclude issues for the block of code, use this directive at the beginning of a line:

    //nolint:all
    +func allIssuesInThisFunctionAreExcluded() *string {
    +  // ...
    +}
    +
    +//nolint:govet
    +var (
    +  a int
    +  b int
    +)

    Also, you can exclude all issues in a file by:

    //nolint:unparam
    +package pkg

    You may add a comment explaining or justifying why a nolint directive is being used on the same line as the flag itself:

    //nolint:gocyclo // This legacy function is complex, but the team too busy to simplify it
    +func someLegacyFunction() *string {
    +  // ...
    +}

    You can see more examples of using nolint directives in our tests for it.

    Syntax +

    nolint is not regular comment but a directive.

    A directive comment is a line matching the regular expression //(line |extern |export |[a-z0-9]+:[a-z0-9]). +https://go.dev/doc/comment#syntax

    This means that no spaces are allowed between:

    • // and nolint
    • nolint and :
    • : and the name of the linter.

    Invalid syntax:

    // nolint
    +// nolint:xxx
    +//nolint :xxx
    +//nolint: xxx

    Valid syntax:

    //nolint:xxx

    Exclusion Presets +

    Some exclusions are considered common. +To help golangci-lint users, those common exclusions are provided through presets.

    linters:
    +  exclusions:
    +    presets:
    +      - comments
    +      - common-false-positives
    +      - legacy
    +      - std-error-handling

    Preset comments +

    LinterIssue Text
    staticcheck(ST1000|ST1020|ST1021|ST1022)
    reviveexported (.+) should have comment( \(or a comment on this block\))? or be unexported
    revivepackage comment should be of the form "(.+)..."
    revivecomment on exported (.+) should be of the form "(.+)..."
    reviveshould have a package comment

    Preset common-false-positives +

    LinterIssue Text
    gosecG103: Use of unsafe calls should be audited
    gosecG204: Subprocess launched with variable
    gosecG304: Potential file inclusion via variable

    Preset legacy +

    LinterIssue Text
    govet(possible misuse of unsafe.Pointer|should have signature)
    staticcheckSA4011
    gosecG104
    gosec(G301|G302|G307): Expect (directory permissions to be 0750|file permissions to be 0600) or less

    Preset std-error-handling +

    LinterIssue Text
    errcheck(?i)Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked
    Last updated on
    \ No newline at end of file diff --git a/docs/linters/index.html b/docs/linters/index.html new file mode 100644 index 000000000000..8c4016487b09 --- /dev/null +++ b/docs/linters/index.html @@ -0,0 +1,114 @@ +Linters – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Linters

    To see a list of supported linters and which linters are enabled/disabled:

    golangci-lint help linters

    To see a list of linters enabled by your configuration, use:

    golangci-lint linters

    All Linters +

    Default
    New
    Autofix
    Fast
    Slow
    Deprecated
    Reset
    Last updated on
    \ No newline at end of file diff --git a/docs/linters/index.xml b/docs/linters/index.xml new file mode 100644 index 000000000000..cd1533a4ed97 --- /dev/null +++ b/docs/linters/index.xml @@ -0,0 +1,6749 @@ +Golangci-lint – Lintershttps://golangci-lint.run/docs/linters/Recent content in Linters on Golangci-lintHugo -- gohugo.ioen-usSettingshttps://golangci-lint.run/docs/linters/configuration/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/linters/configuration/ +<h2>arangolint<span class="hx:absolute hx:-mt-20" id="arangolint"></span> +<a href="#arangolint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Opinionated best practices for arangodb client.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<a href="https://github.com/Crocmagnon/arangolint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>asasalint<span class="hx:absolute hx:-mt-20" id="asasalint"></span> +<a href="#asasalint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check for pass []any as any in variadic func(&hellip;any).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.47.0</div> +</div> +<a href="https://github.com/alingse/asasalint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">asasalint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To specify a set of function names to exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The values are merged with the builtin exclusions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;^(fmt|log|logger|t|)\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Append</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">\.Wrapf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To enable/disable the asasalint builtin exclusions of function names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the default value of `exclude` to get the builtin exclusions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">use-builtin-exclusions</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>asciicheck<span class="hx:absolute hx:-mt-20" id="asciicheck"></span> +<a href="#asciicheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that all code identifiers does not have non-ASCII symbols in the name.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.26.0</div> +</div> +<a href="https://github.com/golangci/asciicheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>bidichk<span class="hx:absolute hx:-mt-20" id="bidichk"></span> +<a href="#bidichk" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for dangerous unicode character sequences.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/breml/bidichk" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bidichk</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The following configurations check for all mentioned invisible Unicode runes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># All runes are enabled by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">left-to-right-embedding</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">right-to-left-embedding</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pop-directional-formatting</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">left-to-right-override</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">right-to-left-override</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">left-to-right-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">right-to-left-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first-strong-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pop-directional-isolate</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>bodyclose<span class="hx:absolute hx:-mt-20" id="bodyclose"></span> +<a href="#bodyclose" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks whether HTTP response body is closed successfully.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.18.0</div> +</div> +<a href="https://github.com/timakin/bodyclose" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>canonicalheader<span class="hx:absolute hx:-mt-20" id="canonicalheader"></span> +<a href="#canonicalheader" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Canonicalheader checks whether net/http.Header uses canonical header.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.58.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/lasiar/canonicalheader" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>containedctx<span class="hx:absolute hx:-mt-20" id="containedctx"></span> +<a href="#containedctx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Containedctx is a linter that detects struct contained context.Context field.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/sivchari/containedctx" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>contextcheck<span class="hx:absolute hx:-mt-20" id="contextcheck"></span> +<a href="#contextcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check whether the function uses a non-inherited context.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/kkHAIKE/contextcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>copyloopvar<span class="hx:absolute hx:-mt-20" id="copyloopvar"></span> +<a href="#copyloopvar" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter detects places where loop variables are copied.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.57.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/karamaru-alpha/copyloopvar" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">copyloopvar</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check all assigning the loop variable to another variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-alias</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>cyclop<span class="hx:absolute hx:-mt-20" id="cyclop"></span> +<a href="#cyclop" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks function and package cyclomatic complexity.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.37.0</div> +</div> +<a href="https://github.com/bkielbasa/cyclop" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cyclop</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The maximal code complexity to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The maximal average package complexity.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If it&#39;s higher than 0.0 (float) the check is enabled.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">package-average</span><span class="p">:</span><span class="w"> </span><span class="m">0.5</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>decorder<span class="hx:absolute hx:-mt-20" id="decorder"></span> +<a href="#decorder" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check declaration order and count of types, constants, variables and functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://gitlab.com/bosi/decorder" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">decorder</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Required order of `type`, `const`, `var` and `func` declarations inside a file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: types before constants before variables before functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dec-order</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">type</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">const</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">var</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">func</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, underscore vars (vars with &#34;_&#34; as the name) will be ignored at all checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (underscore vars are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-underscore-vars</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, order of declarations is not checked at all.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-dec-order-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, `init` func can be anywhere in file (does not have to be declared before all other functions).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-init-func-first-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, multiple global `type`, `const` and `var` declarations are allowed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true (disabled)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, type declarations will be ignored for dec num check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (type statements are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-type-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, const declarations will be ignored for dec num check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (const statements are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-const-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, var declarations will be ignored for dec num check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (var statements are not ignored)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-var-dec-num-check</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>depguard<span class="hx:absolute hx:-mt-20" id="depguard"></span> +<a href="#depguard" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Go linter that checks if package imports are in a list of acceptable packages.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.4.0</div> +</div> +<a href="https://github.com/OpenPeeDeeP/depguard" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">depguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Rules to apply.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Variables:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - File Variables</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use an exclamation mark `!` to negate a variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example: `!$test` matches any file that is not a go test file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `$all` - matches all go files</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `$test` - matches all go test files</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Package Variables</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `$gostd` - matches all of go&#39;s standard library (Pulled from `GOROOT`)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default (applies if no custom rules are defined): Only allow $gostd in all files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Name of a rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">main</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines package matching behavior. Available modes:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `original`: allowed if it doesn&#39;t match the deny list and either matches the allow list or the allow list is empty.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `strict`: allowed only if it matches the allow list and either doesn&#39;t match the deny list or the allow rule is more specific (longer) than the deny rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lax`: allowed if it doesn&#39;t match the deny list or the allow rule is more specific (longer) than the deny rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;original&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">list-mode</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of file globs that will match this list of settings to compare against.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${base-path}&#39; is substituted with a path relative to the mode defined with `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${config-path}&#39; is substituted with a path relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: $all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;!**/*_a _file.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">$gostd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/OpenPeeDeeP</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of packages that are not allowed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">deny</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;math/rand$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="l">use math/rand/v2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;github.com/sirupsen/logrus&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="l">not allowed</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;github.com/pkg/errors&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">desc</span><span class="p">:</span><span class="w"> </span><span class="l">Should be replaced by standard lib errors package</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>dogsled<span class="hx:absolute hx:-mt-20" id="dogsled"></span> +<a href="#dogsled" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<a href="https://github.com/alexkohler/dogsled" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dogsled</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks assignments with too many blank identifiers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-blank-identifiers</span><span class="p">:</span><span class="w"> </span><span class="m">3</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>dupl<span class="hx:absolute hx:-mt-20" id="dupl"></span> +<a href="#dupl" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects duplicate fragments of code.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/mibk/dupl" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dupl</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tokens count to trigger issue.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 150</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">threshold</span><span class="p">:</span><span class="w"> </span><span class="m">100</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>dupword<span class="hx:absolute hx:-mt-20" id="dupword"></span> +<a href="#dupword" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for duplicate words in the source code.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.50.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Abirdcfly/dupword" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dupword</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords for detecting duplicate words.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If this list is not empty, only the words defined in this list will be detected.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">keywords</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;the&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;and&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;a&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords used to ignore detection.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;0C0C&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>durationcheck<span class="hx:absolute hx:-mt-20" id="durationcheck"></span> +<a href="#durationcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check for two durations multiplied together.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.37.0</div> +</div> +<a href="https://github.com/charithe/durationcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>embeddedstructfieldcheck<span class="hx:absolute hx:-mt-20" id="embeddedstructfieldcheck"></span> +<a href="#embeddedstructfieldcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Embedded types should be at the top of the field list of a struct, and there must be an empty line separating embedded fields from regular fields.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<a href="https://github.com/manuelarte/embeddedstructfieldcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">embeddedstructfieldcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that there is an empty space between the embedded fields and regular fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">empty-line</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid-mutex</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>err113<span class="hx:absolute hx:-mt-20" id="err113"></span> +<a href="#err113" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check errors handling expressions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.26.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Djarvur/go-err113" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>errcheck<span class="hx:absolute hx:-mt-20" id="errcheck"></span> +<a href="#errcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/kisielk/errcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report about not checking of errors in type assertions: `a := b.(MyStruct)`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Such cases aren&#39;t reported by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-type-assertions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Such cases aren&#39;t reported by default.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-blank</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To disable the errcheck built-in exclude list.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-default-exclusions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of functions to exclude from checking, where each entry is a single function to exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/kisielk/errcheck#excluding-functions for details.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io/ioutil.ReadFile</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(*bytes.Buffer)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(os.Stdout)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Display function signature instead of selector.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">verbose</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>errchkjson<span class="hx:absolute hx:-mt-20" id="errchkjson"></span> +<a href="#errchkjson" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks types passed to the json encoding functions. Reports unsupported types and reports occurrences where the check for the returned error can be omitted.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/breml/errchkjson" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errchkjson</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># With check-error-free-encoding set to true, errchkjson does warn about errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># from json encoding functions that are safe to be ignored,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># because they are not possible to happen.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># if check-error-free-encoding is set to true and errcheck linter is enabled,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># it is recommended to add the following exceptions to prevent from false positives:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># linters:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># settings:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># errcheck:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># exclude-functions:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - encoding/json.Marshal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - encoding/json.MarshalIndent</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-error-free-encoding</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Issue on struct encoding that doesn&#39;t have exported fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-no-exported</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>errname<span class="hx:absolute hx:-mt-20" id="errname"></span> +<a href="#errname" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that sentinel errors are prefixed with the <code>Err</code> and error types are suffixed with the <code>Error</code>.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.42.0</div> +</div> +<a href="https://github.com/Antonboom/errname" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>errorlint<span class="hx:absolute hx:-mt-20" id="errorlint"></span> +<a href="#errorlint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find code that can cause problems with the error wrapping scheme introduced in Go 1.13.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.32.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/polyfloyd/go-errorlint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorlint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check whether fmt.Errorf uses the %w verb for formatting errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See the https://github.com/polyfloyd/go-errorlint for caveats.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorf</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Permit more than 1 %w verb, valid per Go 1.20 (requires `errorf: true`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorf-multi</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for plain type assertions and type switches.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">asserts</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for plain error comparisons.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">comparison</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allowed errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed-errors</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">err</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;io.EOF&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fun</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/pkg.Read&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allowed error &#34;wildcards&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed-errors-wildcard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">err</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/pkg.ErrMagic&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fun</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;example.com/pkg.Magic&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>exhaustive<span class="hx:absolute hx:-mt-20" id="exhaustive"></span> +<a href="#exhaustive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check exhaustiveness of enum switch statements.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<a href="https://github.com/nishanths/exhaustive" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exhaustive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Program elements to check for exhaustiveness.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [ switch ]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">map</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Presence of &#34;default&#34; case in switch statements satisfies exhaustiveness,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># even if all enum members are not listed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-signifies-exhaustive</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enum members matching the supplied regex do not have to be listed in</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># switch statements to satisfy exhaustiveness.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-enum-members</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Example.+&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enum types matching the supplied regex do not have to be listed in</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># switch statements to satisfy exhaustiveness.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-enum-types</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Example.+&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Consider enums only in package scopes, not in inner scopes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">package-scope-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only run exhaustive check on switches with &#34;//exhaustive:enforce&#34; comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">explicit-exhaustive-switch</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only run exhaustive check on map literals with &#34;//exhaustive:enforce&#34; comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">explicit-exhaustive-map</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Switch statement requires default case even if exhaustive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-case-required</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>exhaustruct<span class="hx:absolute hx:-mt-20" id="exhaustruct"></span> +<a href="#exhaustruct" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if all structure fields are initialized.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.46.0</div> +</div> +<a href="https://github.com/GaijinEntertainment/go-exhaustruct" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exhaustruct</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regular expressions to match type names that should be processed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Anonymous structs can be matched by &#39;&lt;anonymous&gt;&#39; alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each regular expression must match the full type name, including package path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but not `http\.Cookie`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.+\.Test&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example\.com/package\.ExampleStruct[\d]{1,2}&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regular expressions to match type names that should be excluded from processing.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Anonymous structs can be matched by &#39;&lt;anonymous&gt;&#39; alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Has precedence over `include`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each regular expression must match the full type name, including package path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but not `http\.Cookie`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.+/cobra\.Command$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allows empty structures, effectively excluding them from the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regular expressions to match type names that should be allowed to be empty.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Anonymous structs can be matched by &#39;&lt;anonymous&gt;&#39; alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each regular expression must match the full type name, including package path.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, to match type `net/http.Cookie` regular expression should be `.*/http\.Cookie`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but not `http\.Cookie`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty-rx</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*/http\.Cookie&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allows empty structures in return statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty-returns</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allows empty structures in variable declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-empty-declarations</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>exptostd<span class="hx:absolute hx:-mt-20" id="exptostd"></span> +<a href="#exptostd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects functions from golang.org/x/exp/ that can be replaced by std functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.63.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ldez/exptostd" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>fatcontext<span class="hx:absolute hx:-mt-20" id="fatcontext"></span> +<a href="#fatcontext" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects nested contexts in loops and function literals.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.58.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Crocmagnon/fatcontext" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fatcontext</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for potential fat contexts in struct pointers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># May generate false positives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-struct-pointers</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>forbidigo<span class="hx:absolute hx:-mt-20" id="forbidigo"></span> +<a href="#forbidigo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Forbids identifiers.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.34.0</div> +</div> +<a href="https://github.com/ashanbrown/forbidigo" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the following identifiers (list of regexp).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;^(fmt\\.Print(|f|ln)|print|println)$&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Built-in bootstrapping functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^print(ln)?$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional message that gets included in error reports.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^fmt\.Print.*$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="l">Do not commit print statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Alternatively, put messages at the end of the regex, surrounded by `(# )?`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Escape any special characters. Those messages get included in error reports.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;fmt\.Print.*(# Do not commit print statements\.)?&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid spew Dump, whether it is called as function or method.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Depends on analyze-types below.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^spew\.(ConfigState\.)?Dump$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The package name might be ambiguous.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The full import path can be used as additional criteria.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Depends on analyze-types below.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^v1.Dump$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">^example.com/pkg/api/v1$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude godoc examples from forbidigo checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-godoc-examples</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Instead of matching the literal source code,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># use type information to replace expressions with strings that contain the package name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and (for methods and fields) the type name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This makes it possible to handle import renaming and forbid struct fields and methods.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">analyze-types</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>forcetypeassert<span class="hx:absolute hx:-mt-20" id="forcetypeassert"></span> +<a href="#forcetypeassert" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find forced type assertions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<a href="https://github.com/gostaticanalysis/forcetypeassert" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>funcorder<span class="hx:absolute hx:-mt-20" id="funcorder"></span> +<a href="#funcorder" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks the order of functions, methods, and constructors.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.1.0</div> +</div> +<a href="https://github.com/manuelarte/funcorder" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funcorder</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks that constructors are placed after the structure declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">constructor</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks if the exported methods of a structure are placed before the non-exported ones.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">struct-method</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks if the constructors and/or structure methods are sorted alphabetically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alphabetical</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>funlen<span class="hx:absolute hx:-mt-20" id="funlen"></span> +<a href="#funlen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for long functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.18.0</div> +</div> +<a href="https://github.com/ultraware/funlen" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funlen</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks the number of lines in a function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If lower than 0, disable the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 60</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">lines</span><span class="p">:</span><span class="w"> </span>-<span class="m">1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks the number of statements in a function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If lower than 0, disable the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 40</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">statements</span><span class="p">:</span><span class="w"> </span>-<span class="m">1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore comments when counting lines.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>ginkgolinter<span class="hx:absolute hx:-mt-20" id="ginkgolinter"></span> +<a href="#ginkgolinter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Enforces standards of using ginkgo and gomega.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.51.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/nunnatsa/ginkgolinter" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ginkgolinter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong length assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-len-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong nil assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-nil-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong error assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-err-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the wrong comparison assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-compare-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress the function all in async assertion warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-async-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suppress warning for comparing values from different types, like `int32` and `uint32`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suppress-type-compare-assertion</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trigger warning for ginkgo focus containers like `FDescribe`, `FContext`, `FWhen` or `FIt`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid-focus-container</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Don&#39;t trigger warnings for HaveLen(0)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-havelen-zero</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force using `Expect` with `To`, `ToNot` or `NotTo`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Reject using `Expect` with `Should` or `ShouldNot`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-expect-to</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Best effort validation of async intervals (timeout and polling).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignored the `suppress-async-assertion` is true.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">validate-async-intervals</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid-spec-pollution</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-succeed</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force adding assertion descriptions to gomega matchers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-assertion-description</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Force using `ToNot`, `ShouldNot` instead of `To(Not())`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">force-tonot</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocheckcompilerdirectives<span class="hx:absolute hx:-mt-20" id="gocheckcompilerdirectives"></span> +<a href="#gocheckcompilerdirectives" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that go compiler directive comments (//go:) are valid.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.51.0</div> +</div> +<a href="https://github.com/leighmcculloch/gocheckcompilerdirectives" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>gochecknoglobals<span class="hx:absolute hx:-mt-20" id="gochecknoglobals"></span> +<a href="#gochecknoglobals" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check that no global variables exist.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.12.0</div> +</div> +<a href="https://github.com/leighmcculloch/gochecknoglobals" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>gochecknoinits<span class="hx:absolute hx:-mt-20" id="gochecknoinits"></span> +<a href="#gochecknoinits" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that no init functions are present in Go code.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.12.0</div> +</div> +</p> +<p><em>No settings available.</em></p> +<h2>gochecksumtype<span class="hx:absolute hx:-mt-20" id="gochecksumtype"></span> +<a href="#gochecksumtype" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Run exhaustiveness checks on Go &quot;sum types&quot;.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<a href="https://github.com/alecthomas/go-check-sumtype" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gochecksumtype</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-signifies-exhaustive</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include shared interfaces in the exhaustiveness check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include-shared-interfaces</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocognit<span class="hx:absolute hx:-mt-20" id="gocognit"></span> +<a href="#gocognit" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Computes and checks the cognitive complexity of functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<a href="https://github.com/uudashr/gocognit" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocognit</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal code complexity to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 30 (but we recommend 10-20)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">10</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goconst<span class="hx:absolute hx:-mt-20" id="goconst"></span> +<a href="#goconst" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Finds repeated strings that could be replaced by a constant.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/jgautheron/goconst" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goconst</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal length of string constant.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-len</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimum occurrences of constant string count to trigger issue.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-occurrences</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Look for existing constants matching the values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">match-constant</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Search also for duplicated numbers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">numbers</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimum value, only works with `goconst.numbers`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum value, only works with `goconst.numbers`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore when constant is not used as function argument.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-calls</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude strings matching the given regular expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-string-values</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;foo.+&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects constants with identical values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">find-duplicates</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Evaluates of constant expressions like Prefix + &#34;suffix&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">eval-const-expressions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocritic<span class="hx:absolute hx:-mt-20" id="gocritic"></span> +<a href="#gocritic" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Provides diagnostics that check for bugs, performance and style issues. +Extensible without recompilation through dynamic rules. +Dynamic rules are written declaratively with AST patterns, filters, report message and optional suggestion.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.12.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/go-critic/go-critic" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocritic</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable all checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which checks should be enabled in addition to default checks; can&#39;t be combined with &#39;disabled-checks&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, list of stable checks is used (https://go-critic.com/overview#checks-overview):</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># appendAssign, argOrder, assignOp, badCall, badCond, captLocal, caseOrder, codegenComment, commentFormatting,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># defaultCaseOrder, deprecatedComment, dupArg, dupBranchBody, dupCase, dupSubExpr, elseif, exitAfterDefer,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># flagDeref, flagName, ifElseChain, mapKey, newDeref, offBy1, regexpMust, singleCaseSwitch, sloppyLen,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># sloppyTypeAssert, switchTrue, typeSwitchVar, underef, unlambda, unslice, valSwap, wrapperFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled-checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious append result assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#appendassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendAssign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects `append` chains to the same slice that can be done in a single `append` call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#appendcombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious arguments order.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#argorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">argOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects assignments that can be simplified by using assignment operators.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#assignop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assignOp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious function calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious condition expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badcond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious mutex lock/unlock operations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badlock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badLock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious regexp patterns.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badregexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badRegexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects bad usage of sort package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badsorting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSorting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects bad usage of sync.OnceFunc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#badsynconcefunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSyncOnceFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects bool expressions that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#boolexprsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">boolExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects when predeclared identifiers are shadowed in assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#builtinshadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects top-level declarations that shadow the predeclared identifiers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#builtinshadowdecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadowDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects capitalized names for local variables.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#captlocal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">captLocal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects erroneous case order inside switch statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#caseorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">caseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects malformed &#39;code generated&#39; file comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#codegencomment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">codegenComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects comments with non-idiomatic formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#commentformatting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentFormatting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects commented-out code inside function bodies.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#commentedoutcode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutCode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects commented-out imports.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#commentedoutimport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects when default case in switch isn&#39;t on 1st or last position.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#defaultcaseorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defaultCaseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects loops inside functions that use defer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#deferinloop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferInLoop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects deferred function literals that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#deferunlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferUnlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects malformed &#39;deprecated&#39; doc-comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#deprecatedcomment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecatedComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects comments that silence go lint complaints about doc-comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#docstub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">docStub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious duplicated arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#duparg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupArg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects duplicated branch bodies inside conditional statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupbranchbody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupBranchBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects duplicated case clauses inside switch or select statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupcase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupCase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects multiple imports of the same package under different aliases.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupimport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious duplicated sub-expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dupsubexpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupSubExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious formatting strings usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#dynamicfmtstring</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dynamicFmtString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects else with nested if statement that can be replaced with else-if.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#elseif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">elseif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious empty declarations blocks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#emptydecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects fallthrough that can be avoided by using multi case values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#emptyfallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyFallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects empty string checks that can be written more idiomatically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#emptystringtest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyStringTest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unoptimal strings/bytes case-insensitive comparison.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#equalfold</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equalFold</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unwanted dependencies on the evaluation order.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#evalorder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">evalOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects calls to exit/fatal inside functions that use defer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#exitafterdefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exitAfterDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects exposed methods from sync.Mutex and sync.RWMutex.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#exposedsyncmutex</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exposedSyncMutex</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious reassignment of error from another package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#externalerrorreassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">externalErrorReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects problems in filepath.Join() function calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#filepathjoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">filepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects immediate dereferencing of `flag` package pointers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#flagderef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious flag names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#flagname</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagName</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects hex literals that have mixed case letter digits.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#hexliteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hexLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects nil usages in http.NewRequest calls, suggesting http.NoBody as an alternative.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#httpnobody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpNoBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects params that incur excessive amount of copying.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#hugeparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hugeParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects repeated if-else statements and suggests to replace them with switch statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#ifelsechain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifElseChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects when imported package names shadowed in the assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#importshadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects strings.Index calls that may cause unwanted allocs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#indexalloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">indexAlloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects non-assignment statements inside if/switch init clause.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#initclause</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">initClause</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious map literal keys.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#mapkey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mapKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects method expression call that can be replaced with a method call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#methodexprcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">methodExprCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Finds where nesting level could be reduced.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#nestingreduce</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestingReduce</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects immediate dereferencing of `new` expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#newderef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">newDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects return statements those results evaluate to nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#nilvalreturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilValReturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects old-style octal literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#octalliteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">octalLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects various off-by-one kind of errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#offby1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">offBy1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects if function parameters could be combined by type and suggest the way to do it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#paramtypecombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paramTypeCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects expressions like []rune(s)[0] that may cause unwanted rune slice allocation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferdecoderune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferDecodeRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects concatenation with os.PathSeparator which can be replaced with filepath.Join.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferfilepathjoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFilepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects fmt.Sprint(f/ln) calls which can be replaced with fmt.Fprint(f/ln).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferfprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects w.Write or io.WriteString calls which can be replaced with w.WriteString.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferstringwriter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferStringWriter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects WriteRune calls with rune literal argument that is single byte and reports to use WriteByte instead.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#preferwritebyte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferWriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects input and output parameters that have a type of pointer to referential type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#ptrtorefparam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ptrToRefParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects append all its data while range it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#rangeappendall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeAppendAll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects expensive copies of `for` loop range expressions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#rangeexprcopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeExprCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects loops that copy big objects during each iteration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#rangevalcopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeValCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant fmt.Sprint calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#redundantsprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">redundantSprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#regexpmust</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpMust</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious regexp patterns.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#regexppattern</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpPattern</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects regexp patterns that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#regexpsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious http.Error call without following return.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#returnafterhttperror</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">returnAfterHttpError</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Runs user-defined rules using ruleguard linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#ruleguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ruleguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects switch statements that could be better written as if statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#singlecaseswitch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">singleCaseSwitch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects slice clear loops, suggests an idiom that is recognized by the Go compiler.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sliceclear</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sliceClear</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects usage of `len` when result is obvious or doesn&#39;t make sense.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sloppylen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyLen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious/confusing re-assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sloppyreassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant type assertions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sloppytypeassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyTypeAssert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects suspicious sort.Slice calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sortslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortSlice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects &#34;%s&#34; formatting directives that can be replaced with %q.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sprintfquotedstring</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sprintfQuotedString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects issue in Query() and Exec() calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#sqlquery</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlQuery</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects string concat operations that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#stringconcatsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringConcatSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant conversions between string and []byte.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#stringxbytes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringXbytes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects strings.Compare usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#stringscompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringsCompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects switch-over-bool statements that use explicit `true` tag value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#switchtrue</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switchTrue</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects sync.Map load+delete operations that can be replaced with LoadAndDelete.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#syncmaploadanddelete</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">syncMapLoadAndDelete</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects manual conversion to milli- or microseconds.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#timeexprsimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects TODO comments without detail/assignee.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#todocommentwithoutdetail</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">todoCommentWithoutDetail</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects function with too many results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#toomanyresultschecker</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tooManyResultsChecker</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects potential truncation issues when comparing ints of different sizes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#truncatecmp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">truncateCmp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects repeated type assertions and suggests to replace them with type switch statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typeassertchain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeAssertChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects method declarations preceding the type definition itself.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typedeffirst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeDefFirst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects type switches that can benefit from type guard clause with variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typeswitchvar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeSwitchVar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unneeded parenthesis inside type expressions and suggests to remove them.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#typeunparen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeUnparen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unchecked errors in if statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#uncheckedinlineerr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">uncheckedInlineErr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects dereference expressions that can be omitted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#underef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">underef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundant statement labels.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unlabelstmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlabelStmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects function literals that can be simplified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unnamed results that may benefit from names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unnamedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnamedResult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects unnecessary braced statement blocks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unnecessaryblock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryBlock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects redundantly deferred calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unnecessarydefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects slice expressions that can be simplified to sliced expression itself.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#unslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects value swapping code that are not using parallel assignment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#valswap</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">valSwap</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects conditions that are unsafe due to not being exhaustive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#weakcond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">weakCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ensures that `//nolint` comments include an explanation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#whynolint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whyNoLint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects function calls that can be replaced with convenience wrappers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#wrapperfunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapperFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detects Yoda style expressions and suggests to replace them.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://go-critic.com/overview.html#yodastyleexpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yodaStyleExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Which checks should be disabled; can&#39;t be combined with &#39;enabled-checks&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled-checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendAssign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appendCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">argOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assignOp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badLock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badRegexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSorting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">badSyncOnceFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">boolExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtinShadowDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">captLocal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">caseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">codegenComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentFormatting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutCode</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">commentedOutImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defaultCaseOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferInLoop</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deferUnlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecatedComment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">docStub</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupArg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupBranchBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupCase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupImport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupSubExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dynamicFmtString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">elseif</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyDecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyFallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">emptyStringTest</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equalFold</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">evalOrder</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exitAfterDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">exposedSyncMutex</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">externalErrorReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">filepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">flagName</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hexLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpNoBody</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hugeParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifElseChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">importShadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">indexAlloc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">initClause</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mapKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">methodExprCall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nestingReduce</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">newDeref</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilValReturn</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">octalLiteral</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">offBy1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">paramTypeCombine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferDecodeRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFilepathJoin</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferFprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferStringWriter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">preferWriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ptrToRefParam</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeAppendAll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeExprCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">rangeValCopy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">redundantSprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpMust</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpPattern</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexpSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">returnAfterHttpError</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ruleguard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">singleCaseSwitch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sliceClear</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyLen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyReassign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sloppyTypeAssert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortSlice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sprintfQuotedString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sqlQuery</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringConcatSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringXbytes</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringsCompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switchTrue</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">syncMapLoadAndDelete</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeExprSimplify</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">todoCommentWithoutDetail</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tooManyResultsChecker</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">truncateCmp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeAssertChain</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeDefFirst</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeSwitchVar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">typeUnparen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">uncheckedInlineErr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">underef</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlabelStmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unlambda</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnamedResult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryBlock</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unnecessaryDefer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">valSwap</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">weakCond</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">whyNoLint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">wrapperFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yodaStyleExpr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable multiple checks by tags in addition to default checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic` to see all tags and checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/go-critic/go-critic#usage -&gt; section &#34;Tags&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled-tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">diagnostic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">performance</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">experimental</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">opinionated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled-tags</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">diagnostic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">performance</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">experimental</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">opinionated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Settings passed to gocritic.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The settings key is the name of a supported gocritic checker.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The list of supported checkers can be found at https://go-critic.com/overview.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Must be valid enabled check name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">captLocal</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to restrict checker to params only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paramsOnly</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commentedOutCode</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Min length of the comment that triggers a warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 15</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">minLength</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">elseif</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to skip balanced if-else pairs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipBalanced</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">hugeParam</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size in bytes that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 80</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sizeThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">70</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ifElseChain</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Min number of if-else blocks that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">minThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nestingReduce</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Min number of statements inside a branch to trigger a warning.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bodyWidth</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rangeExprCopy</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size in bytes that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 512</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sizeThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">516</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to check test functions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipTestFuncs</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rangeValCopy</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size in bytes that makes the warning trigger.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 128</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sizeThreshold</span><span class="p">:</span><span class="w"> </span><span class="m">32</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to check test functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipTestFuncs</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ruleguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable debug to identify which &#39;Where&#39; condition was rejected.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The value of the parameter is the name of a function in a ruleguard file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># When a rule is evaluated:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The Match() clause is accepted; and</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># One of the conditions in the Where() clause is rejected,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Then:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ruleguard prints the specific Where() condition that was rejected.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The option is passed to the ruleguard &#39;debug-group&#39; argument.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">debug</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;emptyDecl&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Determines the behavior when an error occurs while parsing ruleguard files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If flag is not set, log error and skip rule files that contain an error.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If flag is set, the value must be a comma-separated list of error conditions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#39;all&#39;: fail on all errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#39;import&#39;: ruleguard rule imports a package that cannot be found.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#39;dsl&#39;: gorule file does not comply with the ruleguard DSL.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">failOn</span><span class="p">:</span><span class="w"> </span><span class="l">dsl,import</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of file paths containing ruleguard rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${base-path}&#39; is substituted with a path relative to the mode defined with `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${config-path}&#39; is substituted with a path relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Glob patterns such as &#39;rules-*.go&#39; may be specified.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of enabled groups or skip empty to enable everything.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tags can be defined with # character prefix.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&lt;all&gt;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;myGroupName,#myTagName&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of disabled groups or skip empty to enable everything.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tags can be defined with # character prefix.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;myGroupName,#myTagName&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tooManyResultsChecker</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum number of results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">maxResults</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">truncateCmp</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to skip int/uint/uintptr types.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipArchDependent</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">underef</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to skip (*x).method() calls where x is a pointer receiver.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skipRecvDeref</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unnamedResult</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to check exported functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkExported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gocyclo<span class="hx:absolute hx:-mt-20" id="gocyclo"></span> +<a href="#gocyclo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Computes and checks the cyclomatic complexity of functions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/fzipp/gocyclo" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocyclo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal code complexity to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 30 (but we recommend 10-20)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">10</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>godoclint<span class="hx:absolute hx:-mt-20" id="godoclint"></span> +<a href="#godoclint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks Golang's documentation practice (godoc).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.5.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>New</div> +</div> +<a href="https://github.com/godoc-lint/godoc-lint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">godoclint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default set of rules to enable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Possible values are: `basic`, `all` or `none`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: `basic` (enables `pkg-doc`, `single-pkg-doc`, `start-with-name`, and `deprecated`)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of rules to enable in addition to the default set.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check proper package-level godoc, if any.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert at most one godoc per package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#single-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">single-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require all packages to have a godoc.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert symbol godocs start with the symbol name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#start-with-name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">start-with-name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require godoc for all public symbols.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert correct formatting of deprecation notes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#deprecated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert maximum line length for godocs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#max-len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">max-len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assert no unused link in godocs.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#no-unused-link</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="kc">no</span>-<span class="l">unused-link</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of rules to disable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">single-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-pkg-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">start-with-name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-doc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deprecated</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">max-len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="kc">no</span>-<span class="l">unused-link</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A map for fine-tuning individual rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># All subkeys are optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">options</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-len</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 77</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">length</span><span class="p">:</span><span class="w"> </span><span class="m">127</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-doc</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore exported (public) symbols when applying the `require-doc` rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-exported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore unexported (private) symbols when applying the `require-doc` rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-unexported</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">start-with-name</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include unexported symbols when applying the `start-with-name` rule.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include-unexported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>godot<span class="hx:absolute hx:-mt-20" id="godot"></span> +<a href="#godot" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if comments end in a period.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/tetafro/godot" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">godot</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comments to be checked: `declarations`, `toplevel`, `noinline` or `all`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: declarations</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scope</span><span class="p">:</span><span class="w"> </span><span class="l">toplevel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of regexps for excluding particular comment lines from check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude todo and fixme comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^fixme:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^todo:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check that each sentence ends with a period.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">period</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check that each sentence starts with a capital letter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">capital</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>godox<span class="hx:absolute hx:-mt-20" id="godox"></span> +<a href="#godox" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects usage of FIXME, TODO and other keywords inside comments.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<a href="https://github.com/matoous/godox" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">godox</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report any comments starting with keywords, this is useful for TODO or FIXME comments that</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># might be left in the code accidentally and should be resolved before merging.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;TODO&#34;, &#34;BUG&#34;, &#34;FIXME&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">keywords</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">NOTE</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">OPTIMIZE</span><span class="w"> </span><span class="c"># marks code that should be optimized before merging</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">HACK</span><span class="w"> </span><span class="c"># marks hack-around that should be removed before merging</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goheader<span class="hx:absolute hx:-mt-20" id="goheader"></span> +<a href="#goheader" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check if file header matches to pattern.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/denis-tingaikin/go-header" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goheader</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supports two types &#39;const` and `regexp`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values can be used recursively.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: {}</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">values</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">const</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define here const type values in format k:v.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">COMPANY</span><span class="p">:</span><span class="w"> </span><span class="l">MY COMPANY</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">regexp</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define here regexp type values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># for example:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">AUTHOR</span><span class="p">:</span><span class="w"> </span><span class="l">.*@mycompany\.com</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The template used for checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Put here copyright header template for source code files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">template</span><span class="p">:</span><span class="w"> </span><span class="p">|-</span><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> {{ AUTHOR }} {{ COMPANY }} {{ YEAR }} +</span></span></span><span class="line"><span class="cl"><span class="sd"> SPDX-License-Identifier: Apache-2.0 +</span></span></span><span class="line"><span class="cl"><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> Licensed under the Apache License, Version 2.0 (the &#34;License&#34;); +</span></span></span><span class="line"><span class="cl"><span class="sd"> you may not use this file except in compliance with the License. +</span></span></span><span class="line"><span class="cl"><span class="sd"> You may obtain a copy of the License at: +</span></span></span><span class="line"><span class="cl"><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> http://www.apache.org/licenses/LICENSE-2.0 +</span></span></span><span class="line"><span class="cl"><span class="sd"> +</span></span></span><span class="line"><span class="cl"><span class="sd"> Unless required by applicable law or agreed to in writing, software +</span></span></span><span class="line"><span class="cl"><span class="sd"> distributed under the License is distributed on an &#34;AS IS&#34; BASIS, +</span></span></span><span class="line"><span class="cl"><span class="sd"> WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +</span></span></span><span class="line"><span class="cl"><span class="sd"> See the License for the specific language governing permissions and +</span></span></span><span class="line"><span class="cl"><span class="sd"> limitations under the License.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># As alternative of directive &#39;template&#39;, you may put the path to file with the template source.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Useful if you need to load the template from a specific file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${base-path}&#39; is substituted with a path relative to the mode defined with `run.relative-path-mode`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The placeholder &#39;${config-path}&#39; is substituted with a path relative to the configuration file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">template-path</span><span class="p">:</span><span class="w"> </span><span class="l">/path/to/my/template.tmpl</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gomoddirectives<span class="hx:absolute hx:-mt-20" id="gomoddirectives"></span> +<a href="#gomoddirectives" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.39.0</div> +</div> +<a href="https://github.com/ldez/gomoddirectives" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gomoddirectives</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow local `replace` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace-local</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed `replace` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace-allow-list</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">launchpad.net/gocheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow to not explain why the version has been retracted in the `retract` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retract-allow-no-explanation</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `exclude` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `ignore` directives (&gt;= go1.25).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `toolchain` directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">toolchain-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines a pattern to validate `toolchain` directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#39;&#39; (no match)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">toolchain-pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;go1\.23\.\d+$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `tool` directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tool-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Forbid the use of the `godebug` directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-debug-forbidden</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines a pattern to validate `go` minimum version directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#39;&#39; (no match)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-version-pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;\d\.\d+(\.0)?&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gomodguard<span class="hx:absolute hx:-mt-20" id="gomodguard"></span> +<a href="#gomodguard" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Allow and blocklist linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<a href="https://github.com/ryancurrah/gomodguard" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gomodguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed modules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gopkg.in/yaml.v2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of allowed module domains.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">domains</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">golang.org</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">blocked</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of blocked modules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">modules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Blocked module.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">github.com/uudashr/go-module</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Recommended modules that should be used instead. (Optional)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">recommendations</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">golang.org/x/mod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Reason why the recommended module should be used. (Optional)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reason</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;`mod` is the official go.mod parser library.&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of blocked module version constraints.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">versions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Blocked module with version constraint.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">github.com/mitchellh/go-homedir</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Version constraint, see https://github.com/Masterminds/semver#basic-comparisons.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&lt; 1.1.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Reason why the version constraint exists. (Optional)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reason</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;testing if blocked version constraint works.&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to true to raise lint issues for packages that are loaded from a local path via replace directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-replace-directives</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>goprintffuncname<span class="hx:absolute hx:-mt-20" id="goprintffuncname"></span> +<a href="#goprintffuncname" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that printf-like functions are named with <code>f</code> at the end.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.23.0</div> +</div> +<a href="https://github.com/golangci/go-printf-func-name" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>gosec<span class="hx:absolute hx:-mt-20" id="gosec"></span> +<a href="#gosec" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Inspects source code for security problems.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/securego/gosec" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gosec</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To select a subset of rules to run.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Available rules: https://github.com/securego/gosec#available-rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [] - means include all rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">includes</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G101</span><span class="w"> </span><span class="c"># Look for hard coded credentials</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G102</span><span class="w"> </span><span class="c"># Bind to all interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G103</span><span class="w"> </span><span class="c"># Audit the use of unsafe block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G104</span><span class="w"> </span><span class="c"># Audit errors not checked</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G106</span><span class="w"> </span><span class="c"># Audit the use of ssh.InsecureIgnoreHostKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G107</span><span class="w"> </span><span class="c"># Url provided to HTTP request as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G108</span><span class="w"> </span><span class="c"># Profiling endpoint automatically exposed on /debug/pprof</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G109</span><span class="w"> </span><span class="c"># Potential Integer overflow made by strconv.Atoi result conversion to int16/32</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G110</span><span class="w"> </span><span class="c"># Potential DoS vulnerability via decompression bomb</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G111</span><span class="w"> </span><span class="c"># Potential directory traversal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G112</span><span class="w"> </span><span class="c"># Potential slowloris attack</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G114</span><span class="w"> </span><span class="c"># Use of net/http serve function that has no support for setting timeouts</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G115</span><span class="w"> </span><span class="c"># Potential integer overflow when converting between integer types</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G201</span><span class="w"> </span><span class="c"># SQL query construction using format string</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G202</span><span class="w"> </span><span class="c"># SQL query construction using string concatenation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G203</span><span class="w"> </span><span class="c"># Use of unescaped data in HTML templates</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G204</span><span class="w"> </span><span class="c"># Audit use of command execution</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G301</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a directory</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G302</span><span class="w"> </span><span class="c"># Poor file permissions used with chmod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G303</span><span class="w"> </span><span class="c"># Creating tempfile using a predictable path</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G304</span><span class="w"> </span><span class="c"># File path provided as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G305</span><span class="w"> </span><span class="c"># File traversal when extracting zip/tar archive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G306</span><span class="w"> </span><span class="c"># Poor file permissions used when writing to a new file</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G307</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a file with os.Create</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G401</span><span class="w"> </span><span class="c"># Detect the usage of MD5 or SHA1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G402</span><span class="w"> </span><span class="c"># Look for bad TLS connection settings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G403</span><span class="w"> </span><span class="c"># Ensure minimum RSA key length of 2048 bits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G404</span><span class="w"> </span><span class="c"># Insecure random number source (rand)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G405</span><span class="w"> </span><span class="c"># Detect the usage of DES or RC4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G406</span><span class="w"> </span><span class="c"># Detect the usage of MD4 or RIPEMD160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G501 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/md5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G502 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/des</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G503 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/rc4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G504 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">net/http/cgi</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G505 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/sha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G506 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/md4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G507 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/ripemd160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G601</span><span class="w"> </span><span class="c"># Implicit memory aliasing of items from a range statement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G602</span><span class="w"> </span><span class="c"># Slice access out of bounds</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To specify a set of rules to explicitly exclude.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Available rules: https://github.com/securego/gosec#available-rules</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">excludes</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G101</span><span class="w"> </span><span class="c"># Look for hard coded credentials</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G102</span><span class="w"> </span><span class="c"># Bind to all interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G103</span><span class="w"> </span><span class="c"># Audit the use of unsafe block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G104</span><span class="w"> </span><span class="c"># Audit errors not checked</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G106</span><span class="w"> </span><span class="c"># Audit the use of ssh.InsecureIgnoreHostKey</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G107</span><span class="w"> </span><span class="c"># Url provided to HTTP request as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G108</span><span class="w"> </span><span class="c"># Profiling endpoint automatically exposed on /debug/pprof</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G109</span><span class="w"> </span><span class="c"># Potential Integer overflow made by strconv.Atoi result conversion to int16/32</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G110</span><span class="w"> </span><span class="c"># Potential DoS vulnerability via decompression bomb</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G111</span><span class="w"> </span><span class="c"># Potential directory traversal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G112</span><span class="w"> </span><span class="c"># Potential slowloris attack</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G114</span><span class="w"> </span><span class="c"># Use of net/http serve function that has no support for setting timeouts</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G115</span><span class="w"> </span><span class="c"># Potential integer overflow when converting between integer types</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G201</span><span class="w"> </span><span class="c"># SQL query construction using format string</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G202</span><span class="w"> </span><span class="c"># SQL query construction using string concatenation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G203</span><span class="w"> </span><span class="c"># Use of unescaped data in HTML templates</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G204</span><span class="w"> </span><span class="c"># Audit use of command execution</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G301</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a directory</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G302</span><span class="w"> </span><span class="c"># Poor file permissions used with chmod</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G303</span><span class="w"> </span><span class="c"># Creating tempfile using a predictable path</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G304</span><span class="w"> </span><span class="c"># File path provided as taint input</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G305</span><span class="w"> </span><span class="c"># File traversal when extracting zip/tar archive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G306</span><span class="w"> </span><span class="c"># Poor file permissions used when writing to a new file</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G307</span><span class="w"> </span><span class="c"># Poor file permissions used when creating a file with os.Create</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G401</span><span class="w"> </span><span class="c"># Detect the usage of MD5 or SHA1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G402</span><span class="w"> </span><span class="c"># Look for bad TLS connection settings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G403</span><span class="w"> </span><span class="c"># Ensure minimum RSA key length of 2048 bits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G404</span><span class="w"> </span><span class="c"># Insecure random number source (rand)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G405</span><span class="w"> </span><span class="c"># Detect the usage of DES or RC4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G406</span><span class="w"> </span><span class="c"># Detect the usage of MD4 or RIPEMD160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G501 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/md5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G502 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/des</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G503 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/rc4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G504 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">net/http/cgi</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G505 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">crypto/sha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G506 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/md4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">G507 # Import blocklist</span><span class="p">:</span><span class="w"> </span><span class="l">golang.org/x/crypto/ripemd160</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G601</span><span class="w"> </span><span class="c"># Implicit memory aliasing of items from a range statement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">G602</span><span class="w"> </span><span class="c"># Slice access out of bounds</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Filter out the issues with a lower severity than the given value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Valid options are: low, medium, high.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: low</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">medium</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Filter out the issues with a lower confidence than the given value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Valid options are: low, medium, high.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: low</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">confidence</span><span class="p">:</span><span class="w"> </span><span class="l">medium</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Concurrency value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: the number of logical CPUs usable by the current process.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">concurrency</span><span class="p">:</span><span class="w"> </span><span class="m">12</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To specify the configuration of rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Globals are applicable to all rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">global</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, ignore #nosec in comments (and an alternative as well).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nosec</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Add an alternative comment prefix to #nosec (both will work at the same time).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">&#34;#nosec&#34;: </span><span class="s2">&#34;#my-custom-nosec&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Define whether nosec issues are counted as finding or not.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-ignored</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Audit mode enables addition checks that for normal code analysis might be too nosy.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">audit</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G101</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp pattern for variables and constants to find.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;(?i)example&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, complain about all cases (even with low entropy).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore_entropy</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed entropy of the string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;80.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">entropy_threshold</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;80.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed value of entropy/string length.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Is taken into account if entropy &gt;= entropy_threshold/2.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;3.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">per_char_threshold</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3.0&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Calculate entropy for first N chars of the string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;16&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">truncate</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;32&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Additional functions to ignore while checking unhandled errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Following functions always ignored:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># bytes.Buffer:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Write</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># fmt:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Print</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Printf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Println</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Fprint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Fprintf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Fprintln</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># strings.Builder:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Write</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteByte</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteRune</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - WriteString</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># io.PipeWriter:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - CloseWithError</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># hash.Hash:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Write</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># os:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - Unsetenv</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: {}</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G104</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Fscanf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G111</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp pattern to find potential directory traversal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;http\\.Dir\\(\&#34;\\/\&#34;\\)|http\\.Dir\\(&#39;\\/&#39;\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;custom\\.Dir\\(\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed permissions mode for os.Mkdir and os.MkdirAll.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;0750&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G301</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0750&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed permissions mode for os.OpenFile and os.Chmod.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;0600&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G302</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0600&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;0600&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">G306</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0600&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>gosmopolitan<span class="hx:absolute hx:-mt-20" id="gosmopolitan"></span> +<a href="#gosmopolitan" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Report certain i18n/l10n anti-patterns in your Go codebase.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<a href="https://github.com/xen0n/gosmopolitan" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gosmopolitan</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow and ignore `time.Local` usages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-time-local</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of fully qualified names in the `full/pkg/path.name` form, to act as &#34;i18n escape hatches&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># String literals inside call-like expressions to, or struct literals of those names,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># are exempt from the writing system check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">escape-hatches</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;github.com/nicksnyder/go-i18n/v2/i18n.Message&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example.com/your/project/i18n/markers.Raw&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example.com/your/project/i18n/markers.OK&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;example.com/your/project/i18n/markers.TODO&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;command-line-arguments.Simple&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of Unicode scripts to watch for any usage in string literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://pkg.go.dev/unicode#pkg-variables</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;Han&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">watch-for-scripts</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Devanagari</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Han</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Hangul</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Hiragana</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Katakana</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>govet<span class="hx:absolute hx:-mt-20" id="govet"></span> +<a href="#govet" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://pkg.go.dev/cmd/vet" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable all analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable analyzers by name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># appends, asmdecl, assign, atomic, bools, buildtag, cgocall, composites, copylocks, defers, directive, errorsas,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># framepointer, httpresponse, ifaceassert, loopclosure, lostcancel, nilfunc, printf, shift, sigchanyzer, slog,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># stdmethods, stringintconv, structtag, testinggoroutine, tests, timeformat, unmarshal, unreachable, unsafeptr,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># unusedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for missing values after append.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appends</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report mismatches between assembly files and Go declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asmdecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for useless assignments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for common mistakes using the sync/atomic package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for non-64-bits-aligned arguments to sync/atomic functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomicalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for common mistakes involving boolean operators.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bools</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check //go:build and // +build directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">buildtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detect some violations of the cgo pointer passing rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cgocall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unkeyed composite literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">composites</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for locks erroneously passed by value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copylocks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for calls of reflect.DeepEqual on error values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deepequalerrors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report common mistakes in defer statements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check Go toolchain directives such as //go:debug.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">directive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report passing non-pointer or non-error values to errors.As.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorsas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Find structs that would use less memory if their fields were sorted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fieldalignment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Find calls to a particular function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">findcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report assembly that clobbers the frame pointer before saving it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">framepointer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check format of addresses passed to net.Dial.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report using Go 1.22 enhanced ServeMux patterns in older Go versions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpmux</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for mistakes using HTTP responses.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpresponse</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Detect impossible interface-to-interface type assertions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifaceassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check references to loop variables from within nested functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loopclosure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check cancel func returned by context.WithCancel is called.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lostcancel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for useless comparisons between functions and nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilfunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for redundant or impossible nil comparisons.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilness</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check consistency of Printf format strings and arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">printf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for comparing reflect.Value values with == or reflect.DeepEqual.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reflectvaluecompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for possible unintended shadowing of variables.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for shifts that equal or exceed the width of the integer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shift</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unbuffered channel of os.Signal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sigchanyzer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for invalid structured logging calls.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">slog</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check the argument type of sort.Slice.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check signature of methods of well-known interfaces.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdmethods</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report uses of too-new standard library symbols.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdversion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for string(int) conversions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringintconv</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check that struct field tags conform to reflect.StructTag.Get.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">structtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report calls to (*testing.T).Fatal from goroutines started by a test.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testinggoroutine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for common mistaken usages of tests and examples.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tests</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for calls of (time.Time).Format or time.Parse with 2006-02-01.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeformat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report passing non-pointer or non-interface values to unmarshal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unmarshal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unreachable code.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unreachable</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for invalid conversions of uintptr to unsafe.Pointer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unsafeptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for unused results of calls to some functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks for unused writes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedwrite</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check for misuses of sync.WaitGroup.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">waitgroup</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable analyzers by name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># atomicalign, deepequalerrors, fieldalignment, findcall, nilness, reflectvaluecompare, shadow, sortslice,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># timeformat, unusedwrite</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">appends</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asmdecl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">atomicalign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bools</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">buildtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cgocall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">composites</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">copylocks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">deepequalerrors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">directive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errorsas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fieldalignment</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">findcall</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">framepointer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">hostport</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpmux</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">httpresponse</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ifaceassert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loopclosure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lostcancel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilfunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nilness</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">printf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">reflectvaluecompare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shadow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shift</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sigchanyzer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">slog</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">sortslice</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdmethods</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stdversion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stringintconv</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">structtag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">testinggoroutine</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">tests</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">timeformat</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unmarshal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unreachable</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unsafeptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedresult</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unusedwrite</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">waitgroup</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Settings per analyzer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Analyzer name, run `go tool vet help` to see all analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">printf</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funcs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shadow</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to be strict about shadowing; can be noisy.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unusedresult</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of functions whose results must be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, errors.New, fmt.Errorf,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># fmt.Sprint, fmt.Sprintf, sort.Reverse</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">funcs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">pkg.MyFunc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comma-separated list of names of methods of type func() string whose results must be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (In addition to default Error,String).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">stringmethods</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">MyMethod</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>grouper<span class="hx:absolute hx:-mt-20" id="grouper"></span> +<a href="#grouper" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Analyze expression groups.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/leonklingele/grouper" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">grouper</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single global &#39;const&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">const-require-single-const</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped global &#39;const&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">const-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single &#39;import&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import-require-single-import</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped &#39;import&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single global &#39;type&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type-require-single-type</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped global &#39;type&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of a single global &#39;var&#39; declaration only.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">var-require-single-var</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require the use of grouped global &#39;var&#39; declarations.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">var-require-grouping</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>iface<span class="hx:absolute hx:-mt-20" id="iface"></span> +<a href="#iface" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detect the incorrect use of interfaces, helping developers avoid interface pollution.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.62.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/uudashr/iface" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">iface</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of analyzers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;identical&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">identical</span><span class="w"> </span><span class="c"># Identifies interfaces in the same package that have identical method sets.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unused</span><span class="w"> </span><span class="c"># Identifies interfaces that are not used anywhere in the same package where the interface is defined.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">opaque</span><span class="w"> </span><span class="c"># Identifies functions that return interfaces, but the actual returned value is always a single concrete implementation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unexported</span><span class="w"> </span><span class="c"># Identifies interfaces that are not exported but are used in exported functions or methods.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unused</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of packages path to exclude from the check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/example/log</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>importas<span class="hx:absolute hx:-mt-20" id="importas"></span> +<a href="#importas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Enforces consistent import aliases.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/julz/importas" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">importas</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Do not allow unaliased imports of aliased packages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-unaliased</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Do not allow non-required aliases.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-extra-aliases</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of aliases</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">knative.dev/serving/pkg/apis/serving/v1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">servingv1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">knative.dev/serving/pkg/apis/autoscaling/v1alpha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">autoscalingv1alpha1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># You can specify the package path by regular expression,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and alias by regular expression expansion syntax like below.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/julz/importas#use-regular-expression for details.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">knative.dev/serving/pkg/apis/(\w+)/(v[\w\d]+)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="l">$1$2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An explicit empty alias can be used to ensure no aliases are used for a package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This can be useful if `no-extra-aliases: true` doesn&#39;t fit your need.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Multiple packages can use an empty alias.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">alias</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>inamedparam<span class="hx:absolute hx:-mt-20" id="inamedparam"></span> +<a href="#inamedparam" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports interfaces with unnamed method parameters.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<a href="https://github.com/macabu/inamedparam" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">inamedparam</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skips check for interface methods with only a single parameter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-single-param</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>ineffassign<span class="hx:absolute hx:-mt-20" id="ineffassign"></span> +<a href="#ineffassign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects when assignments to existing variables are not used.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/gordonklaus/ineffassign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ineffassign</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check escaping variables of type error, may cause false positives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-escaping-errors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>interfacebloat<span class="hx:absolute hx:-mt-20" id="interfacebloat"></span> +<a href="#interfacebloat" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter that checks the number of methods inside an interface.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.49.0</div> +</div> +<a href="https://github.com/sashamelentyev/interfacebloat" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interfacebloat</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The maximum number of methods allowed for an interface.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 10</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max</span><span class="p">:</span><span class="w"> </span><span class="m">5</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>intrange<span class="hx:absolute hx:-mt-20" id="intrange"></span> +<a href="#intrange" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Intrange is a linter to find places where for loops could make use of an integer range.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.57.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ckaznocha/intrange" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>iotamixing<span class="hx:absolute hx:-mt-20" id="iotamixing"></span> +<a href="#iotamixing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks if iotas are being used in const blocks with other non-iota declarations.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.5.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>New</div> +</div> +<a href="https://github.com/AdminBenni/iota-mixing" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">iotamixing</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether to report individual consts rather than just the const block.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-individual</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>ireturn<span class="hx:absolute hx:-mt-20" id="ireturn"></span> +<a href="#ireturn" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Accept Interfaces, Return Concrete Types.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/butuzov/ireturn" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ireturn</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of interfaces to allow.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Lists of the keywords and regular expressions matched to interface or package names can be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `allow` and `reject` settings cannot be used at the same time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `empty` for `interface{}`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `error` for errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `stdlib` for standard library</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `anon` for anonymous interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `generic` for generic interfaces added in go 1.18</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [anon, error, empty, stdlib]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">anon</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># You can specify idiomatic endings for interface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(or|er)$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of interfaces to reject.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Lists of the keywords and regular expressions matched to interface or package names can be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `allow` and `reject` settings cannot be used at the same time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Keywords:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `empty` for `interface{}`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `error` for errors</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `stdlib` for standard library</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `anon` for anonymous interfaces</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `generic` for generic interfaces added in go 1.18</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reject</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com\/user\/package\/v4\.Type</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>lll<span class="hx:absolute hx:-mt-20" id="lll"></span> +<a href="#lll" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports long lines.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.8.0</div> +</div> +</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">lll</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Max line length, lines longer will be reported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;\t&#39; is counted as 1 character by default, and can be changed with the tab-width option.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 120.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">line-length</span><span class="p">:</span><span class="w"> </span><span class="m">120</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Tab width in spaces.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab-width</span><span class="p">:</span><span class="w"> </span><span class="m">1</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>loggercheck<span class="hx:absolute hx:-mt-20" id="loggercheck"></span> +<a href="#loggercheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks key value pairs for common logger libraries (kitlog,klog,logr,slog,zap).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.49.0</div> +</div> +<a href="https://github.com/timonwong/loggercheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">loggercheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the github.com/go-kit/log library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">kitlog</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the k8s.io/klog/v2 library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">klog</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the github.com/go-logr/logr library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">logr</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the log/slog library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">slog</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow check for the &#34;sugar logger&#34; from go.uber.org/zap library.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">zap</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require all logging keys to be inlined constant strings.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-string-key</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Require printf-like format specifier (%s, %d for example) not present.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-printf-like</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">k8s.io/klog/v2.InfoS</span><span class="w"> </span><span class="c"># package level exported functions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(github.com/go-logr/logr.Logger).Error</span><span class="w"> </span><span class="c"># &#34;Methods&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">(*go.uber.org/zap.SugaredLogger).With</span><span class="w"> </span><span class="c"># Also &#34;Methods&#34;, but with a pointer receiver</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>maintidx<span class="hx:absolute hx:-mt-20" id="maintidx"></span> +<a href="#maintidx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Maintidx measures the maintainability index of each function.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.44.0</div> +</div> +<a href="https://github.com/yagipy/maintidx" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">maintidx</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Show functions with maintainability index lower than N.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A high index indicates better maintainability (it&#39;s kind of the opposite of complexity).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 20</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">under</span><span class="p">:</span><span class="w"> </span><span class="m">100</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>makezero<span class="hx:absolute hx:-mt-20" id="makezero"></span> +<a href="#makezero" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find slice declarations with non-zero initial length.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.34.0</div> +</div> +<a href="https://github.com/ashanbrown/makezero" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">makezero</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow only slices initialized with a length of zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">always</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>mirror<span class="hx:absolute hx:-mt-20" id="mirror"></span> +<a href="#mirror" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports wrong mirror patterns of bytes/strings usage.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/butuzov/mirror" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>misspell<span class="hx:absolute hx:-mt-20" id="misspell"></span> +<a href="#misspell" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Finds commonly misspelled English words.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.8.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/golangci/misspell" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">misspell</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Correct spellings using locale preferences for US or UK.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Setting locale to US will correct the British spelling of &#39;colour&#39; to &#39;color&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default is to use a neutral variety of English.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">locale</span><span class="p">:</span><span class="w"> </span><span class="l">US</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Typos to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Should be in lower case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">someword</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Extra word corrections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `typo` and `correction` should only contain letters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The words are case-insensitive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-words</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">typo</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;iff&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">correction</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;if&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">typo</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;cancelation&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">correction</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;cancellation&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mode of the analysis:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - default: checks all the file content.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - restricted: checks only comments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">restricted</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>mnd<span class="hx:absolute hx:-mt-20" id="mnd"></span> +<a href="#mnd" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>An analyzer to detect magic numbers.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.22.0</div> +</div> +<a href="https://github.com/tommy-muehle/go-mnd" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mnd</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;argument&#34;, &#34;case&#34;, &#34;condition&#34;, &#34;operation&#34;, &#34;return&#34;, &#34;assign&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">argument</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">case</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">condition</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">operation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of numbers to exclude from analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The numbers should be written as string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values always ignored: &#34;1&#34;, &#34;1.0&#34;, &#34;0&#34; and &#34;0.0&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-numbers</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;0666&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;0755&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;42&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of file patterns to exclude from analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values always ignored: `.+_test.go`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;magic1_.+\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of function patterns to exclude from analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Following functions are always ignored: `time.Date`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^math\.&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^http\.StatusText$&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>musttag<span class="hx:absolute hx:-mt-20" id="musttag"></span> +<a href="#musttag" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Enforce field tags in (un)marshaled structs.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.51.0</div> +</div> +<a href="https://github.com/go-simpler/musttag" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">musttag</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A set of custom functions to check in addition to the builtin ones.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: json, xml, gopkg.in/yaml.v3, BurntSushi/toml, mitchellh/mapstructure, jmoiron/sqlx</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The full name of the function, including the package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/hashicorp/hcl/v2/hclsimple.DecodeFile</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The struct tag whose presence should be ensured.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tag</span><span class="p">:</span><span class="w"> </span><span class="l">hcl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The position of the argument to check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arg-pos</span><span class="p">:</span><span class="w"> </span><span class="m">2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nakedret<span class="hx:absolute hx:-mt-20" id="nakedret"></span> +<a href="#nakedret" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that functions with naked returns are not longer than a maximum size (can be zero).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/alexkohler/nakedret" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nakedret</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Make an issue if func has more lines of code than this setting, and it has naked returns.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 30</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-func-lines</span><span class="p">:</span><span class="w"> </span><span class="m">31</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nestif<span class="hx:absolute hx:-mt-20" id="nestif"></span> +<a href="#nestif" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports deeply nested if statements.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<a href="https://github.com/nakabonne/nestif" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nestif</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Minimal complexity of if statements to report.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-complexity</span><span class="p">:</span><span class="w"> </span><span class="m">4</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nilerr<span class="hx:absolute hx:-mt-20" id="nilerr"></span> +<a href="#nilerr" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find the code that returns nil even if it checks that the error is not nil.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<a href="https://github.com/gostaticanalysis/nilerr" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>nilnesserr<span class="hx:absolute hx:-mt-20" id="nilnesserr"></span> +<a href="#nilnesserr" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports constructs that checks for err != nil, but returns a different nil value error. +Powered by nilness and nilerr.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.63.0</div> +</div> +<a href="https://github.com/alingse/nilnesserr" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>nilnil<span class="hx:absolute hx:-mt-20" id="nilnil"></span> +<a href="#nilnil" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that there is no simultaneous return of <code>nil</code> error and an invalid value.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/Antonboom/nilnil" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nilnil</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To check functions with only two return values (`return nil, nil`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If disabled then returns like `return nil, nil, ..., nil` are supported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">only-two</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># In addition, detect opposite situation (simultaneous return of non-nil error and valid value).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># E.g, `return clone, fh.indexer.Update(clone)` will be considered as invalid.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">detect-opposite</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of return types to check.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;chan&#34;, &#34;func&#34;, &#34;iface&#34;, &#34;map&#34;, &#34;ptr&#34;, &#34;uintptr&#34;, &#34;unsafeptr&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checked-types</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">chan</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">func</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">iface</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">map</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">uintptr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">unsafeptr</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nlreturn<span class="hx:absolute hx:-mt-20" id="nlreturn"></span> +<a href="#nlreturn" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for a new line before return and branch statements to increase code clarity.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.30.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ssgreg/nlreturn" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nlreturn</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Size of the block (including return statement that is still &#34;OK&#34;),</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># so no return split required.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">block-size</span><span class="p">:</span><span class="w"> </span><span class="m">2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>noctx<span class="hx:absolute hx:-mt-20" id="noctx"></span> +<a href="#noctx" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects function and method with missing usage of context.Context.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<a href="https://github.com/sonatard/noctx" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>noinlineerr<span class="hx:absolute hx:-mt-20" id="noinlineerr"></span> +<a href="#noinlineerr" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Disallows inline error handling (<code>if err := ...; err != nil {</code>).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<a href="https://github.com/AlwxSin/noinlineerr" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>nolintlint<span class="hx:absolute hx:-mt-20" id="nolintlint"></span> +<a href="#nolintlint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports ill-formed or insufficient nolint directives.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.26.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/golangci/golangci-lint/tree/HEAD/pkg/golinters/nolintlint/internal" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nolintlint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable to ensure that all nolint directives actually have an effect.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-unused</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Exclude following linters from requiring an explanation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-no-explanation</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable to require an explanation of nonzero length after each nolint directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-explanation</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable to require nolint directives to mention the specific linter being suppressed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-specific</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nonamedreturns<span class="hx:absolute hx:-mt-20" id="nonamedreturns"></span> +<a href="#nonamedreturns" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports all named returns.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.46.0</div> +</div> +<a href="https://github.com/firefart/nonamedreturns" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">nonamedreturns</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report named error if it is assigned inside defer.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-error-in-defer</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>nosprintfhostport<span class="hx:absolute hx:-mt-20" id="nosprintfhostport"></span> +<a href="#nosprintfhostport" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for misuse of Sprintf to construct a host with port in a URL.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.46.0</div> +</div> +<a href="https://github.com/stbenjam/no-sprintf-host-port" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>paralleltest<span class="hx:absolute hx:-mt-20" id="paralleltest"></span> +<a href="#paralleltest" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects missing usage of t.Parallel() method in your Go test.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.33.0</div> +</div> +<a href="https://github.com/kunwardeep/paralleltest" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paralleltest</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-missing</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># still required to have `t.Parallel`, but subtests are allowed to skip it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-missing-subtests</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>perfsprint<span class="hx:absolute hx:-mt-20" id="perfsprint"></span> +<a href="#perfsprint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that fmt.Sprintf can be replaced with a faster alternative.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/catenacyber/perfsprint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">perfsprint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of integer formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">integer-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes even if it requires an int or uint type cast.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">int-conversion</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of error formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">error-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">err-error</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes `fmt.Errorf`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errorf</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of string formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">string-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes `fmt.Sprintf` with only one argument.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sprintf1</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optimizes into strings concatenation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strconcat</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of bool formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bool-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable optimization of hex formatting.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">hex-format</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>prealloc<span class="hx:absolute hx:-mt-20" id="prealloc"></span> +<a href="#prealloc" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find slice declarations that could potentially be pre-allocated.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<a href="https://github.com/alexkohler/prealloc" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">prealloc</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># IMPORTANT: we don&#39;t recommend using this linter before doing performance profiling.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For most programs usage of prealloc will be a premature optimization.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simple</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report pre-allocation suggestions on range loops.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">range-loops</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Report pre-allocation suggestions on for loops.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for-loops</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>predeclared<span class="hx:absolute hx:-mt-20" id="predeclared"></span> +<a href="#predeclared" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Find code that shadows one of Go's predeclared identifiers.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.35.0</div> +</div> +<a href="https://github.com/nishanths/predeclared" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of predeclared identifiers to not report on.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Include method names and field names in checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">qualified-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>promlinter<span class="hx:absolute hx:-mt-20" id="promlinter"></span> +<a href="#promlinter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check Prometheus metrics naming via promlint.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.40.0</div> +</div> +<a href="https://github.com/yeya24/promlinter" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">promlinter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Promlinter cannot infer all metrics name in static analysis.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable strict mode will also include the errors caused by failing to parse the args.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Please refer to https://github.com/yeya24/promlinter#usage for detailed usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled-linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Help detects issues related to the help text for a metric.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Help</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># MetricUnits detects issues with metric unit names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">MetricUnits</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Counter detects issues specific to counters, as well as patterns that should only be used with counters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Counter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># HistogramSummaryReserved detects when other types of metrics use names or labels reserved for use by histograms and/or summaries.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">HistogramSummaryReserved</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># MetricTypeInName detects when metric types are included in the metric name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">MetricTypeInName</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ReservedChars detects colons in metric names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ReservedChars</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># CamelCase detects metric names and label names written in camelCase.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">CamelCase</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># UnitAbbreviations detects abbreviated units in the metric name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">UnitAbbreviations</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>protogetter<span class="hx:absolute hx:-mt-20" id="protogetter"></span> +<a href="#protogetter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports direct reads from proto message fields when getters should be used.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ghostiam/protogetter" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">protogetter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip files generated by specified generators from the checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks only the file&#39;s initial comment, which must follow the format: &#34;// Code generated by &lt;generator-name&gt;&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Files generated by protoc-gen-go, protoc-gen-go-grpc, and protoc-gen-grpc-gateway are always excluded automatically.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-generated-by</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;protoc-gen-go-my-own-generator&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip files matching the specified glob pattern from the checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;*.pb.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;*/vendor/*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;/full/path/to/file.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip any generated files from the checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-any-generated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Skip first argument of append function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replace-first-arg-in-append</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>reassign<span class="hx:absolute hx:-mt-20" id="reassign"></span> +<a href="#reassign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that package variables are not reassigned.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.49.0</div> +</div> +<a href="https://github.com/curioswitch/go-reassign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">reassign</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Patterns for global variable names that are checked for reassignment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/curioswitch/go-reassign#usage</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;EOF&#34;, &#34;Err.*&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">patterns</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;.*&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>recvcheck<span class="hx:absolute hx:-mt-20" id="recvcheck"></span> +<a href="#recvcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for receiver type consistency.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.62.0</div> +</div> +<a href="https://github.com/raeperd/recvcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">recvcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disables the built-in method exclusions:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalText`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalJSON`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalYAML`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalXML`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `MarshalBinary`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `GobEncode`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-builtin</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># User-defined method exclusions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The format is `struct_name.method_name` (ex: `Foo.MethodName`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A wildcard `*` can use as a struct name (ex: `*.MethodName`).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;*.Value&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>revive<span class="hx:absolute hx:-mt-20" id="revive"></span> +<a href="#revive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.37.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/mgechev/revive" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">revive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Maximum number of open files at the same time.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/mgechev/revive#command-line-flags</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defaults to unlimited.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-open-files</span><span class="p">:</span><span class="w"> </span><span class="m">2048</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Sets the default severity.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/mgechev/revive#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all available rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all-rules</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable validation of comment directives.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/mgechev/revive#comment-directives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">directives</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">specify-disable-reason</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Sets the default failure confidence.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This means that linting errors with less than 0.8 confidence will be ignored.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0.8</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">confidence</span><span class="p">:</span><span class="w"> </span><span class="m">0.1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Revive handles the default rules in a way that can be unexpected:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - If there are no explicit rules, the default rules are used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - If there is at least one explicit rule, the default rules are not used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#add-constant</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">add-constant</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">max-lit-count</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-strs</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&#34;&#34;&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-ints</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0,1,2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-floats</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;0.0,0.,1.0,1.,2.0,2.&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#argument-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">argument-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">4</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">atomic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#banned-characters</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">banned-characters</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;Ω&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Σ&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;σ&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;7&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bare-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">bare-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#blank-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">blank-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bool-literal-in-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">bool-literal-in-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#call-to-gc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">call-to-gc</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cognitive-complexity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cognitive-complexity</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">7</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comment-spacings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">comment-spacings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mypragma</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">otherpragma</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comments-density</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">comments-density</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">15</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">confusing-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-results</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">confusing-results</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#constant-logical-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">constant-logical-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-as-argument</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">context-as-argument</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-types-before</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;*testing.T,*github.com/user/repo/testing.Harness&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-keys-type</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">context-keys-type</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cyclomatic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cyclomatic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#datarace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">datarace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#deep-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">deep-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;call-chain&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;loop&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;method-call&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;recover&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;immediate-recover&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;return&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#dot-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dot-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allowed-packages</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;github.com/onsi/ginkgo/v2&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;github.com/onsi/gomega&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#duplicated-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">duplicated-imports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#early-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">early-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;preserve-scope&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;allow-jump&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">empty-block</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-lines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">empty-lines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-map-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-map-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;make&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-repeated-arg-type-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-repeated-arg-type-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;short&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Or this parameter:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">func-arg-style</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;full&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">func-ret-val-style</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;short&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-slice-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-slice-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;make&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-switch-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">enforce-switch-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;allowNoDefault&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">error-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">error-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-strings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">error-strings</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;xerrors.New&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#errorf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">errorf</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#exported</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">exported</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;check-private-receivers&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-stuttering-check&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;say-repetitive-instead-of-stutters&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;check-public-interface&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-constants&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-functions&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-methods&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-types&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;disable-checks-on-variables&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-header</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">file-header</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">This is the text that must appear at the top of source files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">file-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">max</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-blank-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#filename-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">filename-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^[_a-z][_a-z0-9]*\\.go$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#flag-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">flag-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-length</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">function-length</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">10</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-result-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">function-result-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#get-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">get-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-ifelseif-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-ifelseif-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-switch-branches</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">identical-switch-conditions</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#if-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">if-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-alias-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">import-alias-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^[a-z][a-z0-9]{0,}$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Or this parameter:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^[a-z][a-z0-9]{0,}$&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">deny-regex</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^v\d+$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-shadowing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">import-shadowing</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#imports-blocklist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">imports-blocklist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;crypto/md5&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;crypto/sha1&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#increment-decrement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">increment-decrement</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#indent-error-flow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">indent-error-flow</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;preserve-scope&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#line-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">line-length-limit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">80</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-control-nesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">max-control-nesting</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-public-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">max-public-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="m">3</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">modifies-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-value-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">modifies-value-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#nested-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nested-structs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#optimize-operands-order</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">optimize-operands-order</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">package-comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-directory-mismatch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">package-directory-mismatch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">ignore-directories</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;testcases&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;testinfo&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-address</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">range-val-address</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-in-closure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">range-val-in-closure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#receiver-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">receiver-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">max-length</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redefines-builtin-id</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redefines-builtin-id</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-build-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redundant-build-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-import-alias</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redundant-import-alias</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-test-main-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">redundant-test-main-exit</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">string-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="s1">&#39;core.WriteError[1].Message&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;/^([^A-Z]|$)/&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">must not start with a capital letter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="s1">&#39;fmt.Errorf[0]&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;/(^|[^\.!?])$/&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">must not end in punctuation</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="l">panic</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;/^[^\n]*$/&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">must not contain line breaks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-of-int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">string-of-int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#struct-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">struct-tag</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;json,inline&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;bson,outline,gnu&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#superfluous-else</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">superfluous-else</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;preserve-scope&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-date</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">time-date</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-equal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">time-equal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">time-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unchecked-type-assertion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unchecked-type-assertion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">accept-ignored-assertion-result</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unconditional-recursion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unconditional-recursion</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unexported-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unexported-return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unhandled-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unhandled-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;^fmt.Printf&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;myFunction&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unnecessary-format</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-stmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unnecessary-stmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unreachable-code</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unreachable-code</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unsecure-url-scheme</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unsecure-url-scheme</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unused-parameter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^_&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">unused-receiver</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">allow-regex</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^_&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-any</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-any</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-errors-new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-errors-new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-fmt-print</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-fmt-print</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-waitgroup-go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">use-waitgroup-go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-break</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">useless-break</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-fallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">useless-fallthrough</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-declaration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">var-declaration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">var-naming</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">arguments</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="p">[</span><span class="s2">&#34;ID&#34;</span><span class="p">]</span><span class="w"> </span><span class="c"># AllowList</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="p">[</span><span class="s2">&#34;VM&#34;</span><span class="p">]</span><span class="w"> </span><span class="c"># DenyList</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- - <span class="nt">skip-initialism-name-checks</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">upper-case-const</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-package-name-checks</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-bad-package-names</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">helpers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">models</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#waitgroup-by-value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">waitgroup-by-value</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>rowserrcheck<span class="hx:absolute hx:-mt-20" id="rowserrcheck"></span> +<a href="#rowserrcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks whether Rows.Err of rows is checked successfully.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.23.0</div> +</div> +<a href="https://github.com/jingyugao/rowserrcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rowserrcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># database/sql is always checked.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">packages</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/jmoiron/sqlx</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>sloglint<span class="hx:absolute hx:-mt-20" id="sloglint"></span> +<a href="#sloglint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Ensure consistent code style when using log/slog.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/go-simpler/sloglint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sloglint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce not mixing key-value pairs and attributes.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-mixed-arguments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-mixed-args</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-value-pairs-only</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">kv-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#attributes-only</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">attr-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce not using global loggers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;&#34;: disabled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;all&#34;: report all global loggers</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;default&#34;: report only the default slog logger</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-global</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;all&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using methods that accept a context.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;&#34;: disabled</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;all&#34;: report all contextless calls</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;scope&#34;: report only if a context exists in the scope of the outermost function</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;all&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using static values for log messages.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#static-messages</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">static-msg</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce message style.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values: lowercased, capitalized</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#message-style</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg-style</span><span class="p">:</span><span class="w"> </span><span class="l">capitalized</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce using constants instead of raw keys.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-raw-keys</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">no-raw-keys</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce key naming convention.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Values: snake, kebab, camel, pascal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-naming-convention</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">key-naming-case</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce not using specific keys.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#forbidden-keys</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidden-keys</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">time</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">level</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">msg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">source</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforce putting arguments on separate lines.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/go-simpler/sloglint?tab=readme-ov-file#arguments-on-separate-lines</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">args-on-sep-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>spancheck<span class="hx:absolute hx:-mt-20" id="spancheck"></span> +<a href="#spancheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks for mistakes with OpenTelemetry/Census spans.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.56.0</div> +</div> +<a href="https://github.com/jjti/go-spancheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">spancheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks to enable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Options include:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `end`: check that `span.End()` is called</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `record-error`: check that `span.RecordError(err)` is called when an error is returned</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `set-status`: check that `span.SetStatus(codes.Error, msg)` is called when an error is returned</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;end&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">end</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">record-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">set-status</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A list of regexes for function signatures that silence `record-error` and `set-status` reports</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># if found in the call path to a returned error.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/jjti/go-spancheck#ignore-check-signatures</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-check-signatures</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;telemetry.RecordError&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A list of regexes for additional function signatures that create spans.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This is useful if you have a utility method to create spans.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Each entry should be of the form `&lt;regex&gt;:&lt;telemetry-type&gt;`, where `telemetry-type` can be `opentelemetry` or `opencensus`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/jjti/go-spancheck#extra-start-span-signatures</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-start-span-signatures</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;github.com/user/repo/telemetry/trace.Start:opentelemetry&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>sqlclosecheck<span class="hx:absolute hx:-mt-20" id="sqlclosecheck"></span> +<a href="#sqlclosecheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.28.0</div> +</div> +<a href="https://github.com/ryanrolds/sqlclosecheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>staticcheck<span class="hx:absolute hx:-mt-20" id="staticcheck"></span> +<a href="#staticcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It's the set of rules from staticcheck.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/dominikh/go-tools" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">staticcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/configuration/options/#dot_import_whitelist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;github.com/mmcloughlin/avo/build&#34;, &#34;github.com/mmcloughlin/avo/operand&#34;, &#34;github.com/mmcloughlin/avo/reg&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">dot-import-whitelist</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">fmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/configuration/options/#initialisms</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;ACL&#34;, &#34;API&#34;, &#34;ASCII&#34;, &#34;CPU&#34;, &#34;CSS&#34;, &#34;DNS&#34;, &#34;EOF&#34;, &#34;GUID&#34;, &#34;HTML&#34;, &#34;HTTP&#34;, &#34;HTTPS&#34;, &#34;ID&#34;, &#34;IP&#34;, &#34;JSON&#34;, &#34;QPS&#34;, &#34;RAM&#34;, &#34;RPC&#34;, &#34;SLA&#34;, &#34;SMTP&#34;, &#34;SQL&#34;, &#34;SSH&#34;, &#34;TCP&#34;, &#34;TLS&#34;, &#34;TTL&#34;, &#34;UDP&#34;, &#34;UI&#34;, &#34;GID&#34;, &#34;UID&#34;, &#34;UUID&#34;, &#34;URI&#34;, &#34;URL&#34;, &#34;UTF8&#34;, &#34;VM&#34;, &#34;XML&#34;, &#34;XMPP&#34;, &#34;XSRF&#34;, &#34;XSS&#34;, &#34;SIP&#34;, &#34;RTP&#34;, &#34;AMQP&#34;, &#34;DB&#34;, &#34;TS&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">initialisms</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;ACL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;API&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;ASCII&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;CPU&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;CSS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;DNS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;EOF&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;GUID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;HTML&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;HTTP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;HTTPS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;ID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;IP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;JSON&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;QPS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;RAM&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;RPC&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SLA&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SMTP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SQL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SSH&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TCP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TLS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TTL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UDP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UI&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;GID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UUID&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;URI&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;URL&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;UTF8&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;VM&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XML&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XMPP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XSRF&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;XSS&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;SIP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;RTP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;AMQP&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;DB&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;TS&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/configuration/options/#http_status_code_whitelist</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;200&#34;, &#34;400&#34;, &#34;404&#34;, &#34;500&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http-status-code-whitelist</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;200&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;400&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;404&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;500&#34;</span><span class="p">]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example (to disable some checks): [ &#34;all&#34;, &#34;-SA1000&#34;, &#34;-SA1001&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;all&#34;, &#34;-ST1000&#34;, &#34;-ST1003&#34;, &#34;-ST1016&#34;, &#34;-ST1020&#34;, &#34;-ST1021&#34;, &#34;-ST1022&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid regular expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid template.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid format in &#39;time.Parse&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unsupported argument to functions in &#39;encoding/binary&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suspiciously small untyped constant in &#39;time.Sleep&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid first argument to &#39;exec.Command&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;Printf&#39; with dynamic first argument and no further arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid URL in &#39;net/url.Parse&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Non-canonical key in &#39;http.Header&#39; map.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;(*regexp.Regexp).FindAll&#39; called with &#39;n == 0&#39;, which will always return zero results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Various methods in the &#34;strings&#34; package expect valid UTF-8, but invalid input is provided.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A nil &#39;context.Context&#39; is being passed to a function, consider using &#39;context.TODO&#39; instead.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;io.Seeker.Seek&#39; is being called with the whence constant as the first argument, but it should be the second.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Non-pointer value passed to &#39;Unmarshal&#39; or &#39;Decode&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using &#39;time.Tick&#39; in a way that will leak. Consider using &#39;time.NewTicker&#39;, and only use &#39;time.Tick&#39; in tests, commands and endless functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trapping a signal that cannot be trapped.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Channels used with &#39;os/signal.Notify&#39; should be buffered.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;strings.Replace&#39; called with &#39;n == 0&#39;, which does nothing.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using a deprecated function, variable, constant or field.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using an invalid host:port pair with a &#39;net.Listen&#39;-related function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using &#39;bytes.Equal&#39; to compare two &#39;net.IP&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Modifying the buffer in an &#39;io.Writer&#39; implementation.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A string cutset contains duplicate characters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># It is not possible to use &#39;(*time.Timer).Reset&#39;&#39;s return value correctly.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Cannot marshal channels or functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Atomic access to 64-bit variable must be 64-bit aligned.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;sort.Slice&#39; can only be used on slices.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Inappropriate key in call to &#39;context.WithValue&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid argument in call to a &#39;strconv&#39; function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Overlapping byte slices passed to an encoder.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Wrong order of arguments to &#39;errors.Is&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;sync.WaitGroup.Add&#39; called inside the goroutine, leading to a race condition.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Empty critical section, did you mean to defer the unlock?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Called &#39;testing.T.FailNow&#39; or &#39;SkipNow&#39; in a goroutine, which isn&#39;t allowed.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Deferred &#39;Lock&#39; right after locking, likely meant to defer &#39;Unlock&#39; instead.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA2003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA2003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;TestMain&#39; doesn&#39;t call &#39;os.Exit&#39;, hiding test failures.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA3000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA3000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assigning to &#39;b.N&#39; in benchmarks distorts the results.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA3001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA3001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Binary operator has identical expressions on both sides.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;&amp;*x&#39; gets simplified to &#39;x&#39;, it does not copy &#39;x&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing unsigned values against negative values is pointless.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The loop exits unconditionally after one iteration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Field assignment that will never be observed. Did you mean to use a pointer receiver?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The variable in the loop condition never changes, are you incrementing the wrong variable?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A function argument is overwritten before its first use.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The result of &#39;append&#39; will never be observed anywhere.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Break statement with no effect. Did you mean to break out of an outer loop?.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing a value against NaN even though no value is equal to NaN.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Negating a boolean twice (&#39;!!b&#39;) is the same as writing &#39;b&#39;. This is either redundant, or a typo.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An if/else if chain has repeated conditions and no side-effects; if the condition didn&#39;t match the first time, it won&#39;t match the second time, either.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Calling functions like &#39;math.Ceil&#39; on floats converted from integers doesn&#39;t do anything useful.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Certain bitwise operations, such as &#39;x ^ 0&#39;, do not do anything useful.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Discarding the return values of a function without side effects, making the call pointless.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Self-assignment of variables.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Multiple, identical build constraints in the same file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unreachable case clause in a type switch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#34;x = append(y)&#34; is equivalent to &#34;x = y&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing the address of a variable against nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Impossible comparison of interface value with untyped nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checking for impossible return value from a builtin function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Integer division of literals that results in zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Go constants cannot express negative zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4026</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;(*net/url.URL).Query&#39; returns a copy, modifying it doesn&#39;t change the URL.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4027</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;x % 1&#39; is always zero.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ineffective attempt at sorting slice.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ineffective attempt at generating random number.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checking never-nil value against nil.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Comparing &#39;runtime.GOOS&#39; or &#39;runtime.GOARCH&#39; against impossible value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA4032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA4032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Assignment to nil map.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Deferring &#39;Close&#39; before checking for a possible error.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The empty for loop (&#34;for {}&#34;) spins and can block the scheduler.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defers in infinite loops will never execute.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#34;for { select { ...&#34; with an empty default branch spins.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The finalizer references the finalized object, preventing garbage collection.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Infinite recursive call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid struct tag.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Invalid Printf call.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Impossible type assertion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Possible nil pointer dereference.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Passing odd-sized slice to function expecting even size.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA5012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA5012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using &#39;regexp.Match&#39; or related in a loop, should use &#39;regexp.Compile&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Missing an optimization opportunity when indexing maps by byte slices.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Storing non-pointer values in &#39;sync.Pool&#39; allocates memory.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Converting a string to a slice of runes before ranging over it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Inefficient string comparison with &#39;strings.ToLower&#39; or &#39;strings.ToUpper&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using io.WriteString to write &#39;[]byte&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA6006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA6006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defers in range loops may not run when you expect them to.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Using a non-octal &#39;os.FileMode&#39; that looks like it was meant to be in octal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Empty body in an if or else branch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Only the first constant has an explicit type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Trying to marshal a struct with no public fields nor custom marshaling.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Dubious bit shifting of a fixed size integer value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Deleting a directory that shouldn&#39;t be deleted.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &#39;else&#39; branch of a type assertion is probably not reading the right value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ineffectual Go compiler directive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#SA9009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">SA9009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Incorrect or missing package comment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Dot imports are discouraged.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen identifier.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Incorrectly formatted error string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen receiver name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A function&#39;s error value should be its last return value.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen name for variable of type &#39;time.Duration&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Poorly chosen name for error variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Should use constants for HTTP error codes, not magic numbers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1013</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># A switch&#39;s default case should be the first or last case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1015</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use consistent method receiver names.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Don&#39;t use Yoda conditions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Avoid zero-width and control characters in string literals.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Importing the same package multiple times.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The documentation of an exported function should start with the function&#39;s name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The documentation of an exported type should start with type&#39;s name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The documentation of an exported variable or constant should start with variable&#39;s name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1022</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Redundant type in variable declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#ST1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">ST1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use plain channel send or receive instead of single-case select.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace for loop with call to copy.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit comparison with boolean constant.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace call to &#39;strings.Index&#39; with &#39;strings.Contains&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace call to &#39;bytes.Compare&#39; with &#39;bytes.Equal&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Drop unnecessary use of the blank identifier.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#34;for { ... }&#34; for infinite loops.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify regular expression by using raw string literal.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify returning boolean expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant nil check on slices, maps, and channels.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit default slice index.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use a single &#39;append&#39; to concatenate two slices.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace &#39;time.Now().Sub(x)&#39; with &#39;time.Since(x)&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use a type conversion instead of manually copying struct fields.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1016</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace manual trimming with &#39;strings.TrimPrefix&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1017</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#34;copy&#34; for sliding elements.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1018</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify &#34;make&#34; call by omitting redundant arguments.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1019</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant nil check in type assertion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1020</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Merge variable declaration and assignment.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1021</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant control flow.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1023</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Replace &#39;x.Sub(time.Now())&#39; with &#39;time.Until(x)&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1024</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Don&#39;t use &#39;fmt.Sprintf(&#34;%s&#34;, x)&#39; unnecessarily.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1025</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Simplify error construction with &#39;fmt.Errorf&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1028</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Range over the string directly.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1029</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;bytes.Buffer.String&#39; or &#39;bytes.Buffer.Bytes&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1030</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant nil check around loop.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1031</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;sort.Ints(x)&#39;, &#39;sort.Float64s(x)&#39;, and &#39;sort.Strings(x)&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1032</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessary guard around call to &#34;delete&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1033</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1033</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use result of type assertion to simplify cases.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1034</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1034</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Redundant call to &#39;net/http.CanonicalHeaderKey&#39; in method call on &#39;net/http.Header&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1035</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1035</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessary guard around map access.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1036</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1036</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Elaborate way of sleeping.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1037</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1037</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessarily complex way of printing formatted string.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1038</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1038</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unnecessary use of &#39;fmt.Sprint&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1039</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1039</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Type assertion to current type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#S1040</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">S1040</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Apply De Morgan&#39;s law.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1001</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Convert untagged switch to tagged switch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1002</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Convert if/else-if chain to tagged switch.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1003</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;strings.ReplaceAll&#39; instead of &#39;strings.Replace&#39; with &#39;n == -1&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1004</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Expand call to &#39;math.Pow&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1005</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Lift &#39;if&#39;+&#39;break&#39; into loop condition.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1006</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Merge conditional assignment into variable declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1007</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit embedded fields from selector expression.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1008</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;time.Time.Equal&#39; instead of &#39;==&#39; operator.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1009</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Convert slice of bytes to string when printing it.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1010</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Omit redundant type from variable declaration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1011</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Use &#39;fmt.Fprintf(x, ...)&#39; instead of &#39;x.Write(fmt.Sprintf(...))&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://staticcheck.dev/docs/checks/#QF1012</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">QF1012</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>tagalign<span class="hx:absolute hx:-mt-20" id="tagalign"></span> +<a href="#tagalign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check that struct tags are well aligned.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/4meepo/tagalign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tagalign</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Align and sort can be used together or separately.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether enable align. If true, the struct tags will be aligned.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># E.g.:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># type FooBar struct {</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Bar string `json:&#34;bar&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># FooFoo int8 `json:&#34;foo_foo&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># }</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># will be formatted to:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># type FooBar struct {</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Bar string `json:&#34;bar&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># FooFoo int8 `json:&#34;foo_foo&#34; validate:&#34;required&#34;`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># }</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">align</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether enable tags sort.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If true, the tags will be sorted by name in ascending order.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># E.g.: `xml:&#34;bar&#34; json:&#34;bar&#34; validate:&#34;required&#34;` -&gt; `json:&#34;bar&#34; validate:&#34;required&#34; xml:&#34;bar&#34;`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sort</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Specify the order of tags, the other tags will be sorted by name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This option will be ignored if `sort` is false.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">order</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yaml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">yml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">toml</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mapstructure</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">binding</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">validate</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Whether enable strict style.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># In this style, the tags will be sorted and aligned in the dictionary order,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and the tags with the same name will be aligned together.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Note: This option will be ignored if &#39;align&#39; or &#39;sort&#39; is false.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>tagliatelle<span class="hx:absolute hx:-mt-20" id="tagliatelle"></span> +<a href="#tagliatelle" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks the struct tags.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.40.0</div> +</div> +<a href="https://github.com/ldez/tagliatelle" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tagliatelle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Checks the struct tag name case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines the association between tag name and case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Any struct tag name can be used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supported string cases:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `camel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `pascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `kebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `snake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `upperSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goCamel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goPascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goKebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `upper`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lower`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `header`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">yaml</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">xml</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">toml</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bson</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">avro</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mapstructure</span><span class="p">:</span><span class="w"> </span><span class="l">kebab</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">env</span><span class="p">:</span><span class="w"> </span><span class="l">upperSnake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">envconfig</span><span class="p">:</span><span class="w"> </span><span class="l">upperSnake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">whatever</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines the association between tag name and case.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Important: the `extended-rules` overrides `rules`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extended-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Supported string cases:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `camel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `pascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `kebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `snake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `upperSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goCamel`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goPascal`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goKebab`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `goSnake`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `header`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `lower`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - `header`</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Required</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case</span><span class="p">:</span><span class="w"> </span><span class="l">camel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Adds &#39;AMQP&#39;, &#39;DB&#39;, &#39;GID&#39;, &#39;RTP&#39;, &#39;SIP&#39;, &#39;TS&#39; to initialisms,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># and removes &#39;LHS&#39;, &#39;RHS&#39; from initialisms.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-initialisms</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Defines initialism additions and overrides.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">initialism-overrides</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">DB</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># add a new initialism</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">LHS</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> </span><span class="c"># disable a default initialism.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ...</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Uses the struct field name to check the name of the struct tag.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">use-field-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The field names to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-fields</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Overrides the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">overrides</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="c"># The package path (uses `/` only as a separator).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Required</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pkg</span><span class="p">:</span><span class="w"> </span><span class="l">foo/bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty or the same as the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> </span><span class="l">snake</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">xml</span><span class="p">:</span><span class="w"> </span><span class="l">pascal</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: empty or the same as the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extended-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Same options as the base `extended-rules`.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false (WARNING: it doesn&#39;t follow the default/root configuration)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">use-field-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The field names to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [] or the same as the default/root configuration.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignored-fields</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">Foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore the package (takes precedence over all other configurations).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>testableexamples<span class="hx:absolute hx:-mt-20" id="testableexamples"></span> +<a href="#testableexamples" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Linter checks if examples are testable (have an expected output).</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.50.0</div> +</div> +<a href="https://github.com/maratori/testableexamples" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>testifylint<span class="hx:absolute hx:-mt-20" id="testifylint"></span> +<a href="#testifylint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks usage of github.com/stretchr/testify.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.55.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/Antonboom/testifylint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testifylint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable all checkers (https://github.com/Antonboom/testifylint#checkers).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable checkers by name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (in addition to default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># suite-thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">blank-import</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bool-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">compares</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contains</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">encoded-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equal-values</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-is-as</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-nil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expected-actual</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">float-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">formatter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go-require</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">negative-positive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nil-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-broken-parallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-dont-use-pkg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-extra-assert-call</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-method-signature</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-subtest-run</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">useless-assert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable all checkers (https://github.com/Antonboom/testifylint#checkers).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable checkers by name</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># (in addition to default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># blank-import, bool-compare, compares, contains, empty, encoded-compare, equal-values, error-is-as, error-nil,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># expected-actual, go-require, float-compare, formatter, len, negative-positive, nil-compare, regexp, require-error,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># suite-broken-parallel, suite-dont-use-pkg, suite-extra-assert-call, suite-subtest-run, suite-method-signature,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># useless-assert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># ).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">blank-import</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bool-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">compares</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">contains</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">encoded-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">equal-values</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-is-as</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-nil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expected-actual</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">float-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">formatter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go-require</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">negative-positive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nil-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">regexp</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-broken-parallel</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-dont-use-pkg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-extra-assert-call</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-method-signature</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-subtest-run</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-thelper</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">useless-assert</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bool-compare</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To ignore user defined types (over builtin bool).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-custom-types</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expected-actual</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp for expected variable name.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: (^(exp(ected)?|want(ed)?)([A-Z]\w*)?$)|(^(\w*[a-z])?(Exp(ected)?|Want(ed)?)$)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^expected</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formatter</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To enable go vet&#39;s printf checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-format-string</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To require f-assertions (e.g. `assert.Equalf`) if format string is used, even if there are no variable-length</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># variables, i.e. it requires `require.NoErrorf` for both these cases:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - require.NoErrorf(t, err, &#34;unexpected error&#34;)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - require.NoErrorf(t, err, &#34;unexpected error for sid: %v&#34;, sid)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To understand this behavior, please read the</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/Antonboom/testifylint?tab=readme-ov-file#historical-reference-of-formatter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-f-funcs</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To require that the first element of msgAndArgs (msg) has a string type.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># For example, in such case assertion like `assert.True(t, b, tt.case)` will be considered as invalid.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-string-msg</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go-require</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To ignore HTTP handlers (like http.HandlerFunc).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-http-handlers</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">require-error</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fn-pattern</span><span class="p">:</span><span class="w"> </span><span class="l">^(Errorf?|NoErrorf?)$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">suite-extra-assert-call</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># To require or remove extra Assert() call?</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: remove</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">require</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>testpackage<span class="hx:absolute hx:-mt-20" id="testpackage"></span> +<a href="#testpackage" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Linter that makes you use a separate _test package.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.25.0</div> +</div> +<a href="https://github.com/maratori/testpackage" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testpackage</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regexp pattern to skip files.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;(export|internal)_test\\.go&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-regexp</span><span class="p">:</span><span class="w"> </span><span class="l">(export|internal)_test\.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># List of packages that don&#39;t end with _test that tests are allowed to be in.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;main&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-packages</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">example</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">main</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>thelper<span class="hx:absolute hx:-mt-20" id="thelper"></span> +<a href="#thelper" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Thelper detects tests helpers which do not start with the t.Helper() method.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.34.0</div> +</div> +<a href="https://github.com/kulti/thelper" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">thelper</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">test</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.T is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.T param has name t.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check t.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">benchmark</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.B is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.B param has name b.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check b.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tb</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.TB is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.TB param has name tb.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check tb.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fuzz</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.F is first param (or after context.Context) of helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">first</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check *testing.F param has name f.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check f.Helper() begins helper function.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">begin</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>tparallel<span class="hx:absolute hx:-mt-20" id="tparallel"></span> +<a href="#tparallel" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Tparallel detects inappropriate usage of t.Parallel() method in your Go test codes.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.32.0</div> +</div> +<a href="https://github.com/moricho/tparallel" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>unconvert<span class="hx:absolute hx:-mt-20" id="unconvert"></span> +<a href="#unconvert" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Remove unnecessary type conversions.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.0.0</div> +</div> +<a href="https://github.com/mdempsky/unconvert" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unconvert</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Remove conversions that force intermediate rounding.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">fast-math</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Be more conservative (experimental).</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">safe</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>unparam<span class="hx:absolute hx:-mt-20" id="unparam"></span> +<a href="#unparam" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports unused function parameters.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.9.0</div> +</div> +<a href="https://github.com/mvdan/unparam" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unparam</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Inspect exported functions.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Set to true if no external program/library imports your code.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># if it&#39;s called for subdir of a project it can&#39;t find external interfaces. All text editor integrations</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># with golangci-lint call it on a directory with the changed file.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-exported</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>unqueryvet<span class="hx:absolute hx:-mt-20" id="unqueryvet"></span> +<a href="#unqueryvet" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.5.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-yellow-100 hx:bg-yellow-50 hx:text-yellow-900 hx:dark:border-yellow-200/30 hx:dark:bg-yellow-700/30 hx:dark:text-yellow-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>New</div> +</div> +<a href="https://github.com/MirrexOne/unqueryvet" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unqueryvet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable SQL builder checking.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-sql-builders</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Regex patterns for acceptable SELECT * usage.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT \\* FROM information_schema\\..*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT \\* FROM pg_catalog\\..*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT COUNT\\(\\*\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT MAX\\(\\*\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - &#34;SELECT MIN\\(\\*\\)&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allowed-patterns</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;SELECT \\* FROM temp_.*&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s2">&#34;SELECT \\* FROM.*-- migration&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>unused<span class="hx:absolute hx:-mt-20" id="unused"></span> +<a href="#unused" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks Go code for unused constants, variables, functions and types.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<a href="https://github.com/dominikh/go-tools/tree/HEAD/unused" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unused</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all struct fields that have been written to as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">field-writes-are-uses</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">post-statements-are-reads</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all exported fields as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exported-fields-are-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all function parameters as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">parameters-are-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all local variables as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-variables-are-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Mark all identifiers inside generated files as used.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated-is-used</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>usestdlibvars<span class="hx:absolute hx:-mt-20" id="usestdlibvars"></span> +<a href="#usestdlibvars" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter that detect the possibility to use variables/constants from the Go standard library.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.48.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/sashamelentyev/usestdlibvars" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usestdlibvars</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of http.MethodXX.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http-method</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of http.StatusXX.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">http-status-code</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Month in time.Date.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-date-month</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Weekday.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-weekday</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Month.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-month</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of time.Layout.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">time-layout</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of crypto.Hash.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">crypto-hash</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of rpc.DefaultXXPath.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-rpc-path</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of sql.LevelXX.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sql-isolation-level</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of tls.SignatureScheme.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tls-signature-scheme</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Suggest the use of constant.Kind.String().</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">constant-kind</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>usetesting<span class="hx:absolute hx:-mt-20" id="usetesting"></span> +<a href="#usetesting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Reports uses of functions with replacement inside the testing package.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.63.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ldez/usetesting" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usetesting</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.CreateTemp(&#34;&#34;, ...)` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-create-temp</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.MkdirTemp()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-mkdir-temp</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.Setenv()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-setenv</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.TempDir()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-temp-dir</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `os.Chdir()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disabled if Go &lt; 1.24.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-chdir</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `context.Background()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disabled if Go &lt; 1.24.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context-background</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable/disable `context.TODO()` detections.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disabled if Go &lt; 1.24.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context-todo</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>varnamelen<span class="hx:absolute hx:-mt-20" id="varnamelen"></span> +<a href="#varnamelen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that the length of a variable's name matches its scope.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.43.0</div> +</div> +<a href="https://github.com/blizzy78/varnamelen" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">varnamelen</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The longest distance, in source lines, that is being considered a &#34;small scope&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Variables used in at most this many lines will be ignored.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 5</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max-distance</span><span class="p">:</span><span class="w"> </span><span class="m">6</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># The minimum length of a variable&#39;s name that is considered &#34;long&#34;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Variable names that are at least this long will be ignored.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min-name-length</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check method receivers.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-receiver</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check named return values.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-return</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Check type parameters.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-type-param</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore &#34;ok&#34; variables that hold the bool return value of a type assertion.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-type-assert-ok</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore &#34;ok&#34; variables that hold the bool return value of a map index.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-map-index-ok</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Ignore &#34;ok&#34; variables that hold the bool return value of a channel receive.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-chan-recv-ok</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional list of variable names that should be ignored completely.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-names</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Optional list of variable declarations that should be ignored completely.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Entries must be in one of the following forms (see below for examples):</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - for variables, parameters, named return values, method receivers, or type parameters:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># &lt;name&gt; &lt;type&gt; (&lt;type&gt; can also be a pointer/slice/map/chan/...)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - for constants: const &lt;name&gt;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c">#</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-decls</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">c echo.Context</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">t testing.T</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">f *foo.Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">e error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">i int</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">const C</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">T any</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">m map[string]int</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>wastedassign<span class="hx:absolute hx:-mt-20" id="wastedassign"></span> +<a href="#wastedassign" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Finds wasted assignment statements.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.38.0</div> +</div> +<a href="https://github.com/sanposhiho/wastedassign" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>whitespace<span class="hx:absolute hx:-mt-20" id="whitespace"></span> +<a href="#whitespace" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.19.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/ultraware/whitespace" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">whitespace</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforces newlines (or comments) after every multi-line if statement.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">multi-if</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enforces newlines (or comments) after every multi-line function signature.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">multi-func</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>wrapcheck<span class="hx:absolute hx:-mt-20" id="wrapcheck"></span> +<a href="#wrapcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checks that errors returned from external packages are wrapped.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.32.0</div> +</div> +<a href="https://github.com/tomarrell/wrapcheck" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings specifying additional substrings of signatures to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Unlike &#39;ignore-sigs&#39;, this option extends the default set (or the set specified in &#39;ignore-sigs&#39;) without replacing it entirely.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># This allows you to add specific signatures to the ignore list</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># while retaining the defaults or any items in &#39;ignore-sigs&#39;.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">extra-ignore-sigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.CustomError(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.SpecificWrap(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify substrings of signatures to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If this set, it will override the default set of ignored signatures.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># See https://github.com/tomarrell/wrapcheck#configuration for more information.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: [&#34;.Errorf(&#34;, &#34;errors.New(&#34;, &#34;errors.Unwrap(&#34;, &#34;errors.Join(&#34;, &#34;.Wrap(&#34;, &#34;.Wrapf(&#34;, &#34;.WithMessage(&#34;, &#34;.WithMessagef(&#34;, &#34;.WithStack(&#34;]</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.Errorf(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errors.New(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errors.Unwrap(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errors.Join(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.Wrap(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.Wrapf(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.WithMessage(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.WithMessagef(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">.WithStack(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify regular expressions of signatures to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sig-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">\.New.*Error\(</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify globs of packages to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-package-globs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">encoding/*</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">github.com/pkg/*</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># An array of strings that specify regular expressions of interfaces to ignore.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-interface-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">^(?i)c(?-i)ach(ing|e)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Determines whether wrapcheck should report errors returned from inside the package.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">report-internal-errors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>wsl<span class="hx:absolute hx:-mt-20" id="wsl"></span> +<a href="#wsl" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>New major version. Use <code>wsl_v5</code> instead.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.20.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:border-red-200 hx:bg-red-100 hx:text-red-900 hx:dark:border-red-200/30 hx:dark:bg-red-900/30 hx:dark:text-red-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Deprecated since v2.2.0</div> +</div> +<a href="https://github.com/bombsimon/wsl" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p> +<h2>wsl_v5<span class="hx:absolute hx:-mt-20" id="wsl_v5"></span> +<a href="#wsl_v5" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add or remove empty lines.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v2.2.0</div> +</div> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border-blue-200 hx:bg-blue-100 hx:text-blue-900 hx:dark:border-blue-200/30 hx:dark:bg-blue-900/30 hx:dark:text-blue-200"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"/></svg>Autofix</div> +</div> +<a href="https://github.com/bombsimon/wsl" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wsl_v5</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Allow cuddling a variable if it&#39;s used first in the immediate following block,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># even if the statement with the block doesn&#39;t use the variable.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-first-in-block</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Same as above,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># but allows cuddling if the variable is used anywhere in the following (or nested) block.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">allow-whole-block</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If a block contains more than this number of lines,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># the branch statement needs to be separated by whitespace.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">branch-max-lines</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># If set to a non-negative number,</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># case blocks need to end with whitespace if exceeding this number</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: 0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case-max-lines</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default checks to use.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Can be `all`, `none`, `default` or empty.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: &#34;&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enabled checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Will be additive to any presets.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">branch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">for</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">if</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inc-dec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">label</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">select</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">send</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">type-switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">append</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-exclusive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">leading-whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">trailing-whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Disable checks.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Will be subtractive to any preset.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Default: []</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">branch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">decl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">defer</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">for</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">if</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">inc-dec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">label</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">range</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">return</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">select</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">send</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">type-switch</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">append</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-exclusive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">assign-expr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">leading-whitespace</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">trailing-whitespace</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>zerologlint<span class="hx:absolute hx:-mt-20" id="zerologlint"></span> +<a href="#zerologlint" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Detects the wrong usage of <code>zerolog</code> that a user forgets to dispatch with <code>Send</code> or <code>Msg</code>.</p> +<p> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>Since golangci-lint v1.53.0</div> +</div> +<a href="https://github.com/ykadowak/zerologlint" title="Repository" target="_blank"> +<div class="hextra-badge hx:mx-1" > +<div class="hx:inline-flex hx:gap-1 hx:items-center hx:rounded-full hx:px-2.5 hx:leading-6 hx:text-[.65rem] hx:border hx:text-gray-600 hx:bg-gray-100 hx:dark:bg-neutral-800 hx:dark:text-neutral-200 hx:border-gray-200 hx:dark:border-neutral-700"><svg height=12 fill="currentColor" viewBox="3 3 18 18"> +<path d="M12 3C7.0275 3 3 7.12937 3 12.2276C3 16.3109 5.57625 19.7597 9.15374 20.9824C9.60374 21.0631 9.77249 20.7863 9.77249 20.5441C9.77249 20.3249 9.76125 19.5982 9.76125 18.8254C7.5 19.2522 6.915 18.2602 6.735 17.7412C6.63375 17.4759 6.19499 16.6569 5.8125 16.4378C5.4975 16.2647 5.0475 15.838 5.80124 15.8264C6.51 15.8149 7.01625 16.4954 7.18499 16.7723C7.99499 18.1679 9.28875 17.7758 9.80625 17.5335C9.885 16.9337 10.1212 16.53 10.38 16.2993C8.3775 16.0687 6.285 15.2728 6.285 11.7432C6.285 10.7397 6.63375 9.9092 7.20749 9.26326C7.1175 9.03257 6.8025 8.08674 7.2975 6.81794C7.2975 6.81794 8.05125 6.57571 9.77249 7.76377C10.4925 7.55615 11.2575 7.45234 12.0225 7.45234C12.7875 7.45234 13.5525 7.55615 14.2725 7.76377C15.9937 6.56418 16.7475 6.81794 16.7475 6.81794C17.2424 8.08674 16.9275 9.03257 16.8375 9.26326C17.4113 9.9092 17.76 10.7281 17.76 11.7432C17.76 15.2843 15.6563 16.0687 13.6537 16.2993C13.98 16.5877 14.2613 17.1414 14.2613 18.0065C14.2613 19.2407 14.25 20.2326 14.25 20.5441C14.25 20.7863 14.4188 21.0746 14.8688 20.9824C16.6554 20.364 18.2079 19.1866 19.3078 17.6162C20.4077 16.0457 20.9995 14.1611 21 12.2276C21 7.12937 16.9725 3 12 3Z"></path> +</svg> +Repository</div> +</div> +</a></p> +<p><em>No settings available.</em></p>False Positiveshttps://golangci-lint.run/docs/linters/false-positives/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/linters/false-positives/ +<p>False positives are inevitable, but we did our best to reduce their count.</p> +<p>If a false positive occurred, you have several choices.</p> +<h2>Specific Linter Excludes<span class="hx:absolute hx:-mt-20" id="specific-linter-excludes"></span> +<a href="#specific-linter-excludes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Most of the linters have a configuration, sometimes false-positives can be related to a bad configuration of a linter. +So it&rsquo;s recommended to check the linter configurations.</p> +<p>Otherwise, some linters have dedicated configuration to exclude or disable rules.</p> +<p>An example with <code>staticcheck</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">staticcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checks</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">all</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;-SA1000&#39;</span><span class="w"> </span><span class="c"># disable the rule SA1000</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;-SA1004&#39;</span><span class="w"> </span><span class="c"># disable the rule SA1004</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Exclude<span class="hx:absolute hx:-mt-20" id="exclude"></span> +<a href="#exclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Exclude Issue by Text<span class="hx:absolute hx:-mt-20" id="exclude-issue-by-text"></span> +<a href="#exclude-issue-by-text" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>You can use <code>linters.exclusions.rules</code> config option for per-path or per-linter configuration.</p> +<p>In the following example, all the reports from the linters (<code>linters</code>) that contains the text (<code>text</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Magic number: 9&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports from the linters (<code>linters</code>) that originated from the source (<code>source</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lll</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;^//go:generate &#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports that contains the text (<code>text</code>) in the path (<code>path</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">path/to/a/file.go</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;string `example` has (\\d+) occurrences, make it a constant&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Exclude Issues by Path<span class="hx:absolute hx:-mt-20" id="exclude-issues-by-path"></span> +<a href="#exclude-issues-by-path" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Exclude issues in path by <code>linters.exclusions.paths</code> or <code>linters.exclusions.rules</code> config options.</p> +<p>In the following example, all the reports from the linters (<code>linters</code>) that concerns the path (<code>path</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The opposite, excluding reports <strong>except</strong> for specific paths, is also possible. +In the following example, only test files get checked:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">funlen</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports related to the files (<code>paths</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">path/to/a/file.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>In the following example, all the reports related to the directories (<code>paths</code>) are excluded:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">path/to/a/dir/</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Nolint Directive<span class="hx:absolute hx:-mt-20" id="nolint-directive"></span> +<a href="#nolint-directive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To exclude issues from all linters use <code>//nolint:all</code>. +For example, if it&rsquo;s used inline (not from the beginning of the line) it excludes issues only for this line.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">bad_name</span> <span class="kt">int</span> <span class="c1">//nolint:all</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>To exclude issues from specific linters only:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">bad_name</span> <span class="kt">int</span> <span class="c1">//nolint:wsl,unused</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>To exclude issues for the block of code, use this directive at the beginning of a line:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:all</span> +</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">allIssuesInThisFunctionAreExcluded</span><span class="p">()</span> <span class="o">*</span><span class="kt">string</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1">//nolint:govet</span> +</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="p">(</span> +</span></span><span class="line"><span class="cl"> <span class="nx">a</span> <span class="kt">int</span> +</span></span><span class="line"><span class="cl"> <span class="nx">b</span> <span class="kt">int</span> +</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Also, you can exclude all issues in a file by:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:unparam</span> +</span></span><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">pkg</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You may add a comment explaining or justifying why a <code>nolint</code> directive is being used on the same line as the flag itself:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:gocyclo // This legacy function is complex, but the team too busy to simplify it</span> +</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">someLegacyFunction</span><span class="p">()</span> <span class="o">*</span><span class="kt">string</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You can see more examples of using <code>nolint</code> directives in <a href="https://github.com/golangci/golangci-lint/tree/HEAD/pkg/result/processors/testdata"target="_blank" rel="noopener">our tests</a> for it.</p> +<h3>Syntax<span class="hx:absolute hx:-mt-20" id="syntax"></span> +<a href="#syntax" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><code>nolint</code> is not regular comment but a directive.</p> +<blockquote> +<p>A directive comment is a line matching the regular expression <code>//(line |extern |export |[a-z0-9]+:[a-z0-9])</code>. +<a href="https://go.dev/doc/comment#syntax"target="_blank" rel="noopener">https://go.dev/doc/comment#syntax</a></p> +</blockquote> +<p>This means that no spaces are allowed between:</p> +<ul> +<li><code>//</code> and <code>nolint</code></li> +<li><code>nolint</code> and <code>:</code></li> +<li><code>:</code> and the name of the linter.</li> +</ul> +<p>Invalid syntax:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// nolint</span> +</span></span><span class="line"><span class="cl"><span class="c1">// nolint:xxx</span> +</span></span><span class="line"><span class="cl"><span class="c1">//nolint :xxx</span> +</span></span><span class="line"><span class="cl"><span class="c1">//nolint: xxx</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Valid syntax:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">//nolint:xxx</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Exclusion Presets<span class="hx:absolute hx:-mt-20" id="exclusion-presets"></span> +<a href="#exclusion-presets" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Some exclusions are considered common. +To help golangci-lint users, those common exclusions are provided through presets.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Preset <code>comments</code><span class="hx:absolute hx:-mt-20" id="preset-comments"></span> +<a href="#preset-comments" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>staticcheck</td> +<td><code>(ST1000|ST1020|ST1021|ST1022)</code></td> +</tr><tr> +<td>revive</td> +<td><code>exported (.&#43;) should have comment( \(or a comment on this block\))? or be unexported</code></td> +</tr><tr> +<td>revive</td> +<td><code>package comment should be of the form &#34;(.&#43;)...&#34;</code></td> +</tr><tr> +<td>revive</td> +<td><code>comment on exported (.&#43;) should be of the form &#34;(.&#43;)...&#34;</code></td> +</tr><tr> +<td>revive</td> +<td><code>should have a package comment</code></td> +</tr></tbody> +</table> +<h3>Preset <code>common-false-positives</code><span class="hx:absolute hx:-mt-20" id="preset-common-false-positives"></span> +<a href="#preset-common-false-positives" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>gosec</td> +<td><code>G103: Use of unsafe calls should be audited</code></td> +</tr><tr> +<td>gosec</td> +<td><code>G204: Subprocess launched with variable</code></td> +</tr><tr> +<td>gosec</td> +<td><code>G304: Potential file inclusion via variable</code></td> +</tr></tbody> +</table> +<h3>Preset <code>legacy</code><span class="hx:absolute hx:-mt-20" id="preset-legacy"></span> +<a href="#preset-legacy" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>govet</td> +<td><code>(possible misuse of unsafe.Pointer|should have signature)</code></td> +</tr><tr> +<td>staticcheck</td> +<td><code>SA4011</code></td> +</tr><tr> +<td>gosec</td> +<td><code>G104</code></td> +</tr><tr> +<td>gosec</td> +<td><code>(G301|G302|G307): Expect (directory permissions to be 0750|file permissions to be 0600) or less</code></td> +</tr></tbody> +</table> +<h3>Preset <code>std-error-handling</code><span class="hx:absolute hx:-mt-20" id="preset-std-error-handling"></span> +<a href="#preset-std-error-handling" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table> +<thead> +<tr> +<th>Linter</th> +<th>Issue Text</th> +</tr> +</thead> +<tbody><tr> +<td>errcheck</td> +<td><code>(?i)Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked</code></td> +</tr></tbody> +</table> \ No newline at end of file diff --git a/docs/plugins/go-plugins/index.html b/docs/plugins/go-plugins/index.html new file mode 100644 index 000000000000..1fff75ad952f --- /dev/null +++ b/docs/plugins/go-plugins/index.html @@ -0,0 +1,138 @@ +Go Plugin System – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Go Plugin System

    We recommend using Module Plugin System instead of the Go Plugin System.

    Private linters can be added through Go’s plugin system.

    For a private linter (which acts as a plugin) to work properly, +the plugin as well as the golangci-lint binary needs to be built for the same environment.

    CGO_ENABLED is another requirement.

    This means that golangci-lint needs to be built for whatever machine you intend to run it on +(cloning the golangci-lint repository and running a CGO_ENABLED=1 make build should do the trick for your machine).

    Create a Plugin +

    Your linter must provide one or more golang.org/x/tools/go/analysis.Analyzer structs.

    Your project should also use go.mod.

    All versions of libraries that overlap golangci-lint (including replaced libraries) MUST be set to the same version as golangci-lint. +You can see the versions by running go version -m golangci-lint.

    You’ll also need to create a Go file like plugin/example.go.

    This file MUST be in the package main, and MUST define an exposed function called New with the following signature:

    func New(conf any) ([]*analysis.Analyzer, error) {
    +	// ...
    +}

    See plugin/example.go for more info.

    To build the plugin, from the root project directory, run:

    go build -buildmode=plugin plugin/example.go

    This will create a plugin *.so file that can be copied into your project or another well-known location for usage in golangci-lint.

    Configure a Plugin +

    If you already have a linter plugin available, you can follow these steps to define its usage in a projects .golangci.yml file.

    An example linter can be found at here.

    If you’re looking for instructions on how to configure your own custom linter, they can be found further down.

    1. If the project you want to lint does not have one already, copy the .golangci.yml to the root directory.
    2. Adjust the YAML to appropriate linters.settings.custom entries as so:
    .golangci.yml
    version: "2"
    +
    +linters:
    +  settings:
    +    custom:
    +      example:
    +        path: /example.so
    +        description: The description of the linter
    +        original-url: github.com/golangci/example-linter
    +        settings: # Settings are optional.
    +          one: Foo
    +          two:
    +            - name: Bar
    +          three:
    +            name: Bar

    That is all the configuration that is required to run a custom linter in your project.

    Custom linters are enabled by default, but abide by the same rules as other linters.

    If the ‘disable all’ option is specified either on command line or in .golangci.yml files linters.default: none, custom linters will be disabled; +they can be re-enabled by adding them to the linters.enable list, +or providing the enabled option on the command line, golangci-lint run -Eexample.

    The configuration inside the linters.settings field of linter have some limitations (there are NOT related to the plugin system itself): +we use Viper to handle the configuration, but Viper put all the keys in lowercase, and . cannot be used inside a key.

    Last updated on
    \ No newline at end of file diff --git a/docs/plugins/index.html b/docs/plugins/index.html new file mode 100644 index 000000000000..e02c3c6d2333 --- /dev/null +++ b/docs/plugins/index.html @@ -0,0 +1,101 @@ +Plugins – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/plugins/index.xml b/docs/plugins/index.xml new file mode 100644 index 000000000000..e4ced00a7664 --- /dev/null +++ b/docs/plugins/index.xml @@ -0,0 +1,230 @@ +Golangci-lint – Pluginshttps://golangci-lint.run/docs/plugins/Recent content in Plugins on Golangci-lintHugo -- gohugo.ioen-usModule Plugin Systemhttps://golangci-lint.run/docs/plugins/module-plugins/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/plugins/module-plugins/ +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-green-200 hx:bg-green-100 hx:text-green-900 hx:dark:border-green-200/30 hx:dark:bg-green-900/30 hx:dark:text-green-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/></svg>Tip</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>An example linter can be found at <a href="https://github.com/golangci/example-plugin-module-linter"target="_blank" rel="noopener">here</a>.</p></div> +</div> +</div> +<h2>The Automatic Way<span class="hx:absolute hx:-mt-20" id="the-automatic-way"></span> +<a href="#the-automatic-way" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul> +<li>Define your building configuration into <code>.custom-gcl.yml</code>.</li> +<li>Run the command <code>golangci-lint custom</code> (or <code>golangci-lint custom -v</code> to have logs).</li> +<li>Define the plugin inside the <code>linters.settings.custom</code> section with the type <code>module</code>.</li> +<li>Run the resulting custom binary of golangci-lint (<code>./custom-gcl</code> by default).</li> +</ul> +<p>Requirements:</p> +<ul> +<li>Go</li> +<li>git</li> +</ul> +<h3>Configuration Example<span class="hx:absolute hx:-mt-20" id="configuration-example"></span> +<a href="#configuration-example" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.custom-gcl.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v2.5.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">plugins</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from a Go proxy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/golangci/plugin1&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/golangci/plugin1/foo&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v1.0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/golangci/plugin2&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my/local/path/plugin2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.golangci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">none</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">foo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;module&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">This is an example usage of a plugin linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="l">hello</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>The Manual Way<span class="hx:absolute hx:-mt-20" id="the-manual-way"></span> +<a href="#the-manual-way" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul> +<li>Add a blank-import of your module inside <code>cmd/golangci-lint/plugins.go</code>.</li> +<li>Run <code>go mod tidy</code> (the module containing the plugin will be imported).</li> +<li>Run <code>make build</code>.</li> +<li>Define the plugin inside the <code>linters.settings.custom</code> section with the type <code>module</code>.</li> +<li>Run your custom version of golangci-lint.</li> +</ul> +<h3>Configuration Example<span class="hx:absolute hx:-mt-20" id="configuration-example-1"></span> +<a href="#configuration-example-1" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.golangci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">none</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">foo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;module&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">This is an example usage of a plugin linter.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="l">hello</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Reference<span class="hx:absolute hx:-mt-20" id="reference"></span> +<a href="#reference" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The configuration file can be validated with the JSON Schema: <a href="https://golangci-lint.run/jsonschema/custom-gcl.jsonschema.json"target="_blank" rel="noopener">custom-gcl.jsonschema.json</a></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.custom-gcl.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="c"># The golangci-lint version used to build the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Required.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v2.0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The name of the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Default: custom-gcl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">custom-golangci-lint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The directory path used to store the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Default: .</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">destination</span><span class="p">:</span><span class="w"> </span><span class="l">./my/path/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># The list of the plugins to integrate inside the custom binary.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">plugins</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from a Go proxy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin3&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v1.2.3</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from a Go proxy (with a specific import path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin4&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin4/foo&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l">v1.0.0</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source (with absolute path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin2&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my/local/path/plugin2</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source (with relative path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin1&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">./my/local/path/plugin1</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># a plugin from local source (with absolute path and a specific import path)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin2&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">import</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/plugin4/foo&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/my/local/path/plugin2</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div>Go Plugin Systemhttps://golangci-lint.run/docs/plugins/go-plugins/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/plugins/go-plugins/ +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200"> +<div class="hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2"><svg height=1.2em class="hx:inline-block hx:align-middle" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg></div> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><strong>We recommend using <a href="https://golangci-lint.run/docs/plugins/module-plugins/">Module Plugin System</a> instead of the Go Plugin System.</strong></div> +</div> +</div> +<p>Private linters can be added through <a href="https://pkg.go.dev/plugin"target="_blank" rel="noopener">Go&rsquo;s plugin system</a>.</p> +<p>For a private linter (which acts as a plugin) to work properly, +the plugin as well as the golangci-lint binary <strong>needs to be built for the same environment</strong>.</p> +<p><code>CGO_ENABLED</code> is another requirement.</p> +<p>This means that <code>golangci-lint</code> needs to be built for whatever machine you intend to run it on +(cloning the golangci-lint repository and running a <code>CGO_ENABLED=1 make build</code> should do the trick for your machine).</p> +<h2>Create a Plugin<span class="hx:absolute hx:-mt-20" id="create-a-plugin"></span> +<a href="#create-a-plugin" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Your linter must provide one or more <code>golang.org/x/tools/go/analysis.Analyzer</code> structs.</p> +<p>Your project should also use <code>go.mod</code>.</p> +<p>All versions of libraries that overlap <code>golangci-lint</code> (including replaced libraries) MUST be set to the same version as <code>golangci-lint</code>. +You can see the versions by running <code>go version -m golangci-lint</code>.</p> +<p>You&rsquo;ll also need to create a Go file like <code>plugin/example.go</code>.</p> +<p>This file MUST be in the package <code>main</code>, and MUST define an exposed function called <code>New</code> with the following signature:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">New</span><span class="p">(</span><span class="nx">conf</span> <span class="kt">any</span><span class="p">)</span> <span class="p">([]</span><span class="o">*</span><span class="nx">analysis</span><span class="p">.</span><span class="nx">Analyzer</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="c1">// ...</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>See <a href="https://github.com/golangci/example-plugin-linter/blob/HEAD/plugin/example.go"target="_blank" rel="noopener">plugin/example.go</a> for more info.</p> +<p>To build the plugin, from the root project directory, run:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go build -buildmode<span class="o">=</span>plugin plugin/example.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>This will create a plugin <code>*.so</code> file that can be copied into your project or another well-known location for usage in <code>golangci-lint</code>.</p> +<h2>Configure a Plugin<span class="hx:absolute hx:-mt-20" id="configure-a-plugin"></span> +<a href="#configure-a-plugin" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If you already have a linter plugin available, you can follow these steps to define its usage in a projects <code>.golangci.yml</code> file.</p> +<p>An example linter can be found at <a href="https://github.com/golangci/example-plugin-linter"target="_blank" rel="noopener">here</a>.</p> +<p>If you&rsquo;re looking for instructions on how to configure your own custom linter, they can be found further down.</p> +<ol> +<li>If the project you want to lint does not have one already, copy the <a href="https://github.com/golangci/golangci-lint/blob/HEAD/.golangci.yml"target="_blank" rel="noopener">.golangci.yml</a> to the root directory.</li> +<li>Adjust the YAML to appropriate <code>linters.settings.custom</code> entries as so:</li> +</ol> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.golangci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">custom</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">example</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/example.so</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">The description of the linter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">original-url</span><span class="p">:</span><span class="w"> </span><span class="l">github.com/golangci/example-linter</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> </span><span class="c"># Settings are optional.</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">one</span><span class="p">:</span><span class="w"> </span><span class="l">Foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">two</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Bar</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">three</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Bar</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>That is all the configuration that is required to run a custom linter in your project.</p> +<p>Custom linters are enabled by default, but abide by the same rules as other linters.</p> +<p>If the &lsquo;disable all&rsquo; option is specified either on command line or in <code>.golangci.yml</code> files <code>linters.default: none</code>, custom linters will be disabled; +they can be re-enabled by adding them to the <code>linters.enable</code> list, +or providing the enabled option on the command line, <code>golangci-lint run -Eexample</code>.</p> +<p>The configuration inside the <code>linters.settings</code> field of linter have some limitations (there are NOT related to the plugin system itself): +we use Viper to handle the configuration, but Viper put all the keys in lowercase, and <code>.</code> cannot be used inside a key.</p> \ No newline at end of file diff --git a/docs/plugins/module-plugins/index.html b/docs/plugins/module-plugins/index.html new file mode 100644 index 000000000000..6b192bd78e88 --- /dev/null +++ b/docs/plugins/module-plugins/index.html @@ -0,0 +1,195 @@ +Module Plugin System – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Module Plugin System

    Tip

    An example linter can be found at here.

    The Automatic Way +

    • Define your building configuration into .custom-gcl.yml.
    • Run the command golangci-lint custom (or golangci-lint custom -v to have logs).
    • Define the plugin inside the linters.settings.custom section with the type module.
    • Run the resulting custom binary of golangci-lint (./custom-gcl by default).

    Requirements:

    • Go
    • git

    Configuration Example +

    .custom-gcl.yml
    version: v2.5.0
    +plugins:
    +  # a plugin from a Go proxy
    +  - module: 'github.com/golangci/plugin1'
    +    import: 'github.com/golangci/plugin1/foo'
    +    version: v1.0.0
    +
    +  # a plugin from local source
    +  - module: 'github.com/golangci/plugin2'
    +    path: /my/local/path/plugin2
    .golangci.yml
    version: "2"
    +
    +linters:
    +  default: none
    +  enable:
    +    - foo
    +  settings:
    +    custom:
    +      foo:
    +        type: "module"
    +        description: This is an example usage of a plugin linter.
    +        settings:
    +          message: hello

    The Manual Way +

    • Add a blank-import of your module inside cmd/golangci-lint/plugins.go.
    • Run go mod tidy (the module containing the plugin will be imported).
    • Run make build.
    • Define the plugin inside the linters.settings.custom section with the type module.
    • Run your custom version of golangci-lint.

    Configuration Example +

    .golangci.yml
    version: "2"
    +
    +linters:
    +  default: none
    +  enable:
    +    - foo
    +  settings:
    +    custom:
    +      foo:
    +        type: "module"
    +        description: This is an example usage of a plugin linter.
    +        settings:
    +          message: hello

    Reference +

    The configuration file can be validated with the JSON Schema: custom-gcl.jsonschema.json

    .custom-gcl.yml
    # The golangci-lint version used to build the custom binary.
    +# Required.
    +version: v2.0.0
    +
    +# The name of the custom binary.
    +# Optional.
    +# Default: custom-gcl
    +name: custom-golangci-lint
    +
    +# The directory path used to store the custom binary.
    +# Optional.
    +# Default: .
    +destination: ./my/path/
    +
    +# The list of the plugins to integrate inside the custom binary.
    +plugins:
    +  # a plugin from a Go proxy
    +  - module: 'github.com/example/plugin3'
    +    version: v1.2.3
    +
    +  # a plugin from a Go proxy (with a specific import path)
    +  - module: 'github.com/example/plugin4'
    +    import: 'github.com/example/plugin4/foo'
    +    version: v1.0.0
    +
    +  # a plugin from local source (with absolute path)
    +  - module: 'github.com/example/plugin2'
    +    path: /my/local/path/plugin2
    +
    +  # a plugin from local source (with relative path)
    +  - module: 'github.com/example/plugin1'
    +    path: ./my/local/path/plugin1
    +
    +  # a plugin from local source (with absolute path and a specific import path)
    +  - module: 'github.com/example/plugin2'
    +    import: 'github.com/example/plugin4/foo'
    +    path: /my/local/path/plugin2
    Last updated on
    \ No newline at end of file diff --git a/docs/product/changelog/index.html b/docs/product/changelog/index.html new file mode 100644 index 000000000000..f058a1d90d62 --- /dev/null +++ b/docs/product/changelog/index.html @@ -0,0 +1,455 @@ +Changelog – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Changelog

    Follow the news and releases on Mastodon and on Bluesky.

    golangci-lint is a free and open-source project built by volunteers.

    If you value it, consider supporting us, we appreciate it!

    v2.5.0 +

    1. New linters
    2. Linters new features or changes
      • embeddedstructfieldcheck: from 0.3.0 to 0.4.0 (new option: empty-line)
      • err113: from aea10b59be24 to 0.1.1 (skip internals of Is methods for error type)
      • ginkgolinter: from 0.20.0 to 0.21.0 (new option: force-tonot)
      • gofumpt: from 0.8.0 to 0.9.1 (new rule is to “clothe” naked returns for the sake of clarity)
      • ineffassign: from 0.1.0 to 0.2.0 (new option: check-escaping-errors)
      • musttag: from 0.13.1 to 0.14.0 (support interface methods)
      • revive: from 1.11.0 to 1.12.0 (new options: identical-ifelseif-branches, identical-ifelseif-conditions, identical-switch-branches, identical-switch-conditions, package-directory-mismatch, unsecure-url-scheme, use-waitgroup-go, useless-fallthrough)
      • thelper: from 0.6.3 to 0.7.1 (skip t.Helper in functions passed to synctest.Test)
      • wsl: from 5.1.1 to 5.2.0 (improvements related to subexpressions)
    3. Linters bug fixes
      • asciicheck: from 0.4.1 to 0.5.0
      • errname: from 1.1.0 to 1.1.1
      • fatcontext: from 0.8.0 to 0.8.1
      • go-printf-func-name: from 0.1.0 to 0.1.1
      • godot: from 1.5.1 to 1.5.4
      • gosec: from 2.22.7 to 2.22.8
      • nilerr: from 0.1.1 to a temporary fork
      • nilnil: from 1.1.0 to 1.1.1
      • protogetter: from 0.3.15 to 0.3.16
      • tagliatelle: from 0.7.1 to 0.7.2
      • testifylint: from 1.6.1 to 1.6.4
    4. Misc.
      • fix: “no export data” errors are now handled as a standard typecheck error
    5. Documentation
      • Improve nolint section about syntax

    v2.4.0 +

    1. Enhancements
      • 🎉 go1.25 support
    2. Linters new features or changes
      • exhaustruct: from v3.3.1 to 4.0.0 (new options: allow-empty, allow-empty-rx, allow-empty-returns, allow-empty-declarations)
    3. Linters bug fixes
      • godox: trim filepath from report messages
      • staticcheck: allow empty options
      • tagalign: from 1.4.2 to 1.4.3
    4. Documentation
      • 🌟 New website (with a search engine)

    v2.3.1 +

    1. Linters bug fixes
      • gci: from 0.13.6 to 0.13.7
      • gosec: from 2.22.6 to 2.22.7
      • noctx: from 0.3.5 to 0.4.0
      • wsl: from 5.1.0 to 5.1.1
      • tagliatelle: force upper case for custom initialisms

    v2.3.0 +

    1. Linters new features or changes
      • ginkgolinter: from 0.19.1 to 0.20.0 (new option: force-assertion-description)
      • iface: from 1.4.0 to 1.4.1 (report message improvements)
      • noctx: from 0.3.4 to 0.3.5 (new detections: log/slog, exec, crypto/tls)
      • revive: from 1.10.0 to 1.11.0 (new rule: enforce-switch-style)
      • wsl: from 5.0.0 to 5.1.0
    2. Linters bug fixes
      • gosec: from 2.22.5 to 2.22.6
      • noinlineerr: from 1.0.4 to 1.0.5
      • sloglint: from 0.11.0 to 0.11.1
    3. Misc.
      • fix: panic close of closed channel

    v2.2.2 +

    1. Linters bug fixes
      • noinlineerr: from 1.0.3 to 1.0.4
    2. Documentation
      • Improve debug keys documentation
    3. Misc.
      • fix: panic close of closed channel
      • godot: add noinline value into the JSONSchema

    v2.2.1 +

    1. Linters bug fixes
    • varnamelen: fix configuration

    v2.2.0 +

    1. New linters
    2. Linters new features or changes
      • errcheck: add verbose option
      • funcorder: from 0.2.1 to 0.5.0 (new option alphabetical)
      • gomoddirectives: from 0.6.1 to 0.7.0 (new option ignore-forbidden)
      • iface: from 1.3.1 to 1.4.0 (new option unexported)
      • noctx: from 0.1.0 to 0.3.3 (new report messages, and new rules related to database/sql)
      • noctx: from 0.3.3 to 0.3.4 (new SQL functions detection)
      • revive: from 1.9.0 to 1.10.0 (new rules: time-date, unnecessary-format, use-fmt-print)
      • usestdlibvars: from 1.28.0 to 1.29.0 (new option time-date-month)
      • wsl: deprecation
      • wsl_v5: from 4.7.0 to 5.0.0 (major version with new configuration)
    3. Linters bug fixes
      • dupword: from 0.1.3 to 0.1.6
      • exptostd: from 0.4.3 to 0.4.4
      • forbidigo: from 1.6.0 to 2.1.0
      • gci: consistently format the code
      • go-spancheck: from 0.6.4 to 0.6.5
      • goconst: from 1.8.1 to 1.8.2
      • gosec: from 2.22.3 to 2.22.4
      • gosec: from 2.22.4 to 2.22.5
      • makezero: from 1.2.0 to 2.0.1
      • misspell: from 0.6.0 to 0.7.0
      • usetesting: from 0.4.3 to 0.5.0
    4. Misc.
      • exclusions: fix path-expect
      • formatters: write the input to stdout when using stdin and there are no changes
      • migration: improve the error message when trying to migrate a migrated config
      • typecheck: deduplicate errors
      • typecheck: stops the analysis after the first error
      • Deprecate print-resources-usage flag
      • Unique version per custom build
    5. Documentation
      • Improves typecheck FAQ
      • Adds plugin systems recommendations
      • Add description for linters.default sets

    v2.1.6 +

    1. Linters bug fixes
      • godot: from 1.5.0 to 1.5.1
      • musttag: from 0.13.0 to 0.13.1
    2. Documentation
      • Add note about golangci-lint v2 integration in VS Code

    v2.1.5 +

    Due to an error related to Snapcraft, some artifacts of the v2.1.4 release have not been published.

    This release contains the same things as v2.1.3.

    v2.1.4 +

    Due to an error related to Snapcraft, some artifacts of the v2.1.3 release have not been published.

    This release contains the same things as v2.1.3.

    v2.1.3 +

    1. Linters bug fixes
      • fatcontext: from 0.7.2 to 0.8.0
    2. Misc.
      • migration: fix nakedret.max-func-lines: 0
      • migration: fix order of staticcheck settings
      • fix: add go.mod hash to the cache salt
      • fix: use diagnostic position for related information position

    v2.1.2 +

    1. Linters bug fixes
      • exptostd: from 0.4.2 to 0.4.3
      • gofumpt: from 0.7.0 to 0.8.0
      • protogetter: from 0.3.13 to 0.3.15
      • usetesting: from 0.4.2 to 0.4.3

    v2.1.1 +

    The release process of v2.1.0 failed due to a regression inside goreleaser.

    The binaries of v2.1.0 have been published, but not the other artifacts (AUR, Docker, etc.).

    v2.1.0 +

    1. Enhancements
      • Add an option to display absolute paths (--path-mode=abs)
      • Add configuration path placeholder (${config-path})
      • Add warn-unused option for fmt command
      • Colored diff for fmt command (golangci-lint fmt --diff-colored)
    2. New linters
    3. Linters new features or changes
      • go-errorlint: from 1.7.1 to 1.8.0 (automatic error comparison and type assertion fixes)
      • ⚠️ goconst: ignore-strings is deprecated and replaced by ignore-string-values
      • goconst: from 1.7.1 to 1.8.1 (new options: find-duplicates, eval-const-expressions)
      • govet: add httpmux analyzer
      • nilnesserr: from 0.1.2 to 0.2.0 (detect more cases)
      • paralleltest: from 1.0.10 to 1.0.14 (checks only _test.go files)
      • revive: from 1.7.0 to 1.9.0 (support kebab case for setting names)
      • sloglint: from 0.9.0 to 0.11.0 (autofix, new option msg-style, suggest slog.DiscardHandler)
      • wrapcheck: from 2.10.0 to 2.11.0 (new option report-internal-errors)
      • wsl: from 4.6.0 to 4.7.0 (cgo files are always excluded)
    4. Linters bug fixes
      • fatcontext: from 0.7.1 to 0.7.2
      • gocritic: fix importshadow checker
      • gosec: from 2.22.2 to 2.22.3
      • ireturn: from 0.3.1 to 0.4.0
      • loggercheck: from 0.10.1 to 0.11.0
      • nakedret: from 2.0.5 to 2.0.6
      • nonamedreturns: from 1.0.5 to 1.0.6
      • protogetter: from 0.3.12 to 0.3.13
      • testifylint: from 1.6.0 to 1.6.1
      • unconvert: update to HEAD
    5. Misc.
      • Fixes memory leaks when using go1.(N) with golangci-lint built with go1.(N-X)
      • Adds golangci-lint-fmt pre-commit hook
    6. Documentation
      • Improvements
      • Updates section about vscode integration

    v2.0.2 +

    1. Misc.
      • Fixes flags parsing for formatters
      • Fixes the filepath used by the exclusion source option
    2. Documentation
      • Adds a section about flags migration
      • Cleaning pages with v1 options

    v2.0.1 +

    1. Linters/formatters bug fixes
      • golines: fix settings during linter load
    2. Misc.
      • Validates the version field before the configuration
      • forbidigo: fix migration

    v2.0.0 +

    1. Enhancements
    2. New linters/formatters
    3. Linters new features
      • ⚠️ Merge staticcheck, stylecheck, gosimple into one linter (staticcheck) (cf. Migration guide)
      • go-critic: from 0.12.0 to 0.13.0
      • gomodguard: from 1.3.5 to 1.4.1 (block explicit indirect dependencies)
      • nilnil: from 1.0.1 to 1.1.0 (new option: only-two)
      • perfsprint: from 0.8.2 to 0.9.1 (checker name in the diagnostic message)
      • staticcheck: new quickfix set of rules
      • testifylint: from 1.5.2 to 1.6.0 (new options: equal-values, suite-method-signature, require-string-msg)
      • wsl: from 4.5.0 to 4.6.0 (new option: allow-cuddle-used-in-block)
    4. Linters bug fixes
      • bidichk: from 0.3.2 to 0.3.3
      • errchkjson: from 0.4.0 to 0.4.1
      • errname: from 1.0.0 to 1.1.0
      • funlen: fix ignore-comments option
      • gci: from 0.13.5 to 0.13.6
      • gosmopolitan: from 1.2.2 to 1.3.0
      • inamedparam: from 0.1.3 to 0.2.0
      • intrange: from 0.3.0 to 0.3.1
      • protogetter: from 0.3.9 to 0.3.12
      • unparam: from 8a5130ca722f to 0df0534333a4
    5. Misc.
      • 🧹 Configuration options renaming (cf. Migration guide)
      • 🧹 Remove options (cf. Migration guide)
      • 🧹 Remove flags (cf. Migration guide)
      • 🧹 Remove alternative names (cf. Migration guide)
      • 🧹 Remove or replace deprecated elements (cf. Migration guide)
      • Adds an option to display some commands as JSON:
        • golangci-lint config path --json
        • golangci-lint help linters --json
        • golangci-lint help formatters --json
        • golangci-lint linters --json
        • golangci-lint formatters --json
        • golangci-lint version --json
    6. Documentation

    v1.64.8 +

    • Detects use of configuration files from golangci-lint v2

    v1.64.7 +

    1. Linters bug fixes
      • depguard: from 2.2.0 to 2.2.1
      • dupl: from 3e9179ac440a to f665c8d69b32
      • gosec: from 2.22.1 to 2.22.2
      • staticcheck: from 0.6.0 to 0.6.1
    2. Documentation
      • Add GitLab documentation

    v1.64.6 +

    1. Linters bug fixes
      • asciicheck: from 0.4.0 to 0.4.1
      • contextcheck: from 1.1.5 to 1.1.6
      • errcheck: from 1.8.0 to 1.9.0
      • exptostd: from 0.4.1 to 0.4.2
      • ginkgolinter: from 0.19.0 to 0.19.1
      • go-exhaustruct: from 3.3.0 to 3.3.1
      • gocheckcompilerdirectives: from 1.2.1 to 1.3.0
      • godot: from 1.4.20 to 1.5.0
      • perfsprint: from 0.8.1 to 0.8.2
      • revive: from 1.6.1 to 1.7.0
      • tagalign: from 1.4.1 to 1.4.2

    v1.64.5 +

    1. Bug fixes
      • Add missing flag new-from-merge-base-flag
    2. Linters bug fixes
      • asciicheck: from 0.3.0 to 0.4.0
      • forcetypeassert: from 0.1.0 to 0.2.0
      • gosec: from 2.22.0 to 2.22.1

    v1.64.4 +

    1. Linters bug fixes
      • gci: fix standard packages list for go1.24

    v1.64.3 +

    1. Linters bug fixes
      • ginkgolinter: from 0.18.4 to 0.19.0
      • go-critic: from 0.11.5 to 0.12.0
      • revive: from 1.6.0 to 1.6.1
      • gci: fix standard packages list for go1.24
    2. Misc.
      • Build Docker images with go1.24

    v1.64.2 +

    This is the last minor release of golangci-lint v1. +The next release will be golangci-lint v2.

    1. Enhancements
      • 🎉 go1.24 support
      • New issues.new-from-merge-base option
      • New run.relative-path-mode option
    2. Linters new features
      • copyloopvar: from 1.1.0 to 1.2.1 (support suggested fixes)
      • exptostd: from 0.3.1 to 0.4.1 (handles golang.org/x/exp/constraints.Ordered)
      • fatcontext: from 0.5.3 to 0.7.1 (new option: check-struct-pointers)
      • perfsprint: from 0.7.1 to 0.8.1 (new options: integer-format, error-format, string-format, bool-format, and hex-format)
      • revive: from 1.5.1 to 1.6.0 (new rules: redundant-build-tag, use-errors-new. New option early-return.early-return)
    3. Linters bug fixes
      • go-errorlint: from 1.7.0 to 1.7.1
      • gochecknoglobals: from 0.2.1 to 0.2.2
      • godox: from 006bad1f9d26 to 1.1.0
      • gosec: from 2.21.4 to 2.22.0
      • iface: from 1.3.0 to 1.3.1
      • nilnesserr: from 0.1.1 to 0.1.2
      • protogetter: from 0.3.8 to 0.3.9
      • sloglint: from 0.7.2 to 0.9.0
      • spancheck: fix default StartSpanMatchersSlice values
      • staticcheck: from 0.5.1 to 0.6.0
    4. Deprecations
      • ⚠️ tenv is deprecated and replaced by usetesting.os-setenv: true.
      • ⚠️ exportloopref deprecation step 2
    5. Misc.
      • Sanitize severities by output format
      • Avoid panic with plugin without description
    6. Documentation
      • Clarify depguard configuration

    v1.64.1 +

    Cancelled due to CI failure.

    v1.64.0 +

    Cancelled due to CI failure.

    v1.63.4 +

    1. Linters bug fixes
      • dupl, gomodguard, revive: keep only Go-files.

    v1.63.3 +

    1. Linters bug fixes
      • gofmt, gofumpt, goimports, gci: panic with several trailing EOL
      • goheader: skip issues with invalid positions

    v1.63.2 +

    1. Linters bug fixes
      • gofmt, gofumpt, goimports, gci: panic with missing trailing EOL

    v1.63.1 +

    1. Linters bug fixes
      • cgi: invalid reports with cgo
      • gofumpt: panic with autofix and cgo

    v1.63.0 +

    1. Enhancements
      • Add support for SuggestedFixes 🎉 (35 linters can “autofix” reports).
      • Formatters (gofmt, goimports, gofumpt, gci) are applied after the suggested fixes.
    2. New linters
    3. Linters new features
      • gci: new options: no-inline-comments, no-prefix-comments
      • gomoddirectives: from 0.2.4 to 0.6.0 (new options: go-version-pattern, toolchain-pattern,toolchain-forbidden, tool-forbidden, go-debug-forbidden)
      • govet: new stdversion, waitgroup analyzers
      • importas: allow multiple empty aliases
      • loggercheck: new slog option
      • recvcheck: from 0.1.2 to 0.2.0 (new options: disable-builtin, exclusions)
      • tagliatelle: from 0.5.0 to 0.7.1 (new options: ignored-fields, extended-rules,overrides, pkg, ignore)
      • usestdlibvars: from 1.27.0 to 1.28.0 (autofix)
      • wrapcheck: from 2.9.0 to 2.10.0 (new option: extra-ignore-sigs)
    4. Linters bug fixes
      • asciicheck: from 0.2.0 to 0.3.0
      • bodyclose: from 574207250966 to ed6a65f985e
      • funlen: from 0.1.0 to 0.2.0
      • ginkgolinter: from 0.18.3 to 0.18.4
      • gochecksumtype: from 0.2.0 to 0.3.1
      • gocognit: from 1.1.3 to 1.2.0
      • godot: from 1.4.18 to 1.4.20
      • goheader: report position improvement
      • gosec: handling of global nosec option when it is false
      • iface: from 1.2.1 to 1.3.0
      • importas: from 0.1.0 to 0.2.0
      • intrange: from 0.2.1 to 0.3.0
      • makezero: from 1.1.1 to 1.2.0
      • mirror: from 1.2.0 to 1.3.0
      • nilnil: from 1.0.0 to 1.0.1
      • nosprintfhostport: from 0.1.1 to 0.2.0
      • reassign: from 0.2.0 to 0.3.0
      • spancheck: from 0.6.2 to 0.6.4
      • tagalign: from 1.3.4 to 1.4.1
      • wastedassign: from 2.0.7 to 2.1.0
      • whitespace: from 0.1.1 to 0.2.0
      • wsl: from 4.4.1 to 4.5.0
    5. Deprecations
      • ⚠️ output.uniq-by-line is deprecated and replaced by issues.uniq-by-line.
    6. Misc.
      • Improvements of the help command (color and JSON support).
      • Removes decoder, sloglint, tagalign from format preset.
      • Enables paths with junction inside Windows.
      • The timeout is disabled if run.timeout <= 0.

    v1.62.2 +

    1. Linters bug fixes
      • fatcontext: from 0.5.2 to 0.5.3
      • ginkgolinter: from 0.18.0 to 0.18.3
      • errorlint: from 1.6.0 to 1.7.0
      • iface: from 1.2.0 to 1.2.1
      • revive: from 1.5.0 to 1.5.1
      • testifylint: from 1.5.0 to 1.5.2
    2. Misc.
      • fix: ignore cache error when file not found

    v1.62.1 +

    Cancelled due to CI failure.

    v1.62.0 +

    1. New linters
    2. Linters new features
      • ginkgolinter: from 0.17.0 to 0.18.0 (new option: force-succeed)
      • gochecksumtype: from 0.1.4 to 0.2.0 (new option: default-signifies-exhaustive)
      • loggercheck: from 0.9.4 to 0.10.1 (log/slog support)
      • nilnil: from 0.1.9 to 1.0.0 (new option: detect-opposite)
      • revive: from 1.3.9 to 1.5.0 (new rules: filename-format, and file-length-limit)
      • tenv: from 1.10.0 to 1.12.1 (handle dot import)
      • testifylint: from 1.4.3 to 1.5.0 (new checkers: contains, encoded-compare, regexp)
    3. Linters bug fixes
      • bidichk: from 0.2.7 to 0.3.2 (important performance improvement)
      • canonicalheader: from 1.1.1 to 1.1.2
      • cyclop: from 1.2.1 to 1.2.3
      • dupword: from 0.1.1 to 0.1.3
      • errcheck: from 1.7.0 to 1.8.0
      • errchkjson: from 0.3.6 to 0.4.0
      • errname: from 0.1.13 to 1.0.0
      • gocritic: from 0.11.4 to 0.11.5
      • goprintffuncname: from 7558a9eaa5af to v0.1.0
      • godot: from 1.4.17 to 1.4.18
      • gosec: from 2.21.2 to 2.21.4
      • intrange: from 0.2.0 to 0.2.1
      • musttag: from 0.12.2 to 0.13.0
      • nakedret: from 2.0.4 to 2.0.5
      • noctx: from 0.0.2 to 0.1.0
      • protogetter: from 0.3.6 to 0.3.8
    4. Deprecations
      • ⚠️ execinquery: deprecation step 2
      • ⚠️ gomnd: deprecation step 2 (replaced by mnd)
    5. Misc.
      • Type sizing when cross-compiling (32-bit).
      • code-climate: add check_name field
      • Improve Go version detection
      • Fix Go version propagation
    6. Documentation
      • Adds a section about exclude-dirs-use-default
      • Improve ‘install from sources’ section
      • Improve FAQ about Go versions
      • Improve linter/rule/check docs
      • Improve new linter section
      • Improve forbidigo pattern examples for built-in functions

    v1.61.0 +

    1. Enhancements
      • Add junit-xml-extended format
      • Exclude Swagger Codegen files by default
    2. Linters new features
      • gci: from 0.13.4 to 0.13.5 (new option no-lex-order)
      • nolintlint: remove the empty line in the directive replacement
    3. Linters bug fixes
      • dupword: from 0.0.14 to 0.1.1
      • fatcontext: from 0.4.0 to 0.5.2
      • go-ruleguard: from 0.4.2 to 0fe6f58b47b1 (fix panic with custom linters)
      • godot: from 1.4.16 to 1.4.17
      • gomodguard: from 1.3.3 to 1.3.5
      • gosec: disable temporarily G407
      • gosec: from ab3f6c1c83a0 to 2.21.2 (partially fix G115)
      • intrange: from 0.1.2 to 0.2.0
    4. Misc.
      • Improve runtime version parsing
    5. Documentation
      • Add additional info about typecheck

    v1.60.3 +

    1. Updated linters
      • gosec: from 81cda2f91fbe to ab3f6c1c83a0 (fix G115 false positives)
    2. Misc.
      • Check that the Go version use to build is greater or equals to the Go version of the project

    v1.60.2 +

    1. Linters new features
      • gosec: from 5f0084eb01a9 to 81cda2f91fbe (adds G115, G405, G406, G506, G507)
    2. Linters bug fixes
      • gofmt: update to HEAD (go1.22)
      • gofumpt: from 0.6.0 to 0.7.0
      • gosec: fix G602 analyzer
      • staticcheck: from 0.5.0 to 0.5.1
      • staticcheck: propagate Go version
      • wrapcheck: from 2.8.3 to 2.9.0
    3. Deprecations
      • ⚠️ exportloopref: deprecation

    v1.60.1 +

    1. Misc.
      • 🎉 go1.23 support
    2. Linters new features
      • exhaustruct: from 3.2.0 to 3.3.0 (recognize custom error values in return)
      • govet (printf): report non-constant format, no args
      • lll: advertise max line length instead of just reporting failure
      • revive: from 1.3.7 to 1.3.9 (new rule: comments-density)
      • staticcheck: from 0.4.7 to 0.5.0
      • testifylint: from 1.3.1 to 1.4.3 (new options: formatter, suite-broken-parallel, suite-subtest-run)
    3. Linters bug fixes
      • errorlint: from 1.5.2 to 1.6.0
      • fatcontext: from 0.2.2 to 0.4.0 (fix false positives for context stored in structs)
      • gocognit: from 1.1.2 to 1.1.3
      • gomodguard: from 1.3.2 to 1.3.3
      • sloglint: from 0.7.1 to 0.7.2
      • spancheck: from 0.6.1 to 0.6.2
      • tenv: from 1.7.1 to 1.10.0 (remove reports on fuzzing)
      • tparallel: from 0.3.1 to 0.3.2
      • usestdlibvars: from 1.26.0 to 1.27.0 (fix false-positive with number used inside a mathematical operations)
      • wsl: from 4.2.1 to 4.4.1
    4. Deprecations
      • ️⚠️ unused: remove exported-is-used option
    5. Fixes
      • SARIF: sanitize level property
      • ️⚠️ typecheck issues should never be ignored
    6. Documentation
      • Add link on linter without configuration
      • Remove ’trusted by’ page
      • wsl update documentation of the configuration

    v1.60.0 +

    Cancelled due to a CI problem.

    v1.59.1 +

    1. Updated linters
      • errorlint: from 1.5.1 to 1.5.2
      • gomnd: deprecated configuration compatibility
      • intrange: add style preset
      • misspell: from 0.5.1 to 0.6.0
      • sloglint: from 0.7.0 to 0.7.1
      • testifylint: from 1.3.0 to 1.3.1
      • unparam: bump to HEAD
      • usestdlibvars: from 1.25.0 to 1.26.0
    2. Fixes
      • SARIF: init empty result slice
      • SARIF: issue column >= 1
    3. Documentation
      • revive: update documentation of the configuration

    v1.59.0 +

    1. Enhancements
      • Add SARIF output format
      • Allow the analysis of generated files (issues.exclude-generated: disable)
    2. Updated linters
      • errcheck: fix deprecation warning
      • gocritic: from 0.11.3 to 0.11.4
      • gosec: from 2.20.0 to 5f0084eb01a9 (fix G601 and G113 performance issues)
      • sloglint: from 0.6.0 to 0.7.0 (new option forbidden-keys)
      • testifylint: from 1.2.0 to 1.3.0 (new checker negative-positive and new option go-require.ignore-http-handlers)
    3. Misc.
      • ️️⚠️ Deprecate github-action output format
      • ️️⚠️ Deprecate issues.exclude-generated-strict option (replaced by issues.exclude-generated: strict)
      • ️️⚠️ Add warning about disabled and deprecated linters (level 2)

    v1.58.2 +

    1. Updated linters
      • canonicalheader: from 1.0.6 to 1.1.1
      • gosec: from 2.19.0 to 2.20.0
      • musttag: from 0.12.1 to 0.12.2
      • nilnil: from 0.1.8 to 0.1.9
    2. Documentation
      • Improve integrations and install pages

    v1.58.1 +

    1. Updated linters
      • tagalign: from 1.3.3 to 1.3.4
      • protogetter: from 0.3.5 to 0.3.6
      • gochecknoinits: fix analyzer name
    2. Fixes
      • Restores previous github-actions output format (removes GitHub Action problem matchers)

    v1.58.0 +

    1. New linters
    2. Updated linters
      • copyloopvar: from 1.0.10 to 1.1.0 (ignore-alias is replaced by check-alias with the opposite behavior)
      • decorder: from 0.4.1 to 0.4.2
      • errname: from 0.1.12 to 0.1.13
      • errorlint: from 1.4.8 to 1.5.1 (new options allowed-errors and allowed-errors-wildcard)
      • execinquery: deprecate linter ⚠️
      • gci: from 0.12.3 to 0.13.4 (new section localModule)
      • gocritic: from 0.11.2 to 0.11.3
      • spancheck: from 0.5.3 to 0.6.1
      • goerr113 is replaced by err113 ⚠️
      • gomnd is replaced by mnd ⚠️
      • gomodguard: from 1.3.1 to 1.3.2
      • grouper: from 1.1.1 to 1.1.2
      • intrange: from 0.1.1 to 0.1.2
      • mirror: from 1.1.0 to 1.2.0
      • misspell: from 0.4.1 to 0.5.1
      • musttag: from 0.9.0 to 0.12.1
      • nilnil: from 0.1.7 to 0.1.8
      • nonamedreturns: from 1.0.4 to 1.0.5
      • promlinter: from 0.2.0 to 0.3.0
      • sloglint: from 0.5.0 to 0.6.0
      • unparam: bump to HEAD (063aff900ca150b80930c8de76f11d7e6488222f)
      • whitespace: from 0.1.0 to 0.1.1
    3. Enhancements
      • Speed up “fast” linters when only “fast” linters are run: between 40% and 80% faster at first run (i.e. without cache)
    4. Fixes
      • Use version with module plugins
      • Skip go.mod report inside autogenerated processor
      • Keep only typecheck issues when needed
      • Don’t hide typecheck errors inside diff processor
    5. Misc.
      • ⚠️ log an error when using previously deprecated linters (Linter Deprecation Cycle)
        • deadcode: deprecated since v1.49.0 (2022-08-23).
        • exhaustivestruct: deprecated since v1.46.0 (2022-05-08).
        • golint: deprecated since v1.41.0 (2021-06-15).
        • ifshort: deprecated since v1.48.0 (2022-08-04).
        • interfacer: deprecated since v1.38.0 (2021-03-03).
        • maligned: deprecated since v1.38.0 (2021-03-03).
        • nosnakecase: deprecated since v1.48.0 (2022-08-04).
        • scopelint: deprecated since v1.39.0 (2021-03-25).
        • structcheck: deprecated since v1.49.0 (2022-08-23).
        • varcheck: deprecated since v1.49.0 (2022-08-23).
      • ⚠️ Deprecate usage of linter alternative names
      • Remove help display on errors with config verify command
      • Add pre-commit hook to run config verify
      • Improve github-action output
    6. Documentation
      • Remove deprecated Atom from Editor Integrations

    GitHub Action (v5.1.0) for golangci-lint:

    • supports for pull, pull_request_target, and merge_group events with the option only-new-issues.
    • ️️⚠️ skip-pkg-cache and skip-build-cache have been removed because the cache related to Go itself is already handled by actions/setup-go.
    • with golangci-lint v1.58, the file information (path and position) will be displayed on the log.

    v1.57.2 +

    1. Updated linters
      • contextcheck: from 1.1.4 to 1.1.5
      • copyloopvar: from 1.0.8 to 1.0.10
      • ginkgolinter: from 0.16.1 to 0.16.2
      • goconst: from 1.7.0 to 1.7.1
      • gomoddirectives: from 0.2.3 to 0.2.4
      • intrange: from 0.1.0 to 0.1.1
    2. Misc.
      • Display warnings on deprecated linter options
      • Fix missing colored-tab output format
      • Fix TeamCity inspectionType service message
    3. Documentation
      • Remove invalid example about mixing files and directory
      • Improve linters page

    v1.57.1 +

    1. Fixes
      • Ignore issues with invalid position (e.g. contextcheck).

    v1.57.0 +

    1. New linters
    2. Updated linters
      • dupword: from 0.0.13 to 0.0.14
      • gci: from 0.12.1 to 0.12.3
      • ginkgolinter: from 0.15.2 to 0.16.1 (new option force-expect-to, validate-async-intervals, and forbid-spec-pollution)
      • go-critic: from 0.11.1 to 0.11.2
      • go-critic: support of enable-all and disable-all options
      • go-spancheck: from 0.5.2 to 0.5.3
      • gomodguard: from 1.3.0 to 1.3.1
      • govet: deprecation of check-shadowing ⚠️
      • govet: disable temporarily httpresponse because of a bug https://github.com/golang/go/issues/66259
      • misspell: add extra-words
      • musttag: from 0.8.0 to 0.9.0
      • nakedret: from 2.0.2 to 2.0.4
      • paralleltest: from 1.0.9 to 1.0.10
      • perfsprint: from 0.6.0 to 0.7.1 (new option strconcat)
      • protogetter: from 0.3.4 to 0.3.5
      • revive: add exclude option
      • sloglint: from 0.4.0 to 0.5.0 (new option no-global)
      • staticcheck: from 0.4.6 to 0.4.7
      • testifylint: from 1.1.2 to 1.2.0 (new option bool-compare)
      • unconvert: to HEAD (new options fast-math and safe)
      • wrapcheck: from 2.8.1 to 2.8.3
      • Disable copyloopvar and intrange on Go < 1.22
    3. Enhancements
      • 🧩New custom linters system https://golangci-lint.run/docs/plugins/module-plugins/
      • Allow running only a specific linter without modifying the file configuration (--enable-only)
      • Allow custom sort order for the reports (output.sort-order)
      • Automatically adjust the maximum concurrency to the container CPU quota if run.concurrency=0
      • Add config verify command to check the configuration against the JSON Schema
      • Option to strictly follow Go generated file convention (issues.exclude-generated-strict)
      • Syntax to not override severity from linters (@linter)
      • Use severities from gosec
      • Create automatically directory related to output.formats.path
      • Use the first issue without inline on mergeLineIssues on multiple issues
    4. Misc.
      • ⚠️ Inactivate deprecated linters (deadcode, exhaustivestruct, golint, ifshort, interfacer, maligned, nosnakecase, scopelint, structcheck, varcheck)
      • ⚠️ Deprecated CLI flags have been removed (deprecated since 2018)
      • ⚠️ Move show-stats option from run to output configuration section
      • ⚠️ Replace run.skip-xxx options by issues.exclude-xxx options
      • ⚠️ Replace output.format by output.formats with a new file configuration syntax
      • Internal rewrite of the CLI
      • Improve ’no go files to analyze’ message
      • Use GOTOOLCHAIN=auto inside the Docker images
    5. Documentation

    ⚠️ Important ⚠️

    1. Deprecated linters are inactivated, you still need to disable them if you are using enable-all.
    2. Deprecated CLI flags (about linter settings and deadline) have been removed.

    v1.56.2 +

    1. updated linters
      • go-critic: from 0.11.0 to 0.11.1
      • gosec: from 2.18.2 to 2.19.0
      • testifylint: from 1.1.1 to 1.1.2
      • usestdlibvars: from 1.24.0 to 1.25.0
      • wsl: from 4.2.0 to 4.2.1
    2. misc.
      • Fix missing version in Docker image
    3. Documentation
      • Explain the limitation of new-from-rev and new-from-patch

    v1.56.1 +

    1. updated linters
      • errcheck: from 1.6.3 to 1.7.0
      • govet: disable loopclosure with go1.22
      • revive: from 1.3.6 to 1.3.7
      • testifylint: from 1.1.0 to 1.1.1

    v1.56.0 +

    1. new linters
    2. updated linters
      • depguard: from 2.1.0 to 2.2.0
      • exhaustive: from 0.11.0 to 0.12.0
      • exhaustruct: from 3.1.0 to 3.2.0
      • gci: from 0.11.2 to 0.12.1
      • ginkgolinter: from 0.14.1 to 0.15.2
      • go-check-sumtype: from 0.1.3 to 0.1.4
      • go-critic: from 0.9.0 to 0.11.0
      • go-errorlint: from 1.4.5 to 1.4.8
      • go-spancheck: from 0.4.2 to 0.5.2
      • goconst: from 1.6.0 to 1.7.0
      • godot: from 1.4.15 to 1.4.16
      • gofumpt: from 0.5.0 to 0.6.0
      • inamedparam: from 0.1.2 to 0.1.3
      • ineffassign: from 0.0.0-20230610083614-0e73809eb601 to 0.1.0
      • ireturn: from 0.2.2 to 0.3.0
      • misspell: add mode option
      • musttag: from v0.7.2 to v0.8.0
      • paralleltest: from 1.0.8 to 1.0.9
      • perfsprint: from 0.2.0 to 0.6.0
      • protogetter: from 0.2.3 to 0.3.4
      • revive: from 1.3.4 to 1.3.6
      • sloglint: add static-msg option
      • sloglint: from 0.1.2 to 0.4.0
      • testifylint: from 0.2.3 to 1.1.0
      • unparam: from 20221223090309-7455f1af531d to 20240104100049-c549a3470d14
      • whitespace: update after moving to the analysis package
      • wsl: from 3.4.0 to 4.2.0
      • zerologlint: from 0.1.3 to 0.1.5
    3. misc.
      • 🎉 go1.22 support
      • Implement stats per linter with a flag
      • Make versioning inside Docker image consistent with binaries
      • Parse Go RC version
    4. Documentation
      • Fix noctx description
      • Add missing fields to .golangci.reference.yml
      • Improve .golangci.reference.yml defaults
      • typecheck: improve FAQ
      • exhaustruct: note that struct regular expressions are expected to match the entire package/name/structname
      • wrapcheck: adjust ignoreSigs to new defaults

    Important

    testifylint has breaking changes about enabling/disabling checks:

    • If you were using the option enable with a filtered list of checks, you should either add disable-all: true (1) or use disable field (2).

        # Example (1)
      +  testifylint:
      +    disable-all: true
      +    enable:
      +      - bool-compare
      +      - compares
      +      - empty
      +      - error-is-as
      +      - error-nil
      +      - expected-actual
      +      - go-require
      +      - float-compare
      +      - len
      +      - nil-compare
      +      - require-error
      +      # - suite-dont-use-pkg
      +      - suite-extra-assert-call
      +      - suite-thelper
        # Example (2)
      +  testifylint:
      +    disable:
      +      - suite-dont-use-pkg

    v1.55.2 +

    1. updated linters
      • ireturn: from 0.2.1 to 0.2.2
      • ginkgolinter: from 0.14.0 to 0.14.1

    v1.55.1 +

    1. updated linters
      • gosec: from 2.18.1 to 2.18.2
    2. misc.
      • revgrep: from v0.5.0 to v0.5.2 (support git < 2.41.0)
      • output: convert backslashes to forward slashes for GitHub Action annotations printer

    v1.55.0 +

    1. new linters
    2. updated linters
      • bidichk: from 0.2.4 to 0.2.7
      • decorder: from 0.4.0 to 0.4.1
      • dupword: from 0.0.12 to 0.0.13
      • errchkjson: from 0.3.1 to 0.3.6
      • gci: from 0.11.0 to 0.11.2
      • ginkgolinter: from 0.13.5 to 0.14.0
      • go-errorlint: from 1.4.4 to 1.4.5
      • gocognit: from 1.0.7 to 1.1.0
      • goconst: from 1.5.1 to 1.6.0
      • godot: from 1.4.14 to 1.4.15
      • gofmt: update to HEAD
      • goimports: update to HEAD
      • gosec: from 2.17.0 to 2.18.1
      • gosmopolitan: from 1.2.1 to 1.2.2
      • govet: add appends analyzer
      • ireturn: from 0.2.0 to 0.2.1
      • protogetter: from 0.2.2 to 0.2.3
      • revgrep: from 745bb2f7c2e6 to v0.5.0
      • revive: from 1.3.2 to 1.3.4
      • sqlclosecheck: from 0.4.0 to 0.5.1
      • staticcheck: from 0.4.5 to 0.4.6
      • tagalign: from 1.3.2 to 1.3.3
      • unused: support passing in options
    3. misc.
      • Add a pre-commit hook to check all files
    4. Documentation
      • add source options to exclude-rules docs
      • gosec: add G602 to includes/excludes inside .golangci.reference.yml

    v1.54.2 +

    1. updated linters:
      • errname: from 0.1.10 to 0.1.12
      • ginkgolinter: from 0.13.3 to 0.13.5
      • go-errorlint: from 1.4.3 to 1.4.4
      • godot: from 1.4.11 to 1.4.14
      • gosec: from 2.16.0 to 2.17.0
      • musttag: from 0.7.1 to 0.7.2
      • nilnil: from 0.1.5 to 0.1.7
      • staticcheck: from 0.4.3 to 0.4.5
      • usestdlibvars: from 1.23.0 to 1.24.0
      • govet: add missing directive and slog passes

    v1.54.1 +

    1. updated linters:
      • go-critic: from 0.8.2 to 0.9.0
    2. misc.
      • plugin: temporarily hide warning about using plugins using the old API

    v1.54.0 +

    1. updated linters:
      • decorder: from 0.2.3 to 0.4.0
      • dupword: from 0.0.11 to 0.0.12
      • errorlint: from 1.4.2 to 1.4.3
      • exhaustruct: from 2.3.0 to 3.1.0
      • forbidigo: from 1.5.3 to 1.6.0
      • funlen: from 0.0.3 to 0.1.0
      • gci: from 0.10.1 to 0.11.0
      • ginkgolinter: from 0.12.1 to 0.13.3
      • go-critic: from 0.8.1 to 0.8.2
      • go-errorlint: from 1.4.2 to 1.4.3
      • go-exhaustruct: from 2.3.0 to 3.1.0
      • gocognit: from 1.0.6 to 1.0.7
      • gocritic: from 0.8.1 to 0.8.2
      • gofmt: autofix missing newline at EOF
      • misspell: 0.4.0 to 0.4.1
      • musttag: from 0.7.0 to 0.7.1
      • paralleltest: from 1.0.7 to 1.0.8
      • tagalign: from 1.2.2 to 1.3.2
      • typecheck: explain it and remove it from the linter list
      • zerologlint: from 0.1.2 to 0.1.3
    2. misc.
      • 🎉 go1.21 support
      • plugin: include custom linters in enable-all
      • plugin: allow to use settings for plugins
    3. Documentation
      • Add linter descriptions.

    Important

    ruleguard (a “rule” inside gocritic) was disabled in this release (v1.54.0) and was enabled again in the next release (v1.54.1).

    exhaustruct has breaking changes with regular expressions, more details here.

    v1.53.3 +

    1. updated linters:
      • cyclop: from 1.2.0 to 1.2.1
      • exhaustive: from 0.10.0 to 0.11.0
      • forbidigo: from 1.5.1 to 1.5.3
      • ginkgolinter: from 0.12.2 to 0.12.1
      • ineffassign: bump to HEAD
      • nakedret: from 2.0.1 to 2.0.2
      • zerologlint: from 0.1.1 to 0.1.2
    2. misc.
      • codeclimate: reduce memory allocation
      • support illumos/amd64

    v1.53.2 +

    1. updated linters
      • depguard: from v2.0.1 to 2.1.0
    2. misc.
      • depguard: throw error only when the linter is called

    v1.53.1 +

    1. misc.
      • depguard: fix GOROOT detection
      • importas: fix duplication detection when aliases use regular expression replacement pattern

    v1.53.0 +

    1. new linters
    2. updated linters
      • bodyclose: bump to HEAD
      • containedctx: from 1.0.2 to 1.0.3
      • depguard: migrate to v2
      • errname: from 0.1.9 to 0.1.10
      • exhaustive: from 0.9.5 to 0.10.0
      • forbidigo: better support for configuring complex rules
      • gci: improve error message
      • ginkgolinter: add suppress-async-assertion option
      • ginkgolinter: from 0.9.0 to 0.12.0
      • go-critic: from 0.7.0 to 0.8.1
      • go-errorlint: from 1.4.0 to 1.4.2
      • gofumpt: from 0.4.0 to 0.5.0
      • gosec: convert global settings as map with proper key type
      • gosec: from 2.15.0 to 2.16.0
      • importas: detect duplicate alias or package in the configuration
      • importas: fix typo in logs
      • ireturn: from 0.1.1 to 0.2.0
      • musttag: from 0.5.0 to 0.7.0
      • nakedret: to 2.0.1
      • nilnil: from 0.1.3 to 0.1.5
      • paralleltest: from 1.0.6 to 1.0.7
      • revive: from 1.3.1 to 1.3.2
      • tagliatelle: from 0.4.0 to 0.5.0
      • usestdlibvars: fix configuration
    3. misc.
      • golang.org/x/tools: from 0.7.0 to 0.9.2
      • add loongarch64 to the install script
      • output: add colored-tab
      • remove warning when the config file is explicitly stdin
      • rules: support inverted path match
    4. Documentation
      • mnd: clarify ignore usage examples to be regexps
      • tagliatelle: update documentation
      • improve features section
      • update supported Go versions FAQ

    v1.52.2 +

    1. updated linters
      • tparallel: from 0.3.0 to 0.3.1
    2. misc.
      • fix: pre-commit require_serial and pass_filenames

    v1.52.1 +

    1. misc.
      • fix: improve panic management
      • fix: the combination of –fix and –path-prefix

    v1.52.0 +

    1. updated linters
      • asciicheck: from 0.1.1 to 0.2.0
      • bidichk: from 0.2.3 to 0.2.4
      • contextcheck: from 1.1.3 to 1.1.4
      • dupword: from 0.0.9 to 0.0.11
      • durationcheck: from 0.0.9 to 0.0.10
      • errchkjson: from 0.3.0 to 0.3.1
      • errname: from 0.1.7 to 0.1.9
      • forbidigo: from 1.4.0 to 1.5.1
      • gci: from 0.9.1 to 0.10.1
      • ginkgolinter: from 0.8.1 to 0.9.0
      • go-critic: from 0.6.7 to 0.7.0
      • go-errorlint: from 1.1.0 to 1.4.0
      • godox: bump to HEAD
      • lll: skip go command
      • loggercheck: from 0.9.3 to 0.9.4
      • musttag: from 0.4.5 to 0.5.0
      • nilnil: from 0.1.1 to 0.1.3
      • noctx: from 0.0.1 to 0.0.2
      • revive: from 1.2.5 to 1.3.1
      • rowserrcheck: remove limitation related to generics support
      • staticcheck: from 0.4.2 to 0.4.3
      • testpackage: from 1.1.0 to 1.1.1
      • tparallel: from 0.2.1 to 0.3.0
      • wastedassign: remove limitation related to generics support
      • wrapcheck: from 2.8.0 to 2.8.1
    2. misc.
      • Add TeamCity output format
      • Consider path prefix when matching path patterns
      • Add Go version to version information
    3. Documentation
      • Add Tekton in Trusted By page
      • Clarify that custom linters are not enabled by default
      • Remove description for deprecated “go” option

    v1.51.2 +

    1. updated linters
      • forbidigo: from 1.3.0 to 1.4.0
      • gci: from 0.9.0 to 0.9.1
      • go-critic: from 0.6.5 to 0.6.7
      • go-errorlint: from 1.0.6 to 1.1.0
      • gosec: from 2.14.0 to 2.15.0
      • musttag: from 0.4.4 to 0.4.5
      • staticcheck: from 0.4.0 to 0.4.2
      • tools: from 0.5.0 to 0.6.0
      • usestdlibvars: from 1.21.1 to 1.23.0
      • wsl: from 3.3.0 to 3.4.0
      • govet: enable timeformat by default
    2. misc.
      • fix: cache status size calculation
      • add new source archive
    3. Documentation
      • Improve installation section
      • Replace links to godoc.org with pkg.go.dev

    v1.51.1 +

    1. updated linters
      • ginkgolinter: from 0.7.1 to 0.8.1
      • ineffassign: bump to HEAD
      • musttag: from 0.4.3 to 0.4.4
      • sqlclosecheck: from 0.3.0 to 0.4.0
      • staticcheck: bump to v0.4.0
      • wastedassign: from 2.0.6 to 2.0.7
      • wrapcheck: from 2.7.0 to 2.8.0

    v1.51.0 +

    1. new linters
    2. updated linters
      • bodyclose: to HEAD
      • dupword: from 0.0.7 to 0.0.9
      • errcheck: from 1.6.2 to 1.6.3
      • exhaustive: from 0.8.3 to 0.9.5
      • exportloopref: from 0.1.8 to 0.1.11
      • gci: from 0.8.1 to 0.9.0
      • ginkgolinter: from 0.6.0 to 0.7.1
      • go-errorlint: from 1.0.5 to 1.0.6
      • go-ruleguard: from 0.3.21 to 0.3.22
      • gocheckcompilerdirectives: from 1.1.0 to 1.2.1
      • gochecknoglobals: from 0.1.0 to 0.2.1
      • gomodguard: from 1.2.4 to 1.3.0
      • gosec: from 2.13.1 to 2.14.0
      • govet: Add timeformat to analysers
      • grouper: from 1.1.0 to 1.1.1
      • musttag: from 0.4.1 to 0.4.3
      • revive: from 1.2.4 to 1.2.5
      • tagliatelle: from 0.3.1 to 0.4.0
      • tenv: from 1.7.0 to 1.7.1
      • unparam: bump to HEAD
      • usestdlibvars: from 1.20.0 to 1.21.1
      • wsl: fix force-err-cuddling flag
    3. misc.
      • go1.20 support
      • remove deprecated linters from presets
      • Build NetBSD binaries
      • Build loong64 binaries
    4. Documentation
      • goimport: improve documentation for local-prefixes
      • gomnd: add missing always ignored functions
      • nolint: fix typo
      • tagliatelle usage typo
      • add note about binary requirement for plugin
      • cache preserving and colored output on docker runs
      • improve documentation about debugging.
      • improve Editor Integration section
      • More specific default cache directory
      • update output example to use valid checkstyle example; add json example

    v1.50.1 +

    1. updated linters
      • contextcheck: from 1.1.2 to 1.1.3
      • go-mnd: from 2.5.0 to 2.5.1
      • wrapcheck: from 2.6.2 to 2.7.0
      • revive: fix configuration parsing
      • lll: skip imports
    2. misc.
      • windows: remove redundant character escape ‘/’
      • code-climate: add default severity

    v1.50.0 +

    1. new linters
    2. updated linters
      • contextcheck: change owner
      • contextcheck: from 1.0.6 to 1.1.2
      • depguard: from 1.1.0 to 1.1.1
      • exhaustive: add missing config
      • exhaustive: from 0.8.1 to 0.8.3
      • gci: from 0.6.3 to 0.8.0
      • go-critic: from 0.6.4 to 0.6.5
      • go-errorlint: from 1.0.2 to 1.0.5
      • go-reassign: v0.1.2 to v0.2.0
      • gofmt: add option rewrite-rules
      • gofumpt from 0.3.1 to 0.4.0
      • goimports: update to HEAD
      • interfacebloat: fix configuration loading
      • logrlint: rename logrlint to loggercheck
      • paralleltest: add tests of the ignore-missing option
      • revive: from 1.2.3 to 1.2.4
      • usestdlibvars: from 1.13.0 to 1.20.0
      • wsl: support all configs and update docs
    3. misc.
      • Normalize exclude-rules paths for Windows
      • add riscv64 to the install script
    4. Documentation
      • cli: remove reference to old service

    v1.49.0 +

    IMPORTANT: varcheck and deadcode has been removed of default linters.

    1. new linters
    2. updated linters
      • go-colorable: from 0.1.12 to 0.1.13
      • go-critic: from 0.6.3 to 0.6.4
      • go-errorlint: from 1.0.0 to 1.0.2
      • go-exhaustruct: from 2.2.2 to 2.3.0
      • gopsutil: from 3.22.6 to 3.22.7
      • gosec: from 2.12.0 to 2.13.1
      • revive: from 1.2.1 to 1.2.3
      • usestdlibvars: from 1.8.0 to 1.13.0
      • contextcheck: from v1.0.4 to v1.0.6 && re-enable
      • nosnakecase: This linter is deprecated.
      • varcheck: This linter is deprecated use unused instead.
      • deadcode: This linter is deprecated use unused instead.
      • structcheck: This linter is deprecated use unused instead.
    3. documentation
      • revive: fix wrong URL
      • Add a section about default exclusions
      • usestdlibvars: fix typo in documentation
      • nolintlint: remove allow-leading-space option
      • Update documentation and assets
    4. misc.
      • dev: rewrite the internal tests framework
      • fix: exit early on run –version
      • fix: set an explicit GOROOT in the Docker image for go-critic

    v1.48.0 +

    1. new linters
      • usestdlibvars:https://github.com/sashamelentyev/usestdlibvars
    2. updated linters
      • contextcheck: disable linter
      • errcheck: from 1.6.1 to 1.6.2
      • gci: add missing custom-order setting
      • gci: from 0.5.0 to 0.6.0
      • ifshort: deprecate linter
      • nolint: drop allow-leading-space option and add “nolint:all”
      • revgrep: bump to HEAD
    3. documentation
      • remove outdated info on source install
    4. misc
      • go1.19 support

    v1.47.3 +

    1. updated linters:
      • remove some go1.18 limitations
      • asasalint: from 0.0.10 to 0.0.11
      • decorder: from 0.2.2 to v0.2.3
      • gci: fix panic with invalid configuration option
      • gci: from 0.4.3 to v0.5.0
      • go-exhaustruct: from 2.2.0 to 2.2.2
      • gomodguard: from 1.2.3 to 1.2.4
      • nosnakecase: from 1.5.0 to 1.7.0
      • honnef.co/go/tools: from 0.3.2 to v0.3.3
    2. misc
      • cgo: fix linters ignoring CGo files

    v1.47.2 +

    1. updated linters:
      • revive: ignore slow rules

    v1.47.1 +

    1. updated linters:
      • gci: from 0.4.2 to 0.4.3
      • gci: remove the use of stdin
      • gci: fix options display
      • tenv: from 1.6.0 to 1.7.0
      • unparam: bump to HEAD

    v1.47.0 +

    1. new linters:
    2. updated linters:
      • decorder: from 0.2.1 to 0.2.2
      • errcheck: from 1.6.0 to 1.6.1
      • errname: from 0.1.6 to 0.1.7
      • exhaustive: from 0.7.11 to 0.8.1
      • gci: fix issues and re-enable autofix
      • gci: from 0.3.4 to 0.4.2
      • go-exhaustruct: from 2.1.0 to 2.2.0
      • go-ruleguard: from 0.3.19 to 0.3.21
      • gocognit: from 1.0.5 to 1.0.6
      • gocyclo: from 0.5.1 to 0.6.0
      • golang.org/x/tools: bump to HEAD
      • gosec: allow global config
      • gosec: from 2.11.0 to 2.12.0
      • nonamedreturns: from 1.0.1 to 1.0.4
      • paralleltest: from 1.0.3 to 1.0.6
      • staticcheck: fix generics
      • staticcheck: from 0.3.1 to 0.3.2
      • tenv: from 1.5.0 to 1.6.0
      • testpackage: from 1.0.1 to 1.1.0
      • thelper: from 0.6.2 to 0.6.3
      • wrapcheck: from 2.6.1 to 2.6.2
    3. documentation:
      • add thanks page
      • add a clear explanation about the staticcheck integration.
      • depguard: add ignore-file-rules
      • depguard: adjust phrasing
      • gocritic: add enable and disable ruleguard settings
      • gomnd: fix typo
      • gosec: add configs for all existing rules
      • govet: add settings for shadow and unusedresult
      • thelper: add fuzz config and description
      • linters: add defaults

    v1.46.2 +

    1. updated linters:
      • execinquery: bump from v1.2.0 to v1.2.1
      • errorlint: bump to v1.0.0
      • thelper: allow to disable one option
    2. documentation:
      • rename .golangci.example.yml to .golangci.reference.yml
      • add containedctx linter to the list of available linters

    v1.46.1 +

    1. updated linters:
      • execinquery: bump from v0.6.0 to v0.6.1
    2. documentation:
      • add missing linters

    v1.46.0 +

    1. new linters:
    2. updated linters:
      • bidichk: from 0.2.2 to 0.2.3
      • deadcode: bump to HEAD
      • errchkjson: from 0.2.3 to 0.3.0
      • errname: from 0.1.5 to 0.1.6
      • go-critic: from 0.6.2 to 0.6.3
      • gocyclo: from 0.4.0 to 0.5.1
      • gofumpt from 0.3.0 to 0.3.1
      • gomoddirectives: from 0.2.2 to 0.2.3
      • gosec: from 2.10.0 to 2.11.0
      • honnef.co/go/tools: from 0.2.2to 0.3.1 (go1.18 support)
      • nilnil: from 0.1.0 to 0.1.1
      • nonamedreturns: bump from 1.0.0 to 1.0.1
      • predeclared: from 0.2.1 to 0.2.2
      • promlinter: bump to v0.2.0
      • revive: from 1.1.4 to 1.2.1
      • tenv: from 1.4.7 to 1.5.0
      • thelper: from 0.5.1 to 0.6.2
      • unused: fix false-positive
      • varnamelen: bump to v0.8.0
      • wrapcheck: from 2.5.0 to 2.6.1
      • exhaustivestruct: This linter is deprecated use exhaustruct instead.
    3. documentation:
      • Update “Shell Completion” instruction on Linux
      • Update FAQ page
    4. misc:
      • log: enable override coloring based on CLICOLOR and CLICOLOR_FORCE

    v1.45.2 +

    1. misc:
      • fix: help command

    v1.45.1 +

    1. updated linters:
      • interfacer: inactivate with go1.18
      • govet: inactivate unsupported analyzers (go1.18)
      • depguard: reduce requirements
      • structcheck: inactivate with go1.18
      • varnamelen: bump from v0.6.0 to v0.6.1
    2. misc:
      • Automatic Go version detection 🎉 (go1.18)
      • docker: update base images (go1.18)

    v1.45.0 +

    1. updated linters:
      • cobra: from 1.3.0 to 1.4.0
      • containedctx: from 1.0.1 to 1.0.2
      • errcheck: add an option to remove default exclusions
      • gci: from 0.3.1 to 0.3.2
      • go-header: from 0.4.2 to 0.4.3
      • gofumpt: add module-path setting
      • gofumpt: from 0.2.1 to 0.3.0
      • gopsutil: from 3.22.1 to 3.22.2
      • gosec: from 2.9.6 to 2.10.0
      • makezero: from 1.1.0 to 1.1.1
      • revive: fix default values
      • wrapcheck: from 2.4.0 to 2.5.0
    2. documentation:
      • docs: add “back to the top” button
      • docs: add forbidigo example that uses comments
      • docs: improve linters page
    3. misc:
      • go1.18 support 🎉
      • Add an option to manage the targeted version of Go
      • Default to YAML when config file has no extension

    v1.44.2 +

    1. updated linters:
      • gci: bump to HEAD
      • gci: restore defaults for sections
      • whitespace: from 0.0.4 to 0.0.5
    2. documentation:
      • add link to configuration in the linters list

    v1.44.1 +

    1. updated linters:
      • bidichk: from 0.2.1 to 0.2.2
      • errchkjson: from 0.2.1 to 0.2.3
      • thelper: from 0.5.0 to 0.5.1
      • tagliatelle: from 0.3.0 to 0.3.1
      • gopsutil: from 3.21.12 to 3.22.1
      • gci: from 0.2.9 to 0.3.0
      • revive: from v1.1.3 to v1.1.4
      • varnamelen: from v0.5.0 to v0.6.0
    2. documentation:
      • linters: improve configuration pages
      • decorder: fix disable-init-func-first-check: false elaboration
    3. misc:
      • fix debug output

    v1.44.0 +

    1. new linters:
    2. updated linters:
      • asciicheck: bump to v0.1.1
      • bidichk: from 0.1.1 to 0.2.1
      • bodyclose: bump to HEAD
      • decorder: from 0.2.0 to 0.2.1
      • depguard: from 1.0.1 to 1.1.0
      • errchkjson: from 0.2.0 to 0.2.1
      • errorlint: bump to HEAD
      • exhaustive: drop deprecated/unused settings
      • exhaustive: from v0.2.3 to 0.7.11
      • forbidigo: from 1.2.0 to 1.3.0
      • forcetypeassert: bump to v0.1.0
      • gocritic: from 0.6.1 to 0.6.2
      • gocritic: support autofix
      • gocyclo: from 0.3.1 to 0.4.0
      • godot: add period option
      • gofumpt: from 0.1.1 to 0.2.1
      • gomnd: from 2.4.0 to 2.5.0
      • gomnd: new configuration
      • gosec: from 2.9.1 to 2.9.6
      • ifshort: from 1.0.3 to 1.0.4
      • ineffassign: bump to HEAD
      • makezero: to v1.1.0
      • promlinter: from v0.1.0 to HEAD
      • revive: fix enableAllRules
      • revive: from 1.1.2 to 1.1.3
      • staticcheck: from 0.2.1 to 0.2.2
      • tagliatelle: from 0.2.0 to 0.3.0
      • thelper: from 0.4.0 to 0.5.0
      • unparam: bump to HEAD
      • varnamelen: bump to v0.5.0
      • wrapcheck: update configuration to include ignoreSignRegexps
    3. documentation:
      • linters: improve pages about configuration
      • improve page about false-positive
      • nolintlint: fix wrong default value in comment
      • revive: add a more detailed configuration
    4. misc:
      • outputs: Add support for multiple outputs
      • outputs: Print error text in <failure> tag content for more readable JUnit output
      • outputs: ensure that the Issues key in JSON format is a list
      • Return error if any linter fails to run
      • cli: Show deprecated mark in the CLI linters help

    November 2021 +

    1. new linters:
    2. update linters:
      • nestif: from 0.3.0 to 0.3.1
      • rowserrcheck: from 1.1.0 to 1.1.1
      • gopsutil: from 3.21.9 to 3.21.10
      • wrapcheck: from 2.3.1 to 2.4.0
      • gocritic: add support for variable substitution in ruleguard path settings
    3. documentation:
      • improve go-critic documentation
      • improve nolintlint documentation
    4. Misc:
      • cli: don’t hide enable-all option

    october 2021 +

    1. new linters:
    2. update linters:
      • gochecknoglobals: to v0.1.0
      • gosec: filter issues according to the severity and confidence
      • errcheck: empty selector name.
      • ifshort: from 1.0.2 to 1.0.3
      • go-critic: from 0.5.6 to 0.6.0
      • gosec: from 2.8.1 to 2.9.1
      • durationcheck: from 0.0.8 to 0.0.9
      • wrapcheck: from 2.3.0 to 2.3.1
      • revive: from 1.1.1 to 1.1.2

    September 2021 +

    1. new linters:
    2. update linters:
      • errcheck: update to HEAD
      • errname: from 0.1.4 to 0.1.5
      • gci: Parse the settings more similarly to the CLI
      • godot: from 1.4.9 to 1.4.11
      • ireturn: from 0.1.0 to 0.1.1
      • nlreturn: add block-size option
      • paralleltest: from 1.0.2 to 1.0.3
    3. Misc:
      • new-from-rev: add support for finding issues in entire files in a diff

    August 2021 +

    1. new linters:
    2. update linters:
      • errname: from 0.1.3 to 0.1.4
      • go-critic: fix invalid type conversions.
      • godot: from 1.4.8 to 1.4.9
      • gomodguard: from 1.2.2 to 1.2.3
      • revive: from 1.0.9 to 1.1.1
      • staticcheck: bump to 2021.1.1 (v0.2.1)
      • wrapcheck: bump to v2.3.0
    3. Misc:
      • build binaries and Docker images with go1.17

    July 2021 +

    1. update linters:
      • errcheck: allow exclude config without extra file
      • exhaustive: from 0.1.0 to 0.2.3
      • gocognit: from 1.0.1 to 1.0.5
      • godot: from 1.4.7 to 1.4.8
      • gomoddirectives: from 0.2.1 to 0.2.2
      • revive: from 1.0.8 to 1.0.9
    2. documentation:
      • improve goconst documentation
      • improve goimports description

    June 2021 +

    1. update linters:
      • durationcheck: from 0.0.7 to 0.0.8
      • gci: from 0.2.8 to 0.2.9
      • goconst: from 0.5.6 to 0.5.7
      • gofumpt: Add lang-version option
      • gomodguard: from 1.2.1 to 1.2.2
      • gosec: from 2.8.0 to 2.8.1
      • revive: add enable-all-rules.
      • revive: allow to disable rule
      • revive: fix exclude comment rule for const block
      • revive: from 1.0.7 to 1.0.8
      • wrapcheck: from 2.1.0 to 2.2.0
    2. documentation:
      • add all integrations to docs introduction page
    3. Misc:
      • 🎉 Un-deprecate enable-all option
      • output: generate HTML report
      • Support RISV64

    May 2021 +

    1. new linters:
    2. update linters:
      • durationcheck: from 0.0.6 to 0.0.7
      • errorlint: bump to HEAD
      • forbidigo: from 1.1.0 to 1.2.0
      • go-critic: from 0.5.5 to 0.5.6
      • godot: from 1.4.6 to 1.4.7
      • golint: deprecated
      • gomnd: from 2.3.2 to 2.4.0
      • gomodguard: fix problem where duplicate issues were reported
      • gosec: from 2.7.0 to 2.8.0
      • govet: fix sigchanyzer
      • govet: Update vet passes
      • importas: allow repeated aliases
      • importas: bump to HEAD
      • makezero: bump to HEAD
      • nolintlint: fix false positive
      • revive: convert hard coded excludes into default exclude patterns
      • revive: fix add-constant rule support
      • revive: fix excludes
      • revive: from 1.0.6 to 1.0.7
      • revive: improve ’exported’ rule output
      • rowserrcheck: bump to v1.1.0
      • staticcheck: configuration for staticcheck, gosimple, stylecheck
      • staticcheck: from 0.1.3 to 0.1.4
      • staticcheck: from v0.1.4 to v0.2.0
      • wastedassign: from 0.2.0 to 1.0.0
      • wastedassign: from 1.0.0 to v2.0.6
      • wrapcheck: from 1.2.0 to 2.1.0
    3. documentation:
      • improve linters page
      • exhaustivestruct example explanation
      • fix pattern of forbidigo in example config yaml
      • bump documentation dependencies
      • fix typos
    4. Misc:
      • set the minimum Go version to go1.15
      • non-zero exit code when a linter produces a panic

    April 2021 +

    1. new linters:
    2. update linters:
      • godot: from 1.4.4 to 1.4.6
      • wrapcheck: from 1.0.0 to 1.2.0
      • go-mnd: from 2.3.1 to 2.3.2
      • wsl: from 3.2.0 to 3.3.0
      • revive: from 1.0.5 to 1.0.6
      • importas: bump to HEAD
      • staticcheck: configurable Go version
      • gosec: add configuration
      • typecheck: improve error stack parsing
    3. documentation:
      • bump documentation dependencies
      • fix typos
    4. Misc:
      • fix: comma in exclude pattern leads to unexpected results

    March 2021 +

    1. new linters:
    2. update linters:
      • go-critic: from 0.5.4 to 0.5.5
      • gofumpt: from v0.1.0 to v0.1.1
      • gosec: from 2.6.1 to 2.7.0
      • ifshort: bump to v1.0.2
      • importas: bump to HEAD
      • makezero: bump to HEAD
      • nolintlint: allow to fix //nolint lines
      • revive: from 1.0.3 to 1.0.5
      • revive: the default configuration is only applied when no dedicated configuration
      • rowserrcheck: bump to HEAD
      • scopelint: deprecated
      • staticcheck: from v0.1.2 (2020.2.2) to v0.1.3 (2020.2.3)
      • 🎉 typecheck: display compilation errors as report instead of error
      • wastedassign: bump to v0.2.0
      • wrapcheck: bump to v1.0.0
    3. documentation:
    4. Misc:
      • Set version command output to Stdout
      • fix linters load mode
      • Restore fast linters meaning

    February 2021 +

    1. new linters:
    2. update linters:
      • prealloc: Use upstream version
      • errcheck: Use upstream version
      • ineffassign: Use upstream version
      • gocyclo: Use upstream version
      • godot from 1.3.2 to 1.4.3
      • exhaustivestruct from 1.1.0 to 1.2.0
      • forbidigo from 1.0.0 to 1.1.0
      • thelper from 0.2.1 to 0.3.1
      • ruleguard: print error message and exit with non-zero status when parsing error occurs
      • fix wrong load mode for asciicheck, exhaustivestruct, exportloopref, and makezero
      • wsl: bump to v3.2.0
      • durationcheck: from 0.0.4 to 0.0.6
      • staticcheck: from 2020.1.6 to v0.1.2 (2020.2.2)
      • thelper from 0.3.1 to 0.4.0
      • bodyclose: bump to HEAD
      • go-err113: bump to HEAD
      • interfacer: deprecated
      • maligned: deprecated (govet fieldalignment as replacement)
      • govet: use same default linter as go vet
      • go-printf-func-name: to v0.0.0-20200119135958-7558a9eaa5af
      • godox: to v0.0.0-20210227103229-6504466cf951
      • asciicheck: to v0.0.0-20200416200610-e657995f937b
      • wrapcheck: to v0.0.0-20201130113247-1683564d9756
      • unparam: to v0.0.0-20210104141923-aac4ce9116a7
    3. CLI: truncate multiline descriptions
    4. fix: new-from-rev for a large repository
    5. Support RelatedInformation for analysis Diagnostic
    6. use go1.16 to create binaries
    7. fix: MIPS release
    8. documentation:
      • bump documentation dependencies
      • fix go-header usage
      • improve gocritic description
      • update deprecated hyperlink for Sublime Text plugin
      • add docs on using homebrew tap

    January 2021 +

    1. new linters:
    2. update linters:
      • go-critic from 0.5.2 to 0.5.3
      • thelper from 0.1.0 to 0.2.1
      • Validate go-critic settings
      • gofumpt to v0.1.0
      • gci to v0.2.8
      • go-mnd to v2.3.1
      • gosec from 2.5.0 to 2.6.1
      • godot from 1.3.2 to 1.4.3
      • ifshort to v1.0.1
      • rowserrcheck: fix reports false positive
    3. fix: modules-download-mode support
    4. documentation:
      • bump documentation dependencies

    December 2020 +

    1. new linters:
    2. update linters:
      • go-header from v0.3.1 to v0.4.2
      • go-mnd from v2.0.0 to v2.2.0
      • godot from v1.3.0 to v1.3.2
      • gci from v0.2.4 to v0.2.7
      • gomodguard from v1.1.0 to v1.2.0
      • go-errorlint from v0.0.0-20201006195004-351e25ade6e3 to v0.0.0-20201127212506-19bd8db6546f
      • gofumpt from v0.0.0-20200802201014-ab5a8192947d to v0.0.0-20201129102820-5c11c50e9475
      • nolintlint fix comment analysis. (#1571)
    3. result/processors: treat all non-Go source as special autogenerated files
    4. throw an error on panic. (#1540)
    5. resolve custom linters’ path relative to config file directory (#1572)
    6. treat all non-Go source as special autogenerated files
    7. documentation:
      • add settings examples for gocritic (#1562)
      • removing reference to no-longer-existing linter-in-the-cloud (#1553)
    8. others:
      • bump gopkg.in/yaml.v2 from 2.3.0 to 2.4.0 (#1528)
      • bump gatsby-remark-responsive-iframe in /docs (#1533)
      • bump gatsby-remark-images from 3.3.29 to 3.6.0 in /docs (#1531)
      • bump ini from 1.3.5 to 1.3.8 in /tools (#1560)
      • bump react-headroom from 3.0.0 to 3.0.1 in /docs (#1532)
      • bump react-live from 2.2.2 to 2.2.3 in /docs (#1534)
      • bump react from 16.13.1 to 16.14.0 in /docs (#1481)
      • Fix forbidigo linter name in reports (#1590)

    November 2020 +

    1. new linters:
    2. update linters:
    3. DefaultExcludePatterns should only be used for specified linter (#1494)
    4. unknown linter breaks //nolint (#1497)
    5. report all unknown linters at once (#1477)
    6. CI:
      • fix Docker tag for Alpine build
    7. documentation:
      • missing sort-results in the docs (#1514)
      • add description of Homebrew’s official formula (#1421)
    8. others:
      • bump golang.org/x/text to v0.3.4 (#1293)
      • bump github.com/fatih/color to from 1.9.0 to 1.10.0 (#1485)
      • bump lodash from 4.17.15 to 4.17.19 in /.github/peril (#1252)
      • bump polished from 3.6.6 to 4.0.3 in /docs (#1482)
      • bump gatsby-alias-imports from 1.0.4 to 1.0.6 in /docs (#1479)
      • bump puppeteer from 5.3.1 to 5.4.1 in /docs (#1480)
      • bump gatsby-remark-embedder from 3.0.0 to 4.0.0 in /docs (#1478)

    October 2020 +

    1. new linters:
    2. update linters:
    3. add support for powershell completion (#1408)
    4. add .golangci.yaml to list of configuration files searched on startup (#1364)
    5. support for only specifying default severity (#1396)
    6. documentation:
      • mention macports installation procedure on macOS (#1352)
      • sort linters (#1451)
    7. CI:
      • add codeQL scanning (#1405)
      • fix version details in Docker image (#1471)
      • releasing docker image for arm64 (#1383)
      • change interval for npm to monthly (#1424)
    8. others:
      • use tag version for cobra (#1458)
      • bump nancy to 1.0.1 (#1410)
      • bump gatsby-plugin-catch-links in /docs (#1415)
      • bump gatsby-plugin-mdx from 1.2.40 to 1.2.43 in /docs (#1419)
      • bump gatsby-plugin-sharp from 2.6.31 to 2.6.40 in /docs (#1423)
      • bump gatsby-plugin-sitemap from 2.4.12 to 2.4.14 in /docs (#1417)
      • bump github.com/mattn/go-colorable from 0.1.7 to 0.1.8 (#1413)
      • bump github.com/sirupsen/logrus from 1.6.0 to 1.7.0 (#1412)
      • bump github.com/sourcegraph/go-diff from 0.6.0 to 0.6.1 (#1414)
      • bump golangci/golangci-lint-action from v2 to v2.3.0 (#1447) (#1469)
      • bump puppeteer from 3.3.0 to 5.3.1 in /docs (#1418)

    September 2020 +

    1. update linters:
      • godot from 0.4.8 to 0.4.9
      • exhaustive from v0.0.0-20200708172631-8866003e3856 to v0.0.0-20200811152831-6cf413ae40e0
      • gofumpt from v0.0.0-20200709182408-4fd085cb6d5f to v0.0.0-20200802201014-ab5a8192947d
    2. add support for fish completion (#1201)
    3. documentation:
      • fix typo in performance docs (#1350)
    4. CI:
      • prevent macos to be marked as passing upon failure (#1381)
      • check only for go.mod file (#1397)
      • check if go.mod and go.sum are up to dated (#1377)
      • trigger Netlify (#1358)
    5. others:
      • bump github.com/sourcegraph/go-diff from 0.5.3 to 0.6.0 (#1353)
      • bump github.com/valyala/quicktemplate from 1.6.2 to 1.6.3 (#1385)
      • ignore known dependency failure in nancy (#1378)
      • bump @mdx-js/mdx from 1.6.16 to 1.6.18 in /docs (#1401)
      • bump gatsby from 2.24.52 to 2.24.65 in /docs (#1400)
      • bump gatsby-plugin-canonical-urls in /docs (#1390)
      • bump gatsby-plugin-google-analytics in /docs (#1388)
      • bump gatsby-plugin-manifest from 2.4.23 to 2.4.27 in /docs (#1355)
      • bump gatsby-plugin-mdx from 1.2.35 to 1.2.40 in /docs (#1386)
      • bump gatsby-plugin-offline from 3.2.23 to 3.2.27 in /docs (#1368)
      • bump gatsby-plugin-sharp from 2.6.25 to 2.6.31 in /docs (#1354)
      • bump gatsby-plugin-sitemap from 2.4.11 to 2.4.12 in /docs (#1344)
      • bump gatsby-remark-autolink-headers in /docs (#1387)
      • bump gatsby-remark-images from 3.3.25 to 3.3.28 in /docs (#1345)
      • bump gatsby-remark-images from 3.3.28 to 3.3.29 in /docs (#1365)
      • bump gatsby-remark-mermaid from 2.0.0 to 2.1.0 in /docs (#1369)
      • bump gatsby-source-filesystem in /docs (#1366)
      • bump gatsby-source-filesystem in /docs (#1389)
      • bump gatsby-transformer-sharp in /docs (#1402)
      • bump gatsby-transformer-yaml from 2.4.10 to 2.4.11 in /docs (#1367)
      • bump node-fetch in /.github/contributors (#1363)
      • bump polished from 3.6.5 to 3.6.6 in /docs (#1347)

    August 2020 +

    1. new nlreturn linter: https://github.com/ssgreg/nlreturn
    2. new gci linter: https://github.com/daixiang0/gci
    3. support latest version of golangci-lint in golangci-lint-action
    4. update gosec linter from 2.3.0 to 2.4.0
    5. update godot linter from 0.4.2 to 0.4.8
    6. update go-critic from 0.5.0 to 0.5.2 (#1307)
    7. update nlreturn from 2.0.1 to 2.0.2 (#1287), 2.0.2 to 2.1.0 (#1327)
    8. update gci to v0.2.1 (#1292), to v0.2.2 (#1305), to v0.2.4 (#1337),
    9. update funlen from 0.0.2 to 0.0.3 (#1341)
    10. upgrade to golang 1.15 for smaller binary (#1303)
    11. support short and json formats for version cmd (#1315)
    12. add home directory to config file search paths (#1325)
    13. allow for serializing multiple golangci-lint invocations (#1302)

    July 2020 +

    1. gofumpt linter:
      • update linter
      • add extra-rules option
      • support auto-fixing
    2. upgrade exhaustive linter
    3. upgrade exportloopref linter
    4. improve ’no such linter’ error message
    5. sorting result.Issues implementation
    6. enhancements in CI:
      • Run nancy validation for all dependencies
      • Move dependabot config to .github folder
    7. other
      • bump lodash from 4.17.15 to 4.17.19 in /tools
      • bump golangci/golangci-lint-action from v1.2.2 to v2
      • bump github.com/valyala/quicktemplate from 1.5.0 to 1.5.1

    June 2020 +

    1. Add new linters: gofumpt

    May 2020 +

    1. Add new linters: nolintlint, goerr113
    2. Updated linters: godot, staticcheck
    3. Launch a website

    April 2020 +

    1. Add new linters: testpackage, nestif, godot, gomodguard, asciicheck
    2. Add GitHub Actions output format
    3. Update linters: wsl, gomodguard, gosec
    4. Support disabled-tags setting for gocritic
    5. Mitigate OOM and “failed prerequisites”
    6. Self-isolate due to unexpected pandemics
    7. Support case-sensitive excludes
    8. Allow granular re-enabling excludes by ID, e.g. EXC0002

    September 2019 +

    1. Support go1.13
    2. Add new linters: funlen, whitespace (with auto-fix) and godox
    3. Update linters: gochecknoglobals, scopelint, gosec
    4. Provide pre-built binary for ARM and FreeBSD
    5. Fix false-positives in unused
    6. Support --skip-dirs-use-default
    7. Add support for bash completions

    July 2019 +

    1. Fix parallel writes race condition
    2. Update bodyclose with fixed panic

    June 2019 +

    1. Treat Go source files as a plain text by misspell: it allows detecting issues in strings, variable names, etc.
    2. Implement richer and more stable auto-fix of misspell issues.

    May 2019 +

    1. Add bodyclose linter.
    2. Support junit-xml output.

    April 2019 +

    1. Update go-critic, new checkers were added: badCall, dupImports, evalOrder, newDeref
    2. Fix staticcheck panic on packages that do not compile
    3. Make install script work on Windows
    4. Fix compatibility with the latest x/tools version and update golang.org/x/tools
    5. Correct import path of module sourcegraph/go-diff
    6. Fix max-issues-per-linter name
    7. Fix linting of preprocessed files (e.g. *.qtpl.go, goyacc)
    8. Enable auto-fixing when running via pre-commit

    March 2019 +

    1. Support the newest go vet (with go/analysis)
    2. Support configuration of go vet: e.g. you can set print functions by linters-settings.govet.settings.printf.funcs
    3. Update megacheck (staticcheck) to 2019.1.1
    4. Add information about controlling space-time trade-off into README
    5. Exclude issues by source code line regexp by issues.exclude-rules[i].source
    6. Build and test on go 1.12
    7. Support --color option
    8. Update x/tools to fix c++ issues
    9. Include support for log level
    10. Sort linters list in help commands
    Last updated on
    \ No newline at end of file diff --git a/docs/product/index.html b/docs/product/index.html new file mode 100644 index 000000000000..3fc05a410dde --- /dev/null +++ b/docs/product/index.html @@ -0,0 +1,104 @@ +Product – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/product/index.xml b/docs/product/index.xml new file mode 100644 index 000000000000..7659b1fdf8f9 --- /dev/null +++ b/docs/product/index.xml @@ -0,0 +1,7214 @@ +Golangci-lint – Producthttps://golangci-lint.run/docs/product/Recent content in Product on Golangci-lintHugo -- gohugo.ioen-usThankshttps://golangci-lint.run/docs/product/thanks/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/thanks/ +<h2>❤️<span class="hx:absolute hx:-mt-20" id="heading"></span> +<a href="#heading" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Thanks to developers and authors of used linters<span class="hx:absolute hx:-mt-20" id="thanks-to-developers-and-authors-of-used-linters"></span> +<a href="#thanks-to-developers-and-authors-of-used-linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="author-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 7;"> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/4meepo" +target="_blank" rel="noreferrer"><img +alt="4meepo" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/4meepo.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">4meepo</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>tagalign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Abirdcfly" +target="_blank" rel="noreferrer"><img +alt="Abirdcfly" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Abirdcfly.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Abirdcfly</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>dupword</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/AdminBenni" +target="_blank" rel="noreferrer"><img +alt="AdminBenni" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/AdminBenni.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">AdminBenni</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>iotamixing</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/alecthomas" +target="_blank" rel="noreferrer"><img +alt="alecthomas" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/alecthomas.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">alecthomas</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gochecksumtype</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/alexkohler" +target="_blank" rel="noreferrer"><img +alt="alexkohler" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/alexkohler.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">alexkohler</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>dogsled</code><br><code>nakedret</code><br><code>prealloc</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/alingse" +target="_blank" rel="noreferrer"><img +alt="alingse" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/alingse.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">alingse</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>asasalint</code><br><code>nilnesserr</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/AlwxSin" +target="_blank" rel="noreferrer"><img +alt="AlwxSin" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/AlwxSin.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">AlwxSin</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>noinlineerr</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Antonboom" +target="_blank" rel="noreferrer"><img +alt="Antonboom" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Antonboom.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Antonboom</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>errname</code><br><code>nilnil</code><br><code>testifylint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ashanbrown" +target="_blank" rel="noreferrer"><img +alt="ashanbrown" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ashanbrown.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ashanbrown</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>forbidigo</code><br><code>makezero</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/babakks" +target="_blank" rel="noreferrer"><img +alt="babakks" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/babakks.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">babakks</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>godoclint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/bkielbasa" +target="_blank" rel="noreferrer"><img +alt="bkielbasa" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/bkielbasa.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">bkielbasa</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>cyclop</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/blizzy78" +target="_blank" rel="noreferrer"><img +alt="blizzy78" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/blizzy78.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">blizzy78</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>varnamelen</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/bombsimon" +target="_blank" rel="noreferrer"><img +alt="bombsimon" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/bombsimon.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">bombsimon</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>wsl</code><br><code>wsl_v5</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://gitlab.com/bosi" +target="_blank" rel="noreferrer"><img +alt="bosi" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/bosix.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">bosi</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>decorder</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/breml" +target="_blank" rel="noreferrer"><img +alt="breml" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/breml.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">breml</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>bidichk</code><br><code>errchkjson</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/butuzov" +target="_blank" rel="noreferrer"><img +alt="butuzov" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/butuzov.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">butuzov</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>ireturn</code><br><code>mirror</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/catenacyber" +target="_blank" rel="noreferrer"><img +alt="catenacyber" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/catenacyber.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">catenacyber</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>perfsprint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/charithe" +target="_blank" rel="noreferrer"><img +alt="charithe" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/charithe.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">charithe</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>durationcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/chokoswitch" +target="_blank" rel="noreferrer"><img +alt="chokoswitch" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/chokoswitch.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">chokoswitch</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>reassign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ckaznocha" +target="_blank" rel="noreferrer"><img +alt="ckaznocha" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ckaznocha.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ckaznocha</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>intrange</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/client9" +target="_blank" rel="noreferrer"><img +alt="client9" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/client9.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">client9</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>misspell</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Crocmagnon" +target="_blank" rel="noreferrer"><img +alt="Crocmagnon" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Crocmagnon.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Crocmagnon</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>arangolint</code><br><code>fatcontext</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/daixiang0" +target="_blank" rel="noreferrer"><img +alt="daixiang0" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/daixiang0.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">daixiang0</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gci</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/denis-tingaikin" +target="_blank" rel="noreferrer"><img +alt="denis-tingaikin" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/denis-tingaikin.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">denis-tingaikin</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>goheader</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/dixonwille" +target="_blank" rel="noreferrer"><img +alt="dixonwille" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/dixonwille.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">dixonwille</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>depguard</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/Djarvur" +target="_blank" rel="noreferrer"><img +alt="Djarvur" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/Djarvur.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">Djarvur</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>err113</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/dominikh" +target="_blank" rel="noreferrer"><img +alt="dominikh" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/dominikh.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">dominikh</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>staticcheck</code><br><code>unused</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/firefart" +target="_blank" rel="noreferrer"><img +alt="firefart" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/firefart.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">firefart</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nonamedreturns</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/fzipp" +target="_blank" rel="noreferrer"><img +alt="fzipp" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/fzipp.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">fzipp</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocyclo</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ghostiam" +target="_blank" rel="noreferrer"><img +alt="ghostiam" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ghostiam.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ghostiam</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>protogetter</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/go-critic" +target="_blank" rel="noreferrer"><img +alt="go-critic" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/go-critic.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">go-critic</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocritic</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/golang" +target="_blank" rel="noreferrer"><img +alt="golang" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/golang.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">golang</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gofmt</code><br><code>goimports</code><br><code>govet</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/gordonklaus" +target="_blank" rel="noreferrer"><img +alt="gordonklaus" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/gordonklaus.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">gordonklaus</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>ineffassign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/jgautheron" +target="_blank" rel="noreferrer"><img +alt="jgautheron" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/jgautheron.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">jgautheron</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>goconst</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/jingyugao" +target="_blank" rel="noreferrer"><img +alt="jingyugao" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/jingyugao.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">jingyugao</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>rowserrcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/jjti" +target="_blank" rel="noreferrer"><img +alt="jjti" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/jjti.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">jjti</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>spancheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/julz" +target="_blank" rel="noreferrer"><img +alt="julz" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/julz.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">julz</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>importas</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/karamaru-alpha" +target="_blank" rel="noreferrer"><img +alt="karamaru-alpha" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/karamaru-alpha.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">karamaru-alpha</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>copyloopvar</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kisielk" +target="_blank" rel="noreferrer"><img +alt="kisielk" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kisielk.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kisielk</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>errcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kkHAIKE" +target="_blank" rel="noreferrer"><img +alt="kkHAIKE" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kkHAIKE.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kkHAIKE</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>contextcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kulti" +target="_blank" rel="noreferrer"><img +alt="kulti" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kulti.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kulti</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>thelper</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/kunwardeep" +target="_blank" rel="noreferrer"><img +alt="kunwardeep" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/kunwardeep.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">kunwardeep</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>paralleltest</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/lasiar" +target="_blank" rel="noreferrer"><img +alt="lasiar" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/lasiar.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">lasiar</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>canonicalheader</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ldez" +target="_blank" rel="noreferrer"><img +alt="ldez" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ldez.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ldez</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>exptostd</code><br><code>gomoddirectives</code><br><code>tagliatelle</code><br><code>usetesting</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/leighmcculloch" +target="_blank" rel="noreferrer"><img +alt="leighmcculloch" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/leighmcculloch.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">leighmcculloch</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocheckcompilerdirectives</code><br><code>gochecknoglobals</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/leonklingele" +target="_blank" rel="noreferrer"><img +alt="leonklingele" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/leonklingele.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">leonklingele</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>grouper</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/macabu" +target="_blank" rel="noreferrer"><img +alt="macabu" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/macabu.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">macabu</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>inamedparam</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/manuelarte" +target="_blank" rel="noreferrer"><img +alt="manuelarte" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/manuelarte.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">manuelarte</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>embeddedstructfieldcheck</code><br><code>funcorder</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/maratori" +target="_blank" rel="noreferrer"><img +alt="maratori" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/maratori.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">maratori</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>testableexamples</code><br><code>testpackage</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/matoous" +target="_blank" rel="noreferrer"><img +alt="matoous" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/matoous.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">matoous</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>godox</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mdempsky" +target="_blank" rel="noreferrer"><img +alt="mdempsky" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mdempsky.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mdempsky</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>unconvert</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mgechev" +target="_blank" rel="noreferrer"><img +alt="mgechev" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mgechev.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mgechev</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>revive</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mibk" +target="_blank" rel="noreferrer"><img +alt="mibk" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mibk.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mibk</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>dupl</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/MirrexOne" +target="_blank" rel="noreferrer"><img +alt="MirrexOne" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/MirrexOne.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">MirrexOne</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>unqueryvet</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/moricho" +target="_blank" rel="noreferrer"><img +alt="moricho" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/moricho.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">moricho</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>tparallel</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/mvdan" +target="_blank" rel="noreferrer"><img +alt="mvdan" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/mvdan.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">mvdan</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gofumpt</code><br><code>unparam</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/nakabonne" +target="_blank" rel="noreferrer"><img +alt="nakabonne" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/nakabonne.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">nakabonne</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nestif</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/nishanths" +target="_blank" rel="noreferrer"><img +alt="nishanths" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/nishanths.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">nishanths</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>exhaustive</code><br><code>predeclared</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/nunnatsa" +target="_blank" rel="noreferrer"><img +alt="nunnatsa" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/nunnatsa.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">nunnatsa</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>ginkgolinter</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/polyfloyd" +target="_blank" rel="noreferrer"><img +alt="polyfloyd" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/polyfloyd.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">polyfloyd</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>errorlint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/raeperd" +target="_blank" rel="noreferrer"><img +alt="raeperd" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/raeperd.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">raeperd</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>recvcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ryancurrah" +target="_blank" rel="noreferrer"><img +alt="ryancurrah" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ryancurrah.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ryancurrah</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gomodguard</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ryanrolds" +target="_blank" rel="noreferrer"><img +alt="ryanrolds" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ryanrolds.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ryanrolds</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>sqlclosecheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sanposhiho" +target="_blank" rel="noreferrer"><img +alt="sanposhiho" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sanposhiho.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sanposhiho</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>wastedassign</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sashamelentyev" +target="_blank" rel="noreferrer"><img +alt="sashamelentyev" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sashamelentyev.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sashamelentyev</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>interfacebloat</code><br><code>usestdlibvars</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/securego" +target="_blank" rel="noreferrer"><img +alt="securego" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/securego.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">securego</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gosec</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/segmentio" +target="_blank" rel="noreferrer"><img +alt="segmentio" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/segmentio.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">segmentio</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>golines</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sivchari" +target="_blank" rel="noreferrer"><img +alt="sivchari" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sivchari.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sivchari</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>containedctx</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/sonatard" +target="_blank" rel="noreferrer"><img +alt="sonatard" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/sonatard.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">sonatard</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>noctx</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ssgreg" +target="_blank" rel="noreferrer"><img +alt="ssgreg" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ssgreg.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ssgreg</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nlreturn</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/stbenjam" +target="_blank" rel="noreferrer"><img +alt="stbenjam" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/stbenjam.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">stbenjam</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>nosprintfhostport</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/swaggo" +target="_blank" rel="noreferrer"><img +alt="swaggo" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/swaggo.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">swaggo</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>swaggo</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tenntenn" +target="_blank" rel="noreferrer"><img +alt="tenntenn" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tenntenn.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tenntenn</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>forcetypeassert</code><br><code>nilerr</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tetafro" +target="_blank" rel="noreferrer"><img +alt="tetafro" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tetafro.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tetafro</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>godot</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/timakin" +target="_blank" rel="noreferrer"><img +alt="timakin" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/timakin.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">timakin</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>bodyclose</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/timonwong" +target="_blank" rel="noreferrer"><img +alt="timonwong" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/timonwong.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">timonwong</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>loggercheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tmzane" +target="_blank" rel="noreferrer"><img +alt="tmzane" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tmzane.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tmzane</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>musttag</code><br><code>sloglint</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tomarrell" +target="_blank" rel="noreferrer"><img +alt="tomarrell" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tomarrell.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tomarrell</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>wrapcheck</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/tommy-muehle" +target="_blank" rel="noreferrer"><img +alt="tommy-muehle" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/tommy-muehle.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">tommy-muehle</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>mnd</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ultraware" +target="_blank" rel="noreferrer"><img +alt="ultraware" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ultraware.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ultraware</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>funlen</code><br><code>whitespace</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/uudashr" +target="_blank" rel="noreferrer"><img +alt="uudashr" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/uudashr.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">uudashr</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gocognit</code><br><code>iface</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/xen0n" +target="_blank" rel="noreferrer"><img +alt="xen0n" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/xen0n.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">xen0n</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>gosmopolitan</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/xobotyi" +target="_blank" rel="noreferrer"><img +alt="xobotyi" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/xobotyi.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">xobotyi</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>exhaustruct</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/yagipy" +target="_blank" rel="noreferrer"><img +alt="yagipy" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/yagipy.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">yagipy</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>maintidx</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/yeya24" +target="_blank" rel="noreferrer"><img +alt="yeya24" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/yeya24.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">yeya24</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>promlinter</code></div></a> +<a +class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden hx:rounded-lg hx:border hx:border-gray-200 hx:text-current hx:no-underline hx:dark:shadow-none hx:hover:shadow-gray-100 hx:dark:hover:shadow-none hx:shadow-gray-100 hx:active:shadow-sm hx:active:shadow-gray-200 hx:transition-all hx:duration-200 hx:hover:border-gray-300 hx:bg-gray-100 hx:shadow-sm hx:dark:border-neutral-700 hx:dark:bg-neutral-800 hx:dark:text-gray-50 hx:hover:shadow-lg hx:dark:hover:border-neutral-500 hx:dark:hover:bg-neutral-700"href="https://github.com/sponsors/ykadowak" +target="_blank" rel="noreferrer"><img +alt="ykadowak" +class="hextra-card-image" +loading="lazy" +decoding="async" +src="https://github.com/ykadowak.png" +/><span class="hextra-card-icon hx:flex hx:font-semibold hx:items-start hx:gap-2 hx:pt-4 hx:px-4 hx:text-gray-700 hx:hover:text-gray-900 hx:dark:text-neutral-200 hx:dark:hover:text-neutral-50">ykadowak</span><div class="hextra-card-subtitle hx:line-clamp-3 hx:text-sm hx:font-normal hx:text-gray-500 hx:dark:text-gray-400 hx:px-4 hx:mb-4 hx:mt-2"><code>zerologlint</code></div></a> +</div> +<h3>Thanks to all contributors<span class="hx:absolute hx:-mt-20" id="thanks-to-all-contributors"></span> +<a href="#thanks-to-all-contributors" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/golangci/golangci-lint/graphs/contributors"target="_blank" rel="noopener"><img src="https://opencollective.com/golangci-lint/contributors.svg?width=890&amp;button=false&amp;skip=golangcidev,CLAassistant,renovate,fossabot,golangcibot,kortschak,golangci-releaser,dependabot%5Bbot%5D" alt="golangci-lint contributors" loading="lazy" /></a></p> +<h3>Special thanks<span class="hx:absolute hx:-mt-20" id="special-thanks"></span> +<a href="#special-thanks" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Thanks to <a href="https://github.com/alecthomas/gometalinter"target="_blank" rel="noopener">alecthomas/gometalinter</a> for inspiration and amazing work.</p> +<p>Thanks to <a href="https://github.com/bradleyfalzon/revgrep"target="_blank" rel="noopener">bradleyfalzon/revgrep</a> for cool diff tool.</p> +<p>The golangci-lint logo is inspired by the Go gopher designed by Renee French <a href="https://creativecommons.org/licenses/by/3.0/"target="_blank" rel="noopener">CC BY 3.0</a>.</p>Changeloghttps://golangci-lint.run/docs/product/changelog/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/changelog/ +<p>Follow the news and releases on <a href="https://fosstodon.org/@golangcilint"target="_blank" rel="noopener">Mastodon</a> and on <a href="https://bsky.app/profile/golangci-lint.run"target="_blank" rel="noopener">Bluesky</a>.</p> +<p><code>golangci-lint</code> is a free and open-source project built by volunteers.</p> +<p>If you value it, consider supporting us, we appreciate it!</p> +<div class="hx:mt-6 hx:mb-6"> +<a +href="https://golangci-lint.run/docs/donate" +class="not-prose hx:font-medium hx:cursor-pointer hx:px-6 hx:py-3 hx:rounded-full hx:text-center hx:text-white hx:inline-block hx:bg-primary-600 hx:hover:bg-primary-700 hx:focus:outline-hidden hx:focus:ring-4 hx:focus:ring-primary-300 hx:dark:bg-primary-600 hx:dark:hover:bg-primary-700 hx:dark:focus:ring-primary-800 hx:transition-all hx:ease-in hx:duration-200" +>Donate ❤️</a> +</div> +<h2>v2.5.0<span class="hx:absolute hx:-mt-20" id="v250"></span> +<a href="#v250" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li>Add <code>godoclint</code> linter <a href="https://github.com/godoc-lint/godoc-lint"target="_blank" rel="noopener">https://github.com/godoc-lint/godoc-lint</a></li> +<li>Add <code>unqueryvet</code> linter <a href="https://github.com/MirrexOne/unqueryvet"target="_blank" rel="noopener">https://github.com/MirrexOne/unqueryvet</a></li> +<li>Add <code>iotamixing</code> linter <a href="https://github.com/AdminBenni/iota-mixing"target="_blank" rel="noopener">https://github.com/AdminBenni/iota-mixing</a></li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>embeddedstructfieldcheck</code>: from 0.3.0 to 0.4.0 (new option: <code>empty-line</code>)</li> +<li><code>err113</code>: from aea10b59be24 to 0.1.1 (skip internals of <code>Is</code> methods for <code>error</code> type)</li> +<li><code>ginkgolinter</code>: from 0.20.0 to 0.21.0 (new option: <code>force-tonot</code>)</li> +<li><code>gofumpt</code>: from 0.8.0 to 0.9.1 (new rule is to &ldquo;clothe&rdquo; naked returns for the sake of clarity)</li> +<li><code>ineffassign</code>: from 0.1.0 to 0.2.0 (new option: <code>check-escaping-errors</code>)</li> +<li><code>musttag</code>: from 0.13.1 to 0.14.0 (support interface methods)</li> +<li><code>revive</code>: from 1.11.0 to 1.12.0 (new options: <code>identical-ifelseif-branches</code>, <code>identical-ifelseif-conditions</code>, <code>identical-switch-branches</code>, <code>identical-switch-conditions</code>, <code>package-directory-mismatch</code>, <code>unsecure-url-scheme</code>, <code>use-waitgroup-go</code>, <code>useless-fallthrough</code>)</li> +<li><code>thelper</code>: from 0.6.3 to 0.7.1 (skip <code>t.Helper</code> in functions passed to <code>synctest.Test</code>)</li> +<li><code>wsl</code>: from 5.1.1 to 5.2.0 (improvements related to subexpressions)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.4.1 to 0.5.0</li> +<li><code>errname</code>: from 1.1.0 to 1.1.1</li> +<li><code>fatcontext</code>: from 0.8.0 to 0.8.1</li> +<li><code>go-printf-func-name</code>: from 0.1.0 to 0.1.1</li> +<li><code>godot</code>: from 1.5.1 to 1.5.4</li> +<li><code>gosec</code>: from 2.22.7 to 2.22.8</li> +<li><code>nilerr</code>: from 0.1.1 to a temporary fork</li> +<li><code>nilnil</code>: from 1.1.0 to 1.1.1</li> +<li><code>protogetter</code>: from 0.3.15 to 0.3.16</li> +<li><code>tagliatelle</code>: from 0.7.1 to 0.7.2</li> +<li><code>testifylint</code>: from 1.6.1 to 1.6.4</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: &ldquo;no export data&rdquo; errors are now handled as a standard typecheck error</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve nolint section about syntax</li> +</ul> +</li> +</ol> +<h2>v2.4.0<span class="hx:absolute hx:-mt-20" id="v240"></span> +<a href="#v240" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>🎉 go1.25 support</li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>exhaustruct</code>: from v3.3.1 to 4.0.0 (new options: <code>allow-empty</code>, <code>allow-empty-rx</code>, <code>allow-empty-returns</code>, <code>allow-empty-declarations</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>godox</code>: trim filepath from report messages</li> +<li><code>staticcheck</code>: allow empty options</li> +<li><code>tagalign</code>: from 1.4.2 to 1.4.3</li> +</ul> +</li> +<li>Documentation +<ul> +<li>🌟 New website (with a search engine)</li> +</ul> +</li> +</ol> +<h2>v2.3.1<span class="hx:absolute hx:-mt-20" id="v231"></span> +<a href="#v231" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gci</code>: from 0.13.6 to 0.13.7</li> +<li><code>gosec</code>: from 2.22.6 to 2.22.7</li> +<li><code>noctx</code>: from 0.3.5 to 0.4.0</li> +<li><code>wsl</code>: from 5.1.0 to 5.1.1</li> +<li>tagliatelle: force upper case for custom initialisms</li> +</ul> +</li> +</ol> +<h2>v2.3.0<span class="hx:absolute hx:-mt-20" id="v230"></span> +<a href="#v230" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters new features or changes +<ul> +<li><code>ginkgolinter</code>: from 0.19.1 to 0.20.0 (new option: <code>force-assertion-description</code>)</li> +<li><code>iface</code>: from 1.4.0 to 1.4.1 (report message improvements)</li> +<li><code>noctx</code>: from 0.3.4 to 0.3.5 (new detections: <code>log/slog</code>, <code>exec</code>, <code>crypto/tls</code>)</li> +<li><code>revive</code>: from 1.10.0 to 1.11.0 (new rule: <code>enforce-switch-style</code>)</li> +<li><code>wsl</code>: from 5.0.0 to 5.1.0</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>gosec</code>: from 2.22.5 to 2.22.6</li> +<li><code>noinlineerr</code>: from 1.0.4 to 1.0.5</li> +<li><code>sloglint</code>: from 0.11.0 to 0.11.1</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: panic close of closed channel</li> +</ul> +</li> +</ol> +<h2>v2.2.2<span class="hx:absolute hx:-mt-20" id="v222"></span> +<a href="#v222" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>noinlineerr</code>: from 1.0.3 to 1.0.4</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve debug keys documentation</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: panic close of closed channel</li> +<li>godot: add noinline value into the JSONSchema</li> +</ul> +</li> +</ol> +<h2>v2.2.1<span class="hx:absolute hx:-mt-20" id="v221"></span> +<a href="#v221" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes</li> +</ol> +<ul> +<li><code>varnamelen</code>: fix configuration</li> +</ul> +<h2>v2.2.0<span class="hx:absolute hx:-mt-20" id="v220"></span> +<a href="#v220" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li>Add <code>arangolint</code> linter <a href="https://github.com/Crocmagnon/arangolint"target="_blank" rel="noopener">https://github.com/Crocmagnon/arangolint</a></li> +<li>Add <code>embeddedstructfieldcheck</code> linter <a href="https://github.com/manuelarte/embeddedstructfieldcheck"target="_blank" rel="noopener">https://github.com/manuelarte/embeddedstructfieldcheck</a></li> +<li>Add <code>noinlineerr</code> linter <a href="https://github.com/AlwxSin/noinlineerr"target="_blank" rel="noopener">https://github.com/AlwxSin/noinlineerr</a></li> +<li>Add <code>swaggo</code> formatter <a href="https://github.com/golangci/swaggoswag"target="_blank" rel="noopener">https://github.com/golangci/swaggoswag</a></li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>errcheck</code>: add <code>verbose</code> option</li> +<li><code>funcorder</code>: from 0.2.1 to 0.5.0 (new option <code>alphabetical</code>)</li> +<li><code>gomoddirectives</code>: from 0.6.1 to 0.7.0 (new option <code>ignore-forbidden</code>)</li> +<li><code>iface</code>: from 1.3.1 to 1.4.0 (new option <code>unexported</code>)</li> +<li><code>noctx</code>: from 0.1.0 to 0.3.3 (new report messages, and new rules related to <code>database/sql</code>)</li> +<li><code>noctx</code>: from 0.3.3 to 0.3.4 (new SQL functions detection)</li> +<li><code>revive</code>: from 1.9.0 to 1.10.0 (new rules: <code>time-date</code>, <code>unnecessary-format</code>, <code>use-fmt-print</code>)</li> +<li><code>usestdlibvars</code>: from 1.28.0 to 1.29.0 (new option <code>time-date-month</code>)</li> +<li><code>wsl</code>: deprecation</li> +<li><code>wsl_v5</code>: from 4.7.0 to 5.0.0 (major version with new configuration)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>dupword</code>: from 0.1.3 to 0.1.6</li> +<li><code>exptostd</code>: from 0.4.3 to 0.4.4</li> +<li><code>forbidigo</code>: from 1.6.0 to 2.1.0</li> +<li><code>gci</code>: consistently format the code</li> +<li><code>go-spancheck</code>: from 0.6.4 to 0.6.5</li> +<li><code>goconst</code>: from 1.8.1 to 1.8.2</li> +<li><code>gosec</code>: from 2.22.3 to 2.22.4</li> +<li><code>gosec</code>: from 2.22.4 to 2.22.5</li> +<li><code>makezero</code>: from 1.2.0 to 2.0.1</li> +<li><code>misspell</code>: from 0.6.0 to 0.7.0</li> +<li><code>usetesting</code>: from 0.4.3 to 0.5.0</li> +</ul> +</li> +<li>Misc. +<ul> +<li>exclusions: fix <code>path-expect</code></li> +<li>formatters: write the input to <code>stdout</code> when using <code>stdin</code> and there are no changes</li> +<li>migration: improve the error message when trying to migrate a migrated config</li> +<li><code>typecheck</code>: deduplicate errors</li> +<li><code>typecheck</code>: stops the analysis after the first error</li> +<li>Deprecate <code>print-resources-usage</code> flag</li> +<li>Unique version per custom build</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improves typecheck FAQ</li> +<li>Adds plugin systems recommendations</li> +<li>Add description for <code>linters.default</code> sets</li> +</ul> +</li> +</ol> +<h2>v2.1.6<span class="hx:absolute hx:-mt-20" id="v216"></span> +<a href="#v216" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>godot</code>: from 1.5.0 to 1.5.1</li> +<li><code>musttag</code>: from 0.13.0 to 0.13.1</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add note about golangci-lint v2 integration in VS Code</li> +</ul> +</li> +</ol> +<h2>v2.1.5<span class="hx:absolute hx:-mt-20" id="v215"></span> +<a href="#v215" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Due to an error related to Snapcraft, some artifacts of the v2.1.4 release have not been published.</p> +<p>This release contains the same things as v2.1.3.</p> +<h2>v2.1.4<span class="hx:absolute hx:-mt-20" id="v214"></span> +<a href="#v214" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Due to an error related to Snapcraft, some artifacts of the v2.1.3 release have not been published.</p> +<p>This release contains the same things as v2.1.3.</p> +<h2>v2.1.3<span class="hx:absolute hx:-mt-20" id="v213"></span> +<a href="#v213" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>fatcontext</code>: from 0.7.2 to 0.8.0</li> +</ul> +</li> +<li>Misc. +<ul> +<li>migration: fix <code>nakedret.max-func-lines: 0</code></li> +<li>migration: fix order of <code>staticcheck</code> settings</li> +<li>fix: add <code>go.mod</code> hash to the cache salt</li> +<li>fix: use diagnostic position for related information position</li> +</ul> +</li> +</ol> +<h2>v2.1.2<span class="hx:absolute hx:-mt-20" id="v212"></span> +<a href="#v212" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>exptostd</code>: from 0.4.2 to 0.4.3</li> +<li><code>gofumpt</code>: from 0.7.0 to 0.8.0</li> +<li><code>protogetter</code>: from 0.3.13 to 0.3.15</li> +<li><code>usetesting</code>: from 0.4.2 to 0.4.3</li> +</ul> +</li> +</ol> +<h2>v2.1.1<span class="hx:absolute hx:-mt-20" id="v211"></span> +<a href="#v211" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The release process of v2.1.0 failed due to a regression inside goreleaser.</p> +<p>The binaries of v2.1.0 have been published, but not the other artifacts (AUR, Docker, etc.).</p> +<h2>v2.1.0<span class="hx:absolute hx:-mt-20" id="v210"></span> +<a href="#v210" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add an option to display absolute paths (<code>--path-mode=abs</code>)</li> +<li>Add configuration path placeholder (<code>${config-path}</code>)</li> +<li>Add <code>warn-unused</code> option for <code>fmt</code> command</li> +<li>Colored diff for <code>fmt</code> command (<code>golangci-lint fmt --diff-colored</code>)</li> +</ul> +</li> +<li>New linters +<ul> +<li>Add <code>funcorder</code> linter <a href="https://github.com/manuelarte/funcorder"target="_blank" rel="noopener">https://github.com/manuelarte/funcorder</a></li> +</ul> +</li> +<li>Linters new features or changes +<ul> +<li><code>go-errorlint</code>: from 1.7.1 to 1.8.0 (automatic error comparison and type assertion fixes)</li> +<li>⚠️ <code>goconst</code>: <code>ignore-strings</code> is deprecated and replaced by <code>ignore-string-values</code></li> +<li><code>goconst</code>: from 1.7.1 to 1.8.1 (new options: <code>find-duplicates</code>, <code>eval-const-expressions</code>)</li> +<li><code>govet</code>: add <code>httpmux</code> analyzer</li> +<li><code>nilnesserr</code>: from 0.1.2 to 0.2.0 (detect more cases)</li> +<li><code>paralleltest</code>: from 1.0.10 to 1.0.14 (checks only <code>_test.go</code> files)</li> +<li><code>revive</code>: from 1.7.0 to 1.9.0 (support kebab case for setting names)</li> +<li><code>sloglint</code>: from 0.9.0 to 0.11.0 (autofix, new option <code>msg-style</code>, suggest <code>slog.DiscardHandler</code>)</li> +<li><code>wrapcheck</code>: from 2.10.0 to 2.11.0 (new option <code>report-internal-errors</code>)</li> +<li><code>wsl</code>: from 4.6.0 to 4.7.0 (cgo files are always excluded)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>fatcontext</code>: from 0.7.1 to 0.7.2</li> +<li><code>gocritic</code>: fix <code>importshadow</code> checker</li> +<li><code>gosec</code>: from 2.22.2 to 2.22.3</li> +<li><code>ireturn</code>: from 0.3.1 to 0.4.0</li> +<li><code>loggercheck</code>: from 0.10.1 to 0.11.0</li> +<li><code>nakedret</code>: from 2.0.5 to 2.0.6</li> +<li><code>nonamedreturns</code>: from 1.0.5 to 1.0.6</li> +<li><code>protogetter</code>: from 0.3.12 to 0.3.13</li> +<li><code>testifylint</code>: from 1.6.0 to 1.6.1</li> +<li><code>unconvert</code>: update to HEAD</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Fixes memory leaks when using go1.(N) with golangci-lint built with go1.(N-X)</li> +<li>Adds <code>golangci-lint-fmt</code> pre-commit hook</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improvements</li> +<li>Updates section about vscode integration</li> +</ul> +</li> +</ol> +<h2>v2.0.2<span class="hx:absolute hx:-mt-20" id="v202"></span> +<a href="#v202" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Misc. +<ul> +<li>Fixes flags parsing for formatters</li> +<li>Fixes the filepath used by the exclusion <code>source</code> option</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Adds a section about flags migration</li> +<li>Cleaning pages with v1 options</li> +</ul> +</li> +</ol> +<h2>v2.0.1<span class="hx:absolute hx:-mt-20" id="v201"></span> +<a href="#v201" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters/formatters bug fixes +<ul> +<li><code>golines</code>: fix settings during linter load</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Validates the <code>version</code> field before the configuration</li> +<li><code>forbidigo</code>: fix migration</li> +</ul> +</li> +</ol> +<h2>v2.0.0<span class="hx:absolute hx:-mt-20" id="v200"></span> +<a href="#v200" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>🌟 New <code>golangci-lint fmt</code> command with dedicated <a href="https://golangci-lint.run/docs/welcome/quick-start/#formatting"target="_blank" rel="noopener">formatter configuration</a></li> +<li>♻️ New <code>golangci-lint migrate</code> command to help migration from v1 to v2 (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#command-migrate"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>⚠️ New default values (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>⚠️ No exclusions by default (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#issuesexclude-use-default"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>⚠️ New default sort order (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#outputsort-order"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New option <code>run.relative-path-mode</code> (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#runrelative-path-mode"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New linters configuration (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#linters"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New output format configuration (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#output"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New <code>--fast-only</code> flag (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#lintersfast"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🌟 New option <code>linters.exclusions.warn-unused</code> to log a warning if an exclusion rule is unused.</li> +</ul> +</li> +<li>New linters/formatters +<ul> +<li>Add <code>golines</code> formatter <a href="https://github.com/segmentio/golines"target="_blank" rel="noopener">https://github.com/segmentio/golines</a></li> +</ul> +</li> +<li>Linters new features +<ul> +<li>⚠️ Merge <code>staticcheck</code>, <code>stylecheck</code>, <code>gosimple</code> into one linter (<code>staticcheck</code>) (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#lintersenablestylecheckgosimplestaticcheck"target="_blank" rel="noopener">Migration guide</a>)</li> +<li><code>go-critic</code>: from 0.12.0 to 0.13.0</li> +<li><code>gomodguard</code>: from 1.3.5 to 1.4.1 (block explicit indirect dependencies)</li> +<li><code>nilnil</code>: from 1.0.1 to 1.1.0 (new option: <code>only-two</code>)</li> +<li><code>perfsprint</code>: from 0.8.2 to 0.9.1 (checker name in the diagnostic message)</li> +<li><code>staticcheck</code>: new <code>quickfix</code> set of rules</li> +<li><code>testifylint</code>: from 1.5.2 to 1.6.0 (new options: <code>equal-values</code>, <code>suite-method-signature</code>, <code>require-string-msg</code>)</li> +<li><code>wsl</code>: from 4.5.0 to 4.6.0 (new option: <code>allow-cuddle-used-in-block</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>bidichk</code>: from 0.3.2 to 0.3.3</li> +<li><code>errchkjson</code>: from 0.4.0 to 0.4.1</li> +<li><code>errname</code>: from 1.0.0 to 1.1.0</li> +<li><code>funlen</code>: fix <code>ignore-comments</code> option</li> +<li><code>gci</code>: from 0.13.5 to 0.13.6</li> +<li><code>gosmopolitan</code>: from 1.2.2 to 1.3.0</li> +<li><code>inamedparam</code>: from 0.1.3 to 0.2.0</li> +<li><code>intrange</code>: from 0.3.0 to 0.3.1</li> +<li><code>protogetter</code>: from 0.3.9 to 0.3.12</li> +<li><code>unparam</code>: from 8a5130ca722f to 0df0534333a4</li> +</ul> +</li> +<li>Misc. +<ul> +<li>🧹 Configuration options renaming (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove options (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove flags (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove alternative names (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/#alternative-linter-names"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>🧹 Remove or replace deprecated elements (cf. <a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a>)</li> +<li>Adds an option to display some commands as JSON: +<ul> +<li><code>golangci-lint config path --json</code></li> +<li><code>golangci-lint help linters --json</code></li> +<li><code>golangci-lint help formatters --json</code></li> +<li><code>golangci-lint linters --json</code></li> +<li><code>golangci-lint formatters --json</code></li> +<li><code>golangci-lint version --json</code></li> +</ul> +</li> +</ul> +</li> +<li>Documentation +<ul> +<li><a href="https://golangci-lint.run/docs/product/migration-guide/"target="_blank" rel="noopener">Migration guide</a></li> +</ul> +</li> +</ol> +<h2>v1.64.8<span class="hx:absolute hx:-mt-20" id="v1648"></span> +<a href="#v1648" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ul> +<li>Detects use of configuration files from golangci-lint v2</li> +</ul> +<h2>v1.64.7<span class="hx:absolute hx:-mt-20" id="v1647"></span> +<a href="#v1647" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>depguard</code>: from 2.2.0 to 2.2.1</li> +<li><code>dupl</code>: from 3e9179ac440a to f665c8d69b32</li> +<li><code>gosec</code>: from 2.22.1 to 2.22.2</li> +<li><code>staticcheck</code>: from 0.6.0 to 0.6.1</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add GitLab documentation</li> +</ul> +</li> +</ol> +<h2>v1.64.6<span class="hx:absolute hx:-mt-20" id="v1646"></span> +<a href="#v1646" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.4.0 to 0.4.1</li> +<li><code>contextcheck</code>: from 1.1.5 to 1.1.6</li> +<li><code>errcheck</code>: from 1.8.0 to 1.9.0</li> +<li><code>exptostd</code>: from 0.4.1 to 0.4.2</li> +<li><code>ginkgolinter</code>: from 0.19.0 to 0.19.1</li> +<li><code>go-exhaustruct</code>: from 3.3.0 to 3.3.1</li> +<li><code>gocheckcompilerdirectives</code>: from 1.2.1 to 1.3.0</li> +<li><code>godot</code>: from 1.4.20 to 1.5.0</li> +<li><code>perfsprint</code>: from 0.8.1 to 0.8.2</li> +<li><code>revive</code>: from 1.6.1 to 1.7.0</li> +<li><code>tagalign</code>: from 1.4.1 to 1.4.2</li> +</ul> +</li> +</ol> +<h2>v1.64.5<span class="hx:absolute hx:-mt-20" id="v1645"></span> +<a href="#v1645" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Bug fixes +<ul> +<li>Add missing flag <code>new-from-merge-base-flag</code></li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.3.0 to 0.4.0</li> +<li><code>forcetypeassert</code>: from 0.1.0 to 0.2.0</li> +<li><code>gosec</code>: from 2.22.0 to 2.22.1</li> +</ul> +</li> +</ol> +<h2>v1.64.4<span class="hx:absolute hx:-mt-20" id="v1644"></span> +<a href="#v1644" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gci</code>: fix standard packages list for go1.24</li> +</ul> +</li> +</ol> +<h2>v1.64.3<span class="hx:absolute hx:-mt-20" id="v1643"></span> +<a href="#v1643" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>ginkgolinter</code>: from 0.18.4 to 0.19.0</li> +<li><code>go-critic</code>: from 0.11.5 to 0.12.0</li> +<li><code>revive</code>: from 1.6.0 to 1.6.1</li> +<li><code>gci</code>: fix standard packages list for go1.24</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Build Docker images with go1.24</li> +</ul> +</li> +</ol> +<h2>v1.64.2<span class="hx:absolute hx:-mt-20" id="v1642"></span> +<a href="#v1642" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is the last minor release of golangci-lint v1. +The next release will be golangci-lint <a href="https://github.com/golangci/golangci-lint/issues/5300"target="_blank" rel="noopener">v2</a>.</p> +<ol> +<li>Enhancements +<ul> +<li>🎉 go1.24 support</li> +<li>New <code>issues.new-from-merge-base</code> option</li> +<li>New <code>run.relative-path-mode</code> option</li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>copyloopvar</code>: from 1.1.0 to 1.2.1 (support suggested fixes)</li> +<li><code>exptostd</code>: from 0.3.1 to 0.4.1 (handles <code>golang.org/x/exp/constraints.Ordered</code>)</li> +<li><code>fatcontext</code>: from 0.5.3 to 0.7.1 (new option: <code>check-struct-pointers</code>)</li> +<li><code>perfsprint</code>: from 0.7.1 to 0.8.1 (new options: <code>integer-format</code>, <code>error-format</code>, <code>string-format</code>, <code>bool-format</code>, and <code>hex-format</code>)</li> +<li><code>revive</code>: from 1.5.1 to 1.6.0 (new rules: <code>redundant-build-tag</code>, <code>use-errors-new</code>. New option <code>early-return.early-return</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>go-errorlint</code>: from 1.7.0 to 1.7.1</li> +<li><code>gochecknoglobals</code>: from 0.2.1 to 0.2.2</li> +<li><code>godox</code>: from 006bad1f9d26 to 1.1.0</li> +<li><code>gosec</code>: from 2.21.4 to 2.22.0</li> +<li><code>iface</code>: from 1.3.0 to 1.3.1</li> +<li><code>nilnesserr</code>: from 0.1.1 to 0.1.2</li> +<li><code>protogetter</code>: from 0.3.8 to 0.3.9</li> +<li><code>sloglint</code>: from 0.7.2 to 0.9.0</li> +<li><code>spancheck</code>: fix default <code>StartSpanMatchersSlice</code> values</li> +<li><code>staticcheck</code>: from 0.5.1 to 0.6.0</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>tenv</code> is deprecated and replaced by <code>usetesting.os-setenv: true</code>.</li> +<li>⚠️ <code>exportloopref</code> deprecation step 2</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Sanitize severities by output format</li> +<li>Avoid panic with plugin without description</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Clarify <code>depguard</code> configuration</li> +</ul> +</li> +</ol> +<h2>v1.64.1<span class="hx:absolute hx:-mt-20" id="v1641"></span> +<a href="#v1641" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to CI failure.</p> +<h2>v1.64.0<span class="hx:absolute hx:-mt-20" id="v1640"></span> +<a href="#v1640" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to CI failure.</p> +<h2>v1.63.4<span class="hx:absolute hx:-mt-20" id="v1634"></span> +<a href="#v1634" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>dupl</code>, <code>gomodguard</code>, <code>revive</code>: keep only Go-files.</li> +</ul> +</li> +</ol> +<h2>v1.63.3<span class="hx:absolute hx:-mt-20" id="v1633"></span> +<a href="#v1633" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gofmt</code>, <code>gofumpt</code>, <code>goimports</code>, <code>gci</code>: panic with several trailing EOL</li> +<li><code>goheader</code>: skip issues with invalid positions</li> +</ul> +</li> +</ol> +<h2>v1.63.2<span class="hx:absolute hx:-mt-20" id="v1632"></span> +<a href="#v1632" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>gofmt</code>, <code>gofumpt</code>, <code>goimports</code>, <code>gci</code>: panic with missing trailing EOL</li> +</ul> +</li> +</ol> +<h2>v1.63.1<span class="hx:absolute hx:-mt-20" id="v1631"></span> +<a href="#v1631" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>cgi</code>: invalid reports with cgo</li> +<li><code>gofumpt</code>: panic with autofix and cgo</li> +</ul> +</li> +</ol> +<h2>v1.63.0<span class="hx:absolute hx:-mt-20" id="v1630"></span> +<a href="#v1630" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add support for SuggestedFixes 🎉 (35 linters can &ldquo;autofix&rdquo; reports).</li> +<li>Formatters (<code>gofmt</code>, <code>goimports</code>, <code>gofumpt</code>, <code>gci</code>) are applied after the suggested fixes.</li> +</ul> +</li> +<li>New linters +<ul> +<li>Add <code>exptostd</code> linter <a href="https://github.com/ldez/exptostd"target="_blank" rel="noopener">https://github.com/ldez/exptostd</a></li> +<li>Add <code>nilnesserr</code> linter <a href="https://github.com/alingse/nilnesserr"target="_blank" rel="noopener">https://github.com/alingse/nilnesserr</a></li> +<li>Add <code>usetesting</code> linter <a href="https://github.com/ldez/usetesting"target="_blank" rel="noopener">https://github.com/ldez/usetesting</a></li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>gci</code>: new options: <code>no-inline-comments</code>, <code>no-prefix-comments</code></li> +<li><code>gomoddirectives</code>: from 0.2.4 to 0.6.0 (new options: <code>go-version-pattern</code>, <code>toolchain-pattern</code>,<code>toolchain-forbidden</code>, <code>tool-forbidden</code>, <code>go-debug-forbidden</code>)</li> +<li><code>govet</code>: new <code>stdversion</code>, <code>waitgroup</code> analyzers</li> +<li><code>importas</code>: allow multiple empty aliases</li> +<li><code>loggercheck</code>: new <code>slog</code> option</li> +<li><code>recvcheck</code>: from 0.1.2 to 0.2.0 (new options: <code>disable-builtin</code>, <code>exclusions</code>)</li> +<li><code>tagliatelle</code>: from 0.5.0 to 0.7.1 (new options: <code>ignored-fields</code>, <code>extended-rules</code>,<code>overrides</code>, <code>pkg</code>, <code>ignore</code>)</li> +<li><code>usestdlibvars</code>: from 1.27.0 to 1.28.0 (autofix)</li> +<li><code>wrapcheck</code>: from 2.9.0 to 2.10.0 (new option: <code>extra-ignore-sigs</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>asciicheck</code>: from 0.2.0 to 0.3.0</li> +<li><code>bodyclose</code>: from 574207250966 to ed6a65f985e</li> +<li><code>funlen</code>: from 0.1.0 to 0.2.0</li> +<li><code>ginkgolinter</code>: from 0.18.3 to 0.18.4</li> +<li><code>gochecksumtype</code>: from 0.2.0 to 0.3.1</li> +<li><code>gocognit</code>: from 1.1.3 to 1.2.0</li> +<li><code>godot</code>: from 1.4.18 to 1.4.20</li> +<li><code>goheader</code>: report position improvement</li> +<li><code>gosec</code>: handling of global nosec option when it is false</li> +<li><code>iface</code>: from 1.2.1 to 1.3.0</li> +<li><code>importas</code>: from 0.1.0 to 0.2.0</li> +<li><code>intrange</code>: from 0.2.1 to 0.3.0</li> +<li><code>makezero</code>: from 1.1.1 to 1.2.0</li> +<li><code>mirror</code>: from 1.2.0 to 1.3.0</li> +<li><code>nilnil</code>: from 1.0.0 to 1.0.1</li> +<li><code>nosprintfhostport</code>: from 0.1.1 to 0.2.0</li> +<li><code>reassign</code>: from 0.2.0 to 0.3.0</li> +<li><code>spancheck</code>: from 0.6.2 to 0.6.4</li> +<li><code>tagalign</code>: from 1.3.4 to 1.4.1</li> +<li><code>wastedassign</code>: from 2.0.7 to 2.1.0</li> +<li><code>whitespace</code>: from 0.1.1 to 0.2.0</li> +<li><code>wsl</code>: from 4.4.1 to 4.5.0</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>output.uniq-by-line</code> is deprecated and replaced by <code>issues.uniq-by-line</code>.</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Improvements of the help command (color and JSON support).</li> +<li>Removes <code>decoder</code>, <code>sloglint</code>, <code>tagalign</code> from <code>format</code> preset.</li> +<li>Enables paths with junction inside Windows.</li> +<li>The timeout is disabled if <code>run.timeout</code> &lt;= 0.</li> +</ul> +</li> +</ol> +<h2>v1.62.2<span class="hx:absolute hx:-mt-20" id="v1622"></span> +<a href="#v1622" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters bug fixes +<ul> +<li><code>fatcontext</code>: from 0.5.2 to 0.5.3</li> +<li><code>ginkgolinter</code>: from 0.18.0 to 0.18.3</li> +<li><code>errorlint</code>: from 1.6.0 to 1.7.0</li> +<li><code>iface</code>: from 1.2.0 to 1.2.1</li> +<li><code>revive</code>: from 1.5.0 to 1.5.1</li> +<li><code>testifylint</code>: from 1.5.0 to 1.5.2</li> +</ul> +</li> +<li>Misc. +<ul> +<li>fix: ignore cache error when file not found</li> +</ul> +</li> +</ol> +<h2>v1.62.1<span class="hx:absolute hx:-mt-20" id="v1621"></span> +<a href="#v1621" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to CI failure.</p> +<h2>v1.62.0<span class="hx:absolute hx:-mt-20" id="v1620"></span> +<a href="#v1620" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li>Add <code>recvcheck</code> linter <a href="https://github.com/raeperd/recvcheck"target="_blank" rel="noopener">https://github.com/raeperd/recvcheck</a></li> +<li>Add <code>iface</code> linter <a href="https://github.com/uudashr/iface"target="_blank" rel="noopener">https://github.com/uudashr/iface</a></li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>ginkgolinter</code>: from 0.17.0 to 0.18.0 (new option: <code>force-succeed</code>)</li> +<li><code>gochecksumtype</code>: from 0.1.4 to 0.2.0 (new option: <code>default-signifies-exhaustive</code>)</li> +<li><code>loggercheck</code>: from 0.9.4 to 0.10.1 (<code>log/slog</code> support)</li> +<li><code>nilnil</code>: from 0.1.9 to 1.0.0 (new option: <code>detect-opposite</code>)</li> +<li><code>revive</code>: from 1.3.9 to 1.5.0 (new rules: <code>filename-format</code>, and <code>file-length-limit</code>)</li> +<li><code>tenv</code>: from 1.10.0 to 1.12.1 (handle dot import)</li> +<li><code>testifylint</code>: from 1.4.3 to 1.5.0 (new checkers: <code>contains</code>, <code>encoded-compare</code>, <code>regexp</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>bidichk</code>: from 0.2.7 to 0.3.2 (important performance improvement)</li> +<li><code>canonicalheader</code>: from 1.1.1 to 1.1.2</li> +<li><code>cyclop</code>: from 1.2.1 to 1.2.3</li> +<li><code>dupword</code>: from 0.1.1 to 0.1.3</li> +<li><code>errcheck</code>: from 1.7.0 to 1.8.0</li> +<li><code>errchkjson</code>: from 0.3.6 to 0.4.0</li> +<li><code>errname</code>: from 0.1.13 to 1.0.0</li> +<li><code>gocritic</code>: from 0.11.4 to 0.11.5</li> +<li><code>goprintffuncname</code>: from 7558a9eaa5af to v0.1.0</li> +<li><code>godot</code>: from 1.4.17 to 1.4.18</li> +<li><code>gosec</code>: from 2.21.2 to 2.21.4</li> +<li><code>intrange</code>: from 0.2.0 to 0.2.1</li> +<li><code>musttag</code>: from 0.12.2 to 0.13.0</li> +<li><code>nakedret</code>: from 2.0.4 to 2.0.5</li> +<li><code>noctx</code>: from 0.0.2 to 0.1.0</li> +<li><code>protogetter</code>: from 0.3.6 to 0.3.8</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>execinquery</code>: deprecation step 2</li> +<li>⚠️ <code>gomnd</code>: deprecation step 2 (replaced by <code>mnd</code>)</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Type sizing when cross-compiling (32-bit).</li> +<li>code-climate: add check_name field</li> +<li>Improve Go version detection</li> +<li>Fix Go version propagation</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Adds a section about <code>exclude-dirs-use-default</code></li> +<li>Improve &lsquo;install from sources&rsquo; section</li> +<li>Improve FAQ about Go versions</li> +<li>Improve linter/rule/check docs</li> +<li>Improve new linter section</li> +<li>Improve <code>forbidigo</code> pattern examples for built-in functions</li> +</ul> +</li> +</ol> +<h2>v1.61.0<span class="hx:absolute hx:-mt-20" id="v1610"></span> +<a href="#v1610" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add <code>junit-xml-extended</code> format</li> +<li>Exclude Swagger Codegen files by default</li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>gci</code>: from 0.13.4 to 0.13.5 (new option <code>no-lex-order</code>)</li> +<li><code>nolintlint</code>: remove the empty line in the directive replacement</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>dupword</code>: from 0.0.14 to 0.1.1</li> +<li><code>fatcontext</code>: from 0.4.0 to 0.5.2</li> +<li><code>go-ruleguard</code>: from 0.4.2 to 0fe6f58b47b1 (fix panic with custom linters)</li> +<li><code>godot</code>: from 1.4.16 to 1.4.17</li> +<li><code>gomodguard</code>: from 1.3.3 to 1.3.5</li> +<li><code>gosec</code>: disable temporarily <code>G407</code></li> +<li><code>gosec</code>: from ab3f6c1c83a0 to 2.21.2 (partially fix <code>G115</code>)</li> +<li><code>intrange</code>: from 0.1.2 to 0.2.0</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Improve runtime version parsing</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add additional info about <code>typecheck</code></li> +</ul> +</li> +</ol> +<h2>v1.60.3<span class="hx:absolute hx:-mt-20" id="v1603"></span> +<a href="#v1603" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>gosec</code>: from 81cda2f91fbe to ab3f6c1c83a0 (fix <code>G115</code> false positives)</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Check that the Go version use to build is greater or equals to the Go version of the project</li> +</ul> +</li> +</ol> +<h2>v1.60.2<span class="hx:absolute hx:-mt-20" id="v1602"></span> +<a href="#v1602" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Linters new features +<ul> +<li><code>gosec</code>: from 5f0084eb01a9 to 81cda2f91fbe (adds <code>G115</code>, <code>G405</code>, <code>G406</code>, <code>G506</code>, <code>G507</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>gofmt</code>: update to HEAD (go1.22)</li> +<li><code>gofumpt</code>: from 0.6.0 to 0.7.0</li> +<li><code>gosec</code>: fix G602 analyzer</li> +<li><code>staticcheck</code>: from 0.5.0 to 0.5.1</li> +<li><code>staticcheck</code>: propagate Go version</li> +<li><code>wrapcheck</code>: from 2.8.3 to 2.9.0</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>⚠️ <code>exportloopref</code>: deprecation</li> +</ul> +</li> +</ol> +<h2>v1.60.1<span class="hx:absolute hx:-mt-20" id="v1601"></span> +<a href="#v1601" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Misc. +<ul> +<li>🎉 go1.23 support</li> +</ul> +</li> +<li>Linters new features +<ul> +<li><code>exhaustruct</code>: from 3.2.0 to 3.3.0 (recognize custom error values in return)</li> +<li><code>govet</code> (<code>printf</code>): report non-constant format, no args</li> +<li><code>lll</code>: advertise max line length instead of just reporting failure</li> +<li><code>revive</code>: from 1.3.7 to 1.3.9 (new rule: <code>comments-density</code>)</li> +<li><code>staticcheck</code>: from 0.4.7 to 0.5.0</li> +<li><code>testifylint</code>: from 1.3.1 to 1.4.3 (new options: <code>formatter</code>, <code>suite-broken-parallel</code>, <code>suite-subtest-run</code>)</li> +</ul> +</li> +<li>Linters bug fixes +<ul> +<li><code>errorlint</code>: from 1.5.2 to 1.6.0</li> +<li><code>fatcontext</code>: from 0.2.2 to 0.4.0 (fix false positives for context stored in structs)</li> +<li><code>gocognit</code>: from 1.1.2 to 1.1.3</li> +<li><code>gomodguard</code>: from 1.3.2 to 1.3.3</li> +<li><code>sloglint</code>: from 0.7.1 to 0.7.2</li> +<li><code>spancheck</code>: from 0.6.1 to 0.6.2</li> +<li><code>tenv</code>: from 1.7.1 to 1.10.0 (remove reports on fuzzing)</li> +<li><code>tparallel</code>: from 0.3.1 to 0.3.2</li> +<li><code>usestdlibvars</code>: from 1.26.0 to 1.27.0 (fix false-positive with number used inside a mathematical operations)</li> +<li><code>wsl</code>: from 4.2.1 to 4.4.1</li> +</ul> +</li> +<li>Deprecations +<ul> +<li>️⚠️ <code>unused</code>: remove <code>exported-is-used</code> option</li> +</ul> +</li> +<li>Fixes +<ul> +<li>SARIF: sanitize level property</li> +<li>️⚠️ <code>typecheck</code> issues should never be ignored</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add link on linter without configuration</li> +<li>Remove &rsquo;trusted by&rsquo; page</li> +<li><code>wsl</code> update documentation of the configuration</li> +</ul> +</li> +</ol> +<h2>v1.60.0<span class="hx:absolute hx:-mt-20" id="v1600"></span> +<a href="#v1600" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Cancelled due to a CI problem.</p> +<h2>v1.59.1<span class="hx:absolute hx:-mt-20" id="v1591"></span> +<a href="#v1591" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>errorlint</code>: from 1.5.1 to 1.5.2</li> +<li><code>gomnd</code>: deprecated configuration compatibility</li> +<li><code>intrange</code>: add <code>style</code> preset</li> +<li><code>misspell</code>: from 0.5.1 to 0.6.0</li> +<li><code>sloglint</code>: from 0.7.0 to 0.7.1</li> +<li><code>testifylint</code>: from 1.3.0 to 1.3.1</li> +<li><code>unparam</code>: bump to HEAD</li> +<li><code>usestdlibvars</code>: from 1.25.0 to 1.26.0</li> +</ul> +</li> +<li>Fixes +<ul> +<li>SARIF: init empty result slice</li> +<li>SARIF: issue column &gt;= 1</li> +</ul> +</li> +<li>Documentation +<ul> +<li><code>revive</code>: update documentation of the configuration</li> +</ul> +</li> +</ol> +<h2>v1.59.0<span class="hx:absolute hx:-mt-20" id="v1590"></span> +<a href="#v1590" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Enhancements +<ul> +<li>Add SARIF output format</li> +<li>Allow the analysis of generated files (<code>issues.exclude-generated: disable</code>)</li> +</ul> +</li> +<li>Updated linters +<ul> +<li><code>errcheck</code>: fix deprecation warning</li> +<li><code>gocritic</code>: from 0.11.3 to 0.11.4</li> +<li><code>gosec</code>: from 2.20.0 to 5f0084eb01a9 (fix G601 and G113 performance issues)</li> +<li><code>sloglint</code>: from 0.6.0 to 0.7.0 (new option <code>forbidden-keys</code>)</li> +<li><code>testifylint</code>: from 1.2.0 to 1.3.0 (new checker <code>negative-positive</code> and new option <code>go-require.ignore-http-handlers</code>)</li> +</ul> +</li> +<li>Misc. +<ul> +<li>️️⚠️ Deprecate <code>github-action</code> output format</li> +<li>️️⚠️ Deprecate <code>issues.exclude-generated-strict</code> option (replaced by <code>issues.exclude-generated: strict</code>)</li> +<li>️️⚠️ Add warning about disabled and deprecated linters (level 2)</li> +</ul> +</li> +</ol> +<h2>v1.58.2<span class="hx:absolute hx:-mt-20" id="v1582"></span> +<a href="#v1582" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>canonicalheader</code>: from 1.0.6 to 1.1.1</li> +<li><code>gosec</code>: from 2.19.0 to 2.20.0</li> +<li><code>musttag</code>: from 0.12.1 to 0.12.2</li> +<li><code>nilnil</code>: from 0.1.8 to 0.1.9</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve integrations and install pages</li> +</ul> +</li> +</ol> +<h2>v1.58.1<span class="hx:absolute hx:-mt-20" id="v1581"></span> +<a href="#v1581" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>tagalign</code>: from 1.3.3 to 1.3.4</li> +<li><code>protogetter</code>: from 0.3.5 to 0.3.6</li> +<li><code>gochecknoinits</code>: fix analyzer name</li> +</ul> +</li> +<li>Fixes +<ul> +<li>Restores previous <code>github-actions</code> output format (removes GitHub Action problem matchers)</li> +</ul> +</li> +</ol> +<h2>v1.58.0<span class="hx:absolute hx:-mt-20" id="v1580"></span> +<a href="#v1580" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li><code>fatcontext</code>: <a href="https://github.com/Crocmagnon/fatcontext"target="_blank" rel="noopener">https://github.com/Crocmagnon/fatcontext</a></li> +<li><code>canonicalheader</code>: <a href="https://github.com/lasiar/canonicalheader"target="_blank" rel="noopener">https://github.com/lasiar/canonicalheader</a></li> +</ul> +</li> +<li>Updated linters +<ul> +<li><code>copyloopvar</code>: from 1.0.10 to 1.1.0 (<code>ignore-alias</code> is replaced by <code>check-alias</code> with the opposite behavior)</li> +<li><code>decorder</code>: from 0.4.1 to 0.4.2</li> +<li><code>errname</code>: from 0.1.12 to 0.1.13</li> +<li><code>errorlint</code>: from 1.4.8 to 1.5.1 (new options <code>allowed-errors</code> and <code>allowed-errors-wildcard</code>)</li> +<li><code>execinquery</code>: deprecate linter ⚠️</li> +<li><code>gci</code>: from 0.12.3 to 0.13.4 (new section <code>localModule</code>)</li> +<li><code>gocritic</code>: from 0.11.2 to 0.11.3</li> +<li><code>spancheck</code>: from 0.5.3 to 0.6.1</li> +<li><code>goerr113</code> is replaced by <code>err113</code> ⚠️</li> +<li><code>gomnd</code> is replaced by <code>mnd</code> ⚠️</li> +<li><code>gomodguard</code>: from 1.3.1 to 1.3.2</li> +<li><code>grouper</code>: from 1.1.1 to 1.1.2</li> +<li><code>intrange</code>: from 0.1.1 to 0.1.2</li> +<li><code>mirror</code>: from 1.1.0 to 1.2.0</li> +<li><code>misspell</code>: from 0.4.1 to 0.5.1</li> +<li><code>musttag</code>: from 0.9.0 to 0.12.1</li> +<li><code>nilnil</code>: from 0.1.7 to 0.1.8</li> +<li><code>nonamedreturns</code>: from 1.0.4 to 1.0.5</li> +<li><code>promlinter</code>: from 0.2.0 to 0.3.0</li> +<li><code>sloglint</code>: from 0.5.0 to 0.6.0</li> +<li><code>unparam</code>: bump to HEAD (063aff900ca150b80930c8de76f11d7e6488222f)</li> +<li><code>whitespace</code>: from 0.1.0 to 0.1.1</li> +</ul> +</li> +<li>Enhancements +<ul> +<li>Speed up &ldquo;fast&rdquo; linters when only &ldquo;fast&rdquo; linters are run: between 40% and 80% faster at first run (i.e. without cache)</li> +</ul> +</li> +<li>Fixes +<ul> +<li>Use version with module plugins</li> +<li>Skip <code>go.mod</code> report inside autogenerated processor</li> +<li>Keep only <code>typecheck</code> issues when needed</li> +<li>Don&rsquo;t hide <code>typecheck</code> errors inside diff processor</li> +</ul> +</li> +<li>Misc. +<ul> +<li>⚠️ log an error when using previously deprecated linters (<a href="https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle"target="_blank" rel="noopener">Linter Deprecation Cycle</a>) +<ul> +<li><a href="https://github.com/remyoudompheng/go-misc/tree/HEAD/deadcode"target="_blank" rel="noopener"><code>deadcode</code></a>: deprecated since v1.49.0 (2022-08-23).</li> +<li><a href="https://github.com/mbilski/exhaustivestruct"target="_blank" rel="noopener"><code>exhaustivestruct</code></a>: deprecated since v1.46.0 (2022-05-08).</li> +<li><a href="https://github.com/golang/lint"target="_blank" rel="noopener"><code>golint</code></a>: deprecated since v1.41.0 (2021-06-15).</li> +<li><a href="https://github.com/esimonov/ifshort"target="_blank" rel="noopener"><code>ifshort</code></a>: deprecated since v1.48.0 (2022-08-04).</li> +<li><a href="https://github.com/mvdan/interfacer"target="_blank" rel="noopener"><code>interfacer</code></a>: deprecated since v1.38.0 (2021-03-03).</li> +<li><a href="https://github.com/mdempsky/maligned"target="_blank" rel="noopener"><code>maligned</code></a>: deprecated since v1.38.0 (2021-03-03).</li> +<li><a href="https://github.com/sivchari/nosnakecase"target="_blank" rel="noopener"><code>nosnakecase</code></a>: deprecated since v1.48.0 (2022-08-04).</li> +<li><a href="https://github.com/kyoh86/scopelint"target="_blank" rel="noopener"><code>scopelint</code></a>: deprecated since v1.39.0 (2021-03-25).</li> +<li><a href="https://github.com/opennota/check"target="_blank" rel="noopener"><code>structcheck</code></a>: deprecated since v1.49.0 (2022-08-23).</li> +<li><a href="https://github.com/opennota/check"target="_blank" rel="noopener"><code>varcheck</code></a>: deprecated since v1.49.0 (2022-08-23).</li> +</ul> +</li> +<li>⚠️ Deprecate usage of linter alternative names</li> +<li>Remove help display on errors with <code>config verify</code> command</li> +<li>Add <code>pre-commit</code> hook to run <code>config verify</code></li> +<li>Improve <code>github-action</code> output</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Remove deprecated Atom from Editor Integrations</li> +</ul> +</li> +</ol> +<p>GitHub Action (v5.1.0) for golangci-lint:</p> +<ul> +<li>supports for <code>pull</code>, <code>pull_request_target</code>, and <code>merge_group</code> events with the option <code>only-new-issues</code>.</li> +<li>️️⚠️ <code>skip-pkg-cache</code> and <code>skip-build-cache</code> have been removed because the cache related to Go itself is already handled by <code>actions/setup-go</code>.</li> +<li>with golangci-lint v1.58, the file information (path and position) will be displayed on the log.</li> +</ul> +<h2>v1.57.2<span class="hx:absolute hx:-mt-20" id="v1572"></span> +<a href="#v1572" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Updated linters +<ul> +<li><code>contextcheck</code>: from 1.1.4 to 1.1.5</li> +<li><code>copyloopvar</code>: from 1.0.8 to 1.0.10</li> +<li><code>ginkgolinter</code>: from 0.16.1 to 0.16.2</li> +<li><code>goconst</code>: from 1.7.0 to 1.7.1</li> +<li><code>gomoddirectives</code>: from 0.2.3 to 0.2.4</li> +<li><code>intrange</code>: from 0.1.0 to 0.1.1</li> +</ul> +</li> +<li>Misc. +<ul> +<li>Display warnings on deprecated linter options</li> +<li>Fix missing <code>colored-tab</code> output format</li> +<li>Fix TeamCity <code>inspectionType</code> service message</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Remove invalid example about mixing files and directory</li> +<li>Improve linters page</li> +</ul> +</li> +</ol> +<h2>v1.57.1<span class="hx:absolute hx:-mt-20" id="v1571"></span> +<a href="#v1571" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Fixes +<ul> +<li>Ignore issues with invalid position (e.g. <code>contextcheck</code>).</li> +</ul> +</li> +</ol> +<h2>v1.57.0<span class="hx:absolute hx:-mt-20" id="v1570"></span> +<a href="#v1570" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>New linters +<ul> +<li><code>copyloopvar</code>: <a href="https://github.com/karamaru-alpha/copyloopvar"target="_blank" rel="noopener">https://github.com/karamaru-alpha/copyloopvar</a></li> +<li><code>intrange</code>: <a href="https://github.com/ckaznocha/intrange"target="_blank" rel="noopener">https://github.com/ckaznocha/intrange</a></li> +</ul> +</li> +<li>Updated linters +<ul> +<li><code>dupword</code>: from 0.0.13 to 0.0.14</li> +<li><code>gci</code>: from 0.12.1 to 0.12.3</li> +<li><code>ginkgolinter</code>: from 0.15.2 to 0.16.1 (new option <code>force-expect-to</code>, <code>validate-async-intervals</code>, and <code>forbid-spec-pollution</code>)</li> +<li><code>go-critic</code>: from 0.11.1 to 0.11.2</li> +<li><code>go-critic</code>: support of <code>enable-all</code> and <code>disable-all</code> options</li> +<li><code>go-spancheck</code>: from 0.5.2 to 0.5.3</li> +<li><code>gomodguard</code>: from 1.3.0 to 1.3.1</li> +<li><code>govet</code>: deprecation of <code>check-shadowing</code> ⚠️</li> +<li><code>govet</code>: disable temporarily <code>httpresponse</code> because of a bug <a href="https://github.com/golang/go/issues/66259"target="_blank" rel="noopener">https://github.com/golang/go/issues/66259</a></li> +<li><code>misspell</code>: add <code>extra-words</code></li> +<li><code>musttag</code>: from 0.8.0 to 0.9.0</li> +<li><code>nakedret</code>: from 2.0.2 to 2.0.4</li> +<li><code>paralleltest</code>: from 1.0.9 to 1.0.10</li> +<li><code>perfsprint</code>: from 0.6.0 to 0.7.1 (new option <code>strconcat</code>)</li> +<li><code>protogetter</code>: from 0.3.4 to 0.3.5</li> +<li><code>revive</code>: add <code>exclude</code> option</li> +<li><code>sloglint</code>: from 0.4.0 to 0.5.0 (new option <code>no-global</code>)</li> +<li><code>staticcheck</code>: from 0.4.6 to 0.4.7</li> +<li><code>testifylint</code>: from 1.1.2 to 1.2.0 (new option <code>bool-compare</code>)</li> +<li><code>unconvert</code>: to HEAD (new options <code>fast-math</code> and <code>safe</code>)</li> +<li><code>wrapcheck</code>: from 2.8.1 to 2.8.3</li> +<li>Disable <code>copyloopvar</code> and <code>intrange</code> on Go &lt; 1.22</li> +</ul> +</li> +<li>Enhancements +<ul> +<li>🧩New custom linters system <a href="https://golangci-lint.run/docs/plugins/module-plugins/"target="_blank" rel="noopener">https://golangci-lint.run/docs/plugins/module-plugins/</a></li> +<li>Allow running only a specific linter without modifying the file configuration (<code>--enable-only</code>)</li> +<li>Allow custom sort order for the reports (<code>output.sort-order</code>)</li> +<li>Automatically adjust the maximum concurrency to the container CPU quota if <code>run.concurrency=0</code></li> +<li>Add <code>config verify</code> command to check the configuration against the JSON Schema</li> +<li>Option to strictly follow Go generated file convention (<code>issues.exclude-generated-strict</code>)</li> +<li>Syntax to not override <code>severity</code> from linters (<code>@linter</code>)</li> +<li>Use severities from <code>gosec</code></li> +<li>Create automatically directory related to <code>output.formats.path</code></li> +<li>Use the first issue without inline on <code>mergeLineIssues</code> on multiple issues</li> +</ul> +</li> +<li>Misc. +<ul> +<li>⚠️ Inactivate deprecated linters (<code>deadcode</code>, <code>exhaustivestruct</code>, <code>golint</code>, <code>ifshort</code>, <code>interfacer</code>, <code>maligned</code>, <code>nosnakecase</code>, <code>scopelint</code>, <code>structcheck</code>, <code>varcheck</code>)</li> +<li>⚠️ Deprecated CLI flags have been removed (deprecated since 2018)</li> +<li>⚠️ Move <code>show-stats</code> option from <code>run</code> to <code>output</code> configuration section</li> +<li>⚠️ Replace <code>run.skip-xxx</code> options by <code>issues.exclude-xxx</code> options</li> +<li>⚠️ Replace <code>output.format</code> by <code>output.formats</code> with a new file configuration syntax</li> +<li>Internal rewrite of the CLI</li> +<li>Improve &rsquo;no go files to analyze&rsquo; message</li> +<li>Use <code>GOTOOLCHAIN=auto</code> inside the Docker images</li> +</ul> +</li> +<li>Documentation +<ul> +<li>⚠️ Define the linter deprecation cycle <a href="https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle"target="_blank" rel="noopener">https://golangci-lint.run/docs/product/roadmap/#linter-deprecation-cycle</a></li> +<li>🎉Use information from the previous release to create linter pages</li> +<li>Publish JSON schema on <a href="https://golangci-lint.run/jsonschema/golangci.jsonschema.json"target="_blank" rel="noopener">https://golangci-lint.run/jsonschema/golangci.jsonschema.json</a></li> +<li>Reorganize documentation pages</li> +<li>Add an explanation about the configuration file inside golangci-lint repository</li> +</ul> +</li> +</ol> +<p><strong>⚠️ Important ⚠️</strong></p> +<ol> +<li>Deprecated linters are inactivated, you still need to disable them if you are using <code>enable-all</code>.</li> +<li>Deprecated CLI flags (about linter settings and <code>deadline</code>) have been removed.</li> +</ol> +<h2>v1.56.2<span class="hx:absolute hx:-mt-20" id="v1562"></span> +<a href="#v1562" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>go-critic</code>: from 0.11.0 to 0.11.1</li> +<li><code>gosec</code>: from 2.18.2 to 2.19.0</li> +<li><code>testifylint</code>: from 1.1.1 to 1.1.2</li> +<li><code>usestdlibvars</code>: from 1.24.0 to 1.25.0</li> +<li><code>wsl</code>: from 4.2.0 to 4.2.1</li> +</ul> +</li> +<li>misc. +<ul> +<li>Fix missing version in Docker image</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Explain the limitation of <code>new-from-rev</code> and <code>new-from-patch</code></li> +</ul> +</li> +</ol> +<h2>v1.56.1<span class="hx:absolute hx:-mt-20" id="v1561"></span> +<a href="#v1561" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>errcheck</code>: from 1.6.3 to 1.7.0</li> +<li><code>govet</code>: disable <code>loopclosure</code> with go1.22</li> +<li><code>revive</code>: from 1.3.6 to 1.3.7</li> +<li><code>testifylint</code>: from 1.1.0 to 1.1.1</li> +</ul> +</li> +</ol> +<h2>v1.56.0<span class="hx:absolute hx:-mt-20" id="v1560"></span> +<a href="#v1560" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>spancheck</code>: <a href="https://github.com/jjti/go-spancheck"target="_blank" rel="noopener">https://github.com/jjti/go-spancheck</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>depguard</code>: from 2.1.0 to 2.2.0</li> +<li><code>exhaustive</code>: from 0.11.0 to 0.12.0</li> +<li><code>exhaustruct</code>: from 3.1.0 to 3.2.0</li> +<li><code>gci</code>: from 0.11.2 to 0.12.1</li> +<li><code>ginkgolinter</code>: from 0.14.1 to 0.15.2</li> +<li><code>go-check-sumtype</code>: from 0.1.3 to 0.1.4</li> +<li><code>go-critic</code>: from 0.9.0 to 0.11.0</li> +<li><code>go-errorlint</code>: from 1.4.5 to 1.4.8</li> +<li><code>go-spancheck</code>: from 0.4.2 to 0.5.2</li> +<li><code>goconst</code>: from 1.6.0 to 1.7.0</li> +<li><code>godot</code>: from 1.4.15 to 1.4.16</li> +<li><code>gofumpt</code>: from 0.5.0 to 0.6.0</li> +<li><code>inamedparam</code>: from 0.1.2 to 0.1.3</li> +<li><code>ineffassign</code>: from 0.0.0-20230610083614-0e73809eb601 to 0.1.0</li> +<li><code>ireturn</code>: from 0.2.2 to 0.3.0</li> +<li><code>misspell</code>: add mode option</li> +<li><code>musttag</code>: from v0.7.2 to v0.8.0</li> +<li><code>paralleltest</code>: from 1.0.8 to 1.0.9</li> +<li><code>perfsprint</code>: from 0.2.0 to 0.6.0</li> +<li><code>protogetter</code>: from 0.2.3 to 0.3.4</li> +<li><code>revive</code>: from 1.3.4 to 1.3.6</li> +<li><code>sloglint</code>: add static-msg option</li> +<li><code>sloglint</code>: from 0.1.2 to 0.4.0</li> +<li><code>testifylint</code>: from 0.2.3 to 1.1.0</li> +<li><code>unparam</code>: from 20221223090309-7455f1af531d to 20240104100049-c549a3470d14</li> +<li><code>whitespace</code>: update after moving to the <code>analysis</code> package</li> +<li><code>wsl</code>: from 3.4.0 to 4.2.0</li> +<li><code>zerologlint</code>: from 0.1.3 to 0.1.5</li> +</ul> +</li> +<li>misc. +<ul> +<li>🎉 go1.22 support</li> +<li>Implement stats per linter with a flag</li> +<li>Make versioning inside Docker image consistent with binaries</li> +<li>Parse Go RC version</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Fix <code>noctx</code> description</li> +<li>Add missing fields to <code>.golangci.reference.yml</code></li> +<li>Improve <code>.golangci.reference.yml</code> defaults</li> +<li><code>typecheck</code>: improve FAQ</li> +<li><code>exhaustruct</code>: note that struct regular expressions are expected to match the entire <code>package/name/structname</code></li> +<li><code>wrapcheck</code>: adjust <code>ignoreSigs</code> to new defaults</li> +</ul> +</li> +</ol> +<p><strong>Important</strong></p> +<p><code>testifylint</code> has <a href="https://github.com/Antonboom/testifylint/releases/tag/v1.0.0"target="_blank" rel="noopener">breaking changes</a> about enabling/disabling checks:</p> +<ul> +<li> +<p>If you were using the option <code>enable</code> with a filtered list of checks, you should either add <code>disable-all: true</code> (1) or use <code>disable</code> field (2).</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example (1)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testifylint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">bool-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">compares</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">empty</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-is-as</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">error-nil</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">expected-actual</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go-require</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">float-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">len</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">nil-compare</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">require-error</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># - suite-dont-use-pkg</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-extra-assert-call</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-thelper</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Example (2)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">testifylint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">suite-dont-use-pkg</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</li> +</ul> +<h2>v1.55.2<span class="hx:absolute hx:-mt-20" id="v1552"></span> +<a href="#v1552" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>ireturn</code>: from 0.2.1 to 0.2.2</li> +<li><code>ginkgolinter</code>: from 0.14.0 to 0.14.1</li> +</ul> +</li> +</ol> +<h2>v1.55.1<span class="hx:absolute hx:-mt-20" id="v1551"></span> +<a href="#v1551" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>gosec</code>: from 2.18.1 to 2.18.2</li> +</ul> +</li> +<li>misc. +<ul> +<li><code>revgrep</code>: from v0.5.0 to v0.5.2 (support git &lt; 2.41.0)</li> +<li>output: convert backslashes to forward slashes for GitHub Action annotations printer</li> +</ul> +</li> +</ol> +<h2>v1.55.0<span class="hx:absolute hx:-mt-20" id="v1550"></span> +<a href="#v1550" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>gochecksumtype</code>: <a href="https://github.com/alecthomas/go-check-sumtype"target="_blank" rel="noopener">https://github.com/alecthomas/go-check-sumtype</a></li> +<li><code>inamedparam</code>: <a href="https://github.com/macabu/inamedparam"target="_blank" rel="noopener">https://github.com/macabu/inamedparam</a></li> +<li><code>perfsprint</code>: <a href="https://github.com/catenacyber/perfsprint"target="_blank" rel="noopener">https://github.com/catenacyber/perfsprint</a></li> +<li><code>protogetter</code>: <a href="https://github.com/ghostiam/protogetter"target="_blank" rel="noopener">https://github.com/ghostiam/protogetter</a></li> +<li><code>sloglint</code>: <a href="https://github.com/go-simpler/sloglint"target="_blank" rel="noopener">https://github.com/go-simpler/sloglint</a></li> +<li><code>testifylint</code>: <a href="https://github.com/Antonboom/testifylint"target="_blank" rel="noopener">https://github.com/Antonboom/testifylint</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>bidichk</code>: from 0.2.4 to 0.2.7</li> +<li><code>decorder</code>: from 0.4.0 to 0.4.1</li> +<li><code>dupword</code>: from 0.0.12 to 0.0.13</li> +<li><code>errchkjson</code>: from 0.3.1 to 0.3.6</li> +<li><code>gci</code>: from 0.11.0 to 0.11.2</li> +<li><code>ginkgolinter</code>: from 0.13.5 to 0.14.0</li> +<li><code>go-errorlint</code>: from 1.4.4 to 1.4.5</li> +<li><code>gocognit</code>: from 1.0.7 to 1.1.0</li> +<li><code>goconst</code>: from 1.5.1 to 1.6.0</li> +<li><code>godot</code>: from 1.4.14 to 1.4.15</li> +<li><code>gofmt</code>: update to HEAD</li> +<li><code>goimports</code>: update to HEAD</li> +<li><code>gosec</code>: from 2.17.0 to 2.18.1</li> +<li><code>gosmopolitan</code>: from 1.2.1 to 1.2.2</li> +<li><code>govet</code>: add <code>appends</code> analyzer</li> +<li><code>ireturn</code>: from 0.2.0 to 0.2.1</li> +<li><code>protogetter</code>: from 0.2.2 to 0.2.3</li> +<li><code>revgrep</code>: from 745bb2f7c2e6 to v0.5.0</li> +<li><code>revive</code>: from 1.3.2 to 1.3.4</li> +<li><code>sqlclosecheck</code>: from 0.4.0 to 0.5.1</li> +<li><code>staticcheck</code>: from 0.4.5 to 0.4.6</li> +<li><code>tagalign</code>: from 1.3.2 to 1.3.3</li> +<li><code>unused</code>: support passing in options</li> +</ul> +</li> +<li>misc. +<ul> +<li>Add a pre-commit hook to check all files</li> +</ul> +</li> +<li>Documentation +<ul> +<li>add source options to exclude-rules docs</li> +<li><code>gosec</code>: add G602 to includes/excludes inside .golangci.reference.yml</li> +</ul> +</li> +</ol> +<h2>v1.54.2<span class="hx:absolute hx:-mt-20" id="v1542"></span> +<a href="#v1542" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>errname</code>: from 0.1.10 to 0.1.12</li> +<li><code>ginkgolinter</code>: from 0.13.3 to 0.13.5</li> +<li><code>go-errorlint</code>: from 1.4.3 to 1.4.4</li> +<li><code>godot</code>: from 1.4.11 to 1.4.14</li> +<li><code>gosec</code>: from 2.16.0 to 2.17.0</li> +<li><code>musttag</code>: from 0.7.1 to 0.7.2</li> +<li><code>nilnil</code>: from 0.1.5 to 0.1.7</li> +<li><code>staticcheck</code>: from 0.4.3 to 0.4.5</li> +<li><code>usestdlibvars</code>: from 1.23.0 to 1.24.0</li> +<li><code>govet</code>: add missing <code>directive</code> and <code>slog</code> passes</li> +</ul> +</li> +</ol> +<h2>v1.54.1<span class="hx:absolute hx:-mt-20" id="v1541"></span> +<a href="#v1541" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>go-critic</code>: from 0.8.2 to 0.9.0</li> +</ul> +</li> +<li>misc. +<ul> +<li>plugin: temporarily hide warning about using plugins using the old API</li> +</ul> +</li> +</ol> +<h2>v1.54.0<span class="hx:absolute hx:-mt-20" id="v1540"></span> +<a href="#v1540" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>decorder</code>: from 0.2.3 to 0.4.0</li> +<li><code>dupword</code>: from 0.0.11 to 0.0.12</li> +<li><code>errorlint</code>: from 1.4.2 to 1.4.3</li> +<li><code>exhaustruct</code>: from 2.3.0 to 3.1.0</li> +<li><code>forbidigo</code>: from 1.5.3 to 1.6.0</li> +<li><code>funlen</code>: from 0.0.3 to 0.1.0</li> +<li><code>gci</code>: from 0.10.1 to 0.11.0</li> +<li><code>ginkgolinter</code>: from 0.12.1 to 0.13.3</li> +<li><code>go-critic</code>: from 0.8.1 to 0.8.2</li> +<li><code>go-errorlint</code>: from 1.4.2 to 1.4.3</li> +<li><code>go-exhaustruct</code>: from 2.3.0 to 3.1.0</li> +<li><code>gocognit</code>: from 1.0.6 to 1.0.7</li> +<li><code>gocritic</code>: from 0.8.1 to 0.8.2</li> +<li><code>gofmt</code>: autofix missing newline at EOF</li> +<li><code>misspell</code>: 0.4.0 to 0.4.1</li> +<li><code>musttag</code>: from 0.7.0 to 0.7.1</li> +<li><code>paralleltest</code>: from 1.0.7 to 1.0.8</li> +<li><code>tagalign</code>: from 1.2.2 to 1.3.2</li> +<li><code>typecheck</code>: explain it and remove it from the linter list</li> +<li><code>zerologlint</code>: from 0.1.2 to 0.1.3</li> +</ul> +</li> +<li>misc. +<ul> +<li>🎉 go1.21 support</li> +<li>plugin: include custom linters in <code>enable-all</code></li> +<li>plugin: allow to use settings for plugins</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add linter descriptions.</li> +</ul> +</li> +</ol> +<p><strong>Important</strong></p> +<p><code>ruleguard</code> (a &ldquo;rule&rdquo; inside <code>gocritic</code>) was disabled in this release (v1.54.0) and was enabled again in the next release (v1.54.1).</p> +<p><code>exhaustruct</code> has breaking changes with regular expressions, more details <a href="https://github.com/GaijinEntertainment/go-exhaustruct/releases/tag/v3.0.0"target="_blank" rel="noopener">here</a>.</p> +<h2>v1.53.3<span class="hx:absolute hx:-mt-20" id="v1533"></span> +<a href="#v1533" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>cyclop</code>: from 1.2.0 to 1.2.1</li> +<li><code>exhaustive</code>: from 0.10.0 to 0.11.0</li> +<li><code>forbidigo</code>: from 1.5.1 to 1.5.3</li> +<li><code>ginkgolinter</code>: from 0.12.2 to 0.12.1</li> +<li><code>ineffassign</code>: bump to HEAD</li> +<li><code>nakedret</code>: from 2.0.1 to 2.0.2</li> +<li><code>zerologlint</code>: from 0.1.1 to 0.1.2</li> +</ul> +</li> +<li>misc. +<ul> +<li>codeclimate: reduce memory allocation</li> +<li>support illumos/amd64</li> +</ul> +</li> +</ol> +<h2>v1.53.2<span class="hx:absolute hx:-mt-20" id="v1532"></span> +<a href="#v1532" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>depguard</code>: from v2.0.1 to 2.1.0</li> +</ul> +</li> +<li>misc. +<ul> +<li><code>depguard</code>: throw error only when the linter is called</li> +</ul> +</li> +</ol> +<h2>v1.53.1<span class="hx:absolute hx:-mt-20" id="v1531"></span> +<a href="#v1531" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>misc. +<ul> +<li><code>depguard</code>: fix GOROOT detection</li> +<li><code>importas</code>: fix duplication detection when aliases use regular expression replacement pattern</li> +</ul> +</li> +</ol> +<h2>v1.53.0<span class="hx:absolute hx:-mt-20" id="v1530"></span> +<a href="#v1530" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>gosmopolitan</code>: <a href="https://github.com/xen0n/gosmopolitan"target="_blank" rel="noopener">https://github.com/xen0n/gosmopolitan</a></li> +<li><code>mirror</code>: <a href="https://github.com/butuzov/mirror"target="_blank" rel="noopener">https://github.com/butuzov/mirror</a></li> +<li><code>tagalign</code>: <a href="https://github.com/4meepo/tagalign"target="_blank" rel="noopener">https://github.com/4meepo/tagalign</a></li> +<li><code>zerologlint</code>: <a href="https://github.com/ykadowak/zerologlint"target="_blank" rel="noopener">https://github.com/ykadowak/zerologlint</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>bodyclose</code>: bump to HEAD</li> +<li><code>containedctx</code>: from 1.0.2 to 1.0.3</li> +<li><code>depguard</code>: migrate to v2</li> +<li><code>errname</code>: from 0.1.9 to 0.1.10</li> +<li><code>exhaustive</code>: from 0.9.5 to 0.10.0</li> +<li><code>forbidigo</code>: better support for configuring complex rules</li> +<li><code>gci</code>: improve error message</li> +<li><code>ginkgolinter</code>: add suppress-async-assertion option</li> +<li><code>ginkgolinter</code>: from 0.9.0 to 0.12.0</li> +<li><code>go-critic</code>: from 0.7.0 to 0.8.1</li> +<li><code>go-errorlint</code>: from 1.4.0 to 1.4.2</li> +<li><code>gofumpt</code>: from 0.4.0 to 0.5.0</li> +<li><code>gosec</code>: convert global settings as map with proper key type</li> +<li><code>gosec</code>: from 2.15.0 to 2.16.0</li> +<li><code>importas</code>: detect duplicate alias or package in the configuration</li> +<li><code>importas</code>: fix typo in logs</li> +<li><code>ireturn</code>: from 0.1.1 to 0.2.0</li> +<li><code>musttag</code>: from 0.5.0 to 0.7.0</li> +<li><code>nakedret</code>: to 2.0.1</li> +<li><code>nilnil</code>: from 0.1.3 to 0.1.5</li> +<li><code>paralleltest</code>: from 1.0.6 to 1.0.7</li> +<li><code>revive</code>: from 1.3.1 to 1.3.2</li> +<li><code>tagliatelle</code>: from 0.4.0 to 0.5.0</li> +<li><code>usestdlibvars</code>: fix configuration</li> +</ul> +</li> +<li>misc. +<ul> +<li><code>golang.org/x/tools</code>: from 0.7.0 to 0.9.2</li> +<li>add loongarch64 to the install script</li> +<li>output: add colored-tab</li> +<li>remove warning when the config file is explicitly stdin</li> +<li>rules: support inverted path match</li> +</ul> +</li> +<li>Documentation +<ul> +<li><code>mnd</code>: clarify ignore usage examples to be regexps</li> +<li><code>tagliatelle</code>: update documentation</li> +<li>improve features section</li> +<li>update supported Go versions FAQ</li> +</ul> +</li> +</ol> +<h2>v1.52.2<span class="hx:absolute hx:-mt-20" id="v1522"></span> +<a href="#v1522" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>tparallel</code>: from 0.3.0 to 0.3.1</li> +</ul> +</li> +<li>misc. +<ul> +<li>fix: pre-commit <code>require_serial</code> and <code>pass_filenames</code></li> +</ul> +</li> +</ol> +<h2>v1.52.1<span class="hx:absolute hx:-mt-20" id="v1521"></span> +<a href="#v1521" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>misc. +<ul> +<li>fix: improve panic management</li> +<li>fix: the combination of &ndash;fix and &ndash;path-prefix</li> +</ul> +</li> +</ol> +<h2>v1.52.0<span class="hx:absolute hx:-mt-20" id="v1520"></span> +<a href="#v1520" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>asciicheck</code>: from 0.1.1 to 0.2.0</li> +<li><code>bidichk</code>: from 0.2.3 to 0.2.4</li> +<li><code>contextcheck</code>: from 1.1.3 to 1.1.4</li> +<li><code>dupword</code>: from 0.0.9 to 0.0.11</li> +<li><code>durationcheck</code>: from 0.0.9 to 0.0.10</li> +<li><code>errchkjson</code>: from 0.3.0 to 0.3.1</li> +<li><code>errname</code>: from 0.1.7 to 0.1.9</li> +<li><code>forbidigo</code>: from 1.4.0 to 1.5.1</li> +<li><code>gci</code>: from 0.9.1 to 0.10.1</li> +<li><code>ginkgolinter</code>: from 0.8.1 to 0.9.0</li> +<li><code>go-critic</code>: from 0.6.7 to 0.7.0</li> +<li><code>go-errorlint</code>: from 1.1.0 to 1.4.0</li> +<li><code>godox</code>: bump to HEAD</li> +<li><code>lll</code>: skip go command</li> +<li><code>loggercheck</code>: from 0.9.3 to 0.9.4</li> +<li><code>musttag</code>: from 0.4.5 to 0.5.0</li> +<li><code>nilnil</code>: from 0.1.1 to 0.1.3</li> +<li><code>noctx</code>: from 0.0.1 to 0.0.2</li> +<li><code>revive</code>: from 1.2.5 to 1.3.1</li> +<li><code>rowserrcheck</code>: remove limitation related to generics support</li> +<li><code>staticcheck</code>: from 0.4.2 to 0.4.3</li> +<li><code>testpackage</code>: from 1.1.0 to 1.1.1</li> +<li><code>tparallel</code>: from 0.2.1 to 0.3.0</li> +<li><code>wastedassign</code>: remove limitation related to generics support</li> +<li><code>wrapcheck</code>: from 2.8.0 to 2.8.1</li> +</ul> +</li> +<li>misc. +<ul> +<li>Add TeamCity output format</li> +<li>Consider path prefix when matching path patterns</li> +<li>Add Go version to version information</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Add Tekton in Trusted By page</li> +<li>Clarify that custom linters are not enabled by default</li> +<li>Remove description for deprecated &ldquo;go&rdquo; option</li> +</ul> +</li> +</ol> +<h2>v1.51.2<span class="hx:absolute hx:-mt-20" id="v1512"></span> +<a href="#v1512" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>forbidigo</code>: from 1.3.0 to 1.4.0</li> +<li><code>gci</code>: from 0.9.0 to 0.9.1</li> +<li><code>go-critic</code>: from 0.6.5 to 0.6.7</li> +<li><code>go-errorlint</code>: from 1.0.6 to 1.1.0</li> +<li><code>gosec</code>: from 2.14.0 to 2.15.0</li> +<li><code>musttag</code>: from 0.4.4 to 0.4.5</li> +<li><code>staticcheck</code>: from 0.4.0 to 0.4.2</li> +<li><code>tools</code>: from 0.5.0 to 0.6.0</li> +<li><code>usestdlibvars</code>: from 1.21.1 to 1.23.0</li> +<li><code>wsl</code>: from 3.3.0 to 3.4.0</li> +<li><code>govet</code>: enable <code>timeformat</code> by default</li> +</ul> +</li> +<li>misc. +<ul> +<li>fix: cache status size calculation</li> +<li>add new source archive</li> +</ul> +</li> +<li>Documentation +<ul> +<li>Improve installation section</li> +<li>Replace links to godoc.org with pkg.go.dev</li> +</ul> +</li> +</ol> +<h2>v1.51.1<span class="hx:absolute hx:-mt-20" id="v1511"></span> +<a href="#v1511" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>ginkgolinter</code>: from 0.7.1 to 0.8.1</li> +<li><code>ineffassign</code>: bump to HEAD</li> +<li><code>musttag</code>: from 0.4.3 to 0.4.4</li> +<li><code>sqlclosecheck</code>: from 0.3.0 to 0.4.0</li> +<li><code>staticcheck</code>: bump to v0.4.0</li> +<li><code>wastedassign</code>: from 2.0.6 to 2.0.7</li> +<li><code>wrapcheck</code>: from 2.7.0 to 2.8.0</li> +</ul> +</li> +</ol> +<h2>v1.51.0<span class="hx:absolute hx:-mt-20" id="v1510"></span> +<a href="#v1510" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>ginkgolinter</code>: <a href="https://github.com/nunnatsa/ginkgolinter"target="_blank" rel="noopener">https://github.com/nunnatsa/ginkgolinter</a></li> +<li><code>musttag</code>: <a href="https://github.com/tmzane/musttag"target="_blank" rel="noopener">https://github.com/tmzane/musttag</a></li> +<li><code>gocheckcompilerdirectives</code>: <a href="https://github.com/leighmcculloch/gocheckcompilerdirectives"target="_blank" rel="noopener">https://github.com/leighmcculloch/gocheckcompilerdirectives</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>bodyclose</code>: to HEAD</li> +<li><code>dupword</code>: from 0.0.7 to 0.0.9</li> +<li><code>errcheck</code>: from 1.6.2 to 1.6.3</li> +<li><code>exhaustive</code>: from 0.8.3 to 0.9.5</li> +<li><code>exportloopref</code>: from 0.1.8 to 0.1.11</li> +<li><code>gci</code>: from 0.8.1 to 0.9.0</li> +<li><code>ginkgolinter</code>: from 0.6.0 to 0.7.1</li> +<li><code>go-errorlint</code>: from 1.0.5 to 1.0.6</li> +<li><code>go-ruleguard</code>: from 0.3.21 to 0.3.22</li> +<li><code>gocheckcompilerdirectives</code>: from 1.1.0 to 1.2.1</li> +<li><code>gochecknoglobals</code>: from 0.1.0 to 0.2.1</li> +<li><code>gomodguard</code>: from 1.2.4 to 1.3.0</li> +<li><code>gosec</code>: from 2.13.1 to 2.14.0</li> +<li><code>govet</code>: Add <code>timeformat</code> to analysers</li> +<li><code>grouper</code>: from 1.1.0 to 1.1.1</li> +<li><code>musttag</code>: from 0.4.1 to 0.4.3</li> +<li><code>revive</code>: from 1.2.4 to 1.2.5</li> +<li><code>tagliatelle</code>: from 0.3.1 to 0.4.0</li> +<li><code>tenv</code>: from 1.7.0 to 1.7.1</li> +<li><code>unparam</code>: bump to HEAD</li> +<li><code>usestdlibvars</code>: from 1.20.0 to 1.21.1</li> +<li><code>wsl</code>: fix <code>force-err-cuddling</code> flag</li> +</ul> +</li> +<li>misc. +<ul> +<li>go1.20 support</li> +<li>remove deprecated linters from presets</li> +<li>Build NetBSD binaries</li> +<li>Build loong64 binaries</li> +</ul> +</li> +<li>Documentation +<ul> +<li><code>goimport</code>: improve documentation for local-prefixes</li> +<li><code>gomnd</code>: add missing always ignored functions</li> +<li><code>nolint</code>: fix typo</li> +<li><code>tagliatelle</code> usage typo</li> +<li>add note about binary requirement for plugin</li> +<li>cache preserving and colored output on docker runs</li> +<li>improve documentation about debugging.</li> +<li>improve Editor Integration section</li> +<li>More specific default cache directory</li> +<li>update output example to use valid checkstyle example; add json example</li> +</ul> +</li> +</ol> +<h2>v1.50.1<span class="hx:absolute hx:-mt-20" id="v1501"></span> +<a href="#v1501" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters +<ul> +<li><code>contextcheck</code>: from 1.1.2 to 1.1.3</li> +<li><code>go-mnd</code>: from 2.5.0 to 2.5.1</li> +<li><code>wrapcheck</code>: from 2.6.2 to 2.7.0</li> +<li><code>revive</code>: fix configuration parsing</li> +<li><code>lll</code>: skip imports</li> +</ul> +</li> +<li>misc. +<ul> +<li>windows: remove redundant character escape &lsquo;/&rsquo;</li> +<li>code-climate: add default severity</li> +</ul> +</li> +</ol> +<h2>v1.50.0<span class="hx:absolute hx:-mt-20" id="v1500"></span> +<a href="#v1500" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>dupword</code>: <a href="https://github.com/Abirdcfly/dupword"target="_blank" rel="noopener">https://github.com/Abirdcfly/dupword</a></li> +<li><code>testableexamples</code>: <a href="https://github.com/maratori/testableexamples"target="_blank" rel="noopener">https://github.com/maratori/testableexamples</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>contextcheck</code>: change owner</li> +<li><code>contextcheck</code>: from 1.0.6 to 1.1.2</li> +<li><code>depguard</code>: from 1.1.0 to 1.1.1</li> +<li><code>exhaustive</code>: add missing config</li> +<li><code>exhaustive</code>: from 0.8.1 to 0.8.3</li> +<li><code>gci</code>: from 0.6.3 to 0.8.0</li> +<li><code>go-critic</code>: from 0.6.4 to 0.6.5</li> +<li><code>go-errorlint</code>: from 1.0.2 to 1.0.5</li> +<li><code>go-reassign</code>: v0.1.2 to v0.2.0</li> +<li><code>gofmt</code>: add option <code>rewrite-rules</code></li> +<li><code>gofumpt</code> from 0.3.1 to 0.4.0</li> +<li><code>goimports</code>: update to HEAD</li> +<li><code>interfacebloat</code>: fix configuration loading</li> +<li><code>logrlint</code>: rename <code>logrlint</code> to <code>loggercheck</code></li> +<li><code>paralleltest</code>: add tests of the ignore-missing option</li> +<li><code>revive</code>: from 1.2.3 to 1.2.4</li> +<li><code>usestdlibvars</code>: from 1.13.0 to 1.20.0</li> +<li><code>wsl</code>: support all configs and update docs</li> +</ul> +</li> +<li>misc. +<ul> +<li>Normalize <code>exclude-rules</code> paths for Windows</li> +<li>add riscv64 to the install script</li> +</ul> +</li> +<li>Documentation +<ul> +<li>cli: remove reference to old service</li> +</ul> +</li> +</ol> +<h2>v1.49.0<span class="hx:absolute hx:-mt-20" id="v1490"></span> +<a href="#v1490" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>IMPORTANT: <code>varcheck</code> and <code>deadcode</code> has been removed of default linters.</p> +<ol> +<li>new linters +<ul> +<li><code>interfacebloat</code>: <a href="https://github.com/sashamelentyev/interfacebloat"target="_blank" rel="noopener">https://github.com/sashamelentyev/interfacebloat</a></li> +<li><code>logrlint</code>: <a href="https://github.com/timonwong/logrlint"target="_blank" rel="noopener">https://github.com/timonwong/logrlint</a></li> +<li><code>reassign</code>: <a href="https://github.com/curioswitch/go-reassign"target="_blank" rel="noopener">https://github.com/curioswitch/go-reassign</a></li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>go-colorable</code>: from 0.1.12 to 0.1.13</li> +<li><code>go-critic</code>: from 0.6.3 to 0.6.4</li> +<li><code>go-errorlint</code>: from 1.0.0 to 1.0.2</li> +<li><code>go-exhaustruct</code>: from 2.2.2 to 2.3.0</li> +<li><code>gopsutil</code>: from 3.22.6 to 3.22.7</li> +<li><code>gosec</code>: from 2.12.0 to 2.13.1</li> +<li><code>revive</code>: from 1.2.1 to 1.2.3</li> +<li><code>usestdlibvars</code>: from 1.8.0 to 1.13.0</li> +<li><code>contextcheck</code>: from v1.0.4 to v1.0.6 &amp;&amp; re-enable</li> +<li><code>nosnakecase</code>: This linter is deprecated.</li> +<li><code>varcheck</code>: This linter is deprecated use <code>unused</code> instead.</li> +<li><code>deadcode</code>: This linter is deprecated use <code>unused</code> instead.</li> +<li><code>structcheck</code>: This linter is deprecated use <code>unused</code> instead.</li> +</ul> +</li> +<li>documentation +<ul> +<li><code>revive</code>: fix wrong URL</li> +<li>Add a section about default exclusions</li> +<li><code>usestdlibvars</code>: fix typo in documentation</li> +<li><code>nolintlint</code>: remove allow-leading-space option</li> +<li>Update documentation and assets</li> +</ul> +</li> +<li>misc. +<ul> +<li>dev: rewrite the internal tests framework</li> +<li>fix: exit early on run &ndash;version</li> +<li>fix: set an explicit <code>GOROOT</code> in the Docker image for <code>go-critic</code></li> +</ul> +</li> +</ol> +<h2>v1.48.0<span class="hx:absolute hx:-mt-20" id="v1480"></span> +<a href="#v1480" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters +<ul> +<li><code>usestdlibvars</code>:https://github.com/sashamelentyev/usestdlibvars</li> +</ul> +</li> +<li>updated linters +<ul> +<li><code>contextcheck</code>: disable linter</li> +<li><code>errcheck</code>: from 1.6.1 to 1.6.2</li> +<li><code>gci</code>: add missing <code>custom-order</code> setting</li> +<li><code>gci</code>: from 0.5.0 to 0.6.0</li> +<li><code>ifshort</code>: deprecate linter</li> +<li><code>nolint</code>: drop allow-leading-space option and add &ldquo;nolint:all&rdquo;</li> +<li><code>revgrep</code>: bump to HEAD</li> +</ul> +</li> +<li>documentation +<ul> +<li>remove outdated info on source install</li> +</ul> +</li> +<li>misc +<ul> +<li>go1.19 support</li> +</ul> +</li> +</ol> +<h2>v1.47.3<span class="hx:absolute hx:-mt-20" id="v1473"></span> +<a href="#v1473" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li>remove some go1.18 limitations</li> +<li><code>asasalint</code>: from 0.0.10 to 0.0.11</li> +<li><code>decorder</code>: from 0.2.2 to v0.2.3</li> +<li><code>gci</code>: fix panic with invalid configuration option</li> +<li><code>gci</code>: from 0.4.3 to v0.5.0</li> +<li><code>go-exhaustruct</code>: from 2.2.0 to 2.2.2</li> +<li><code>gomodguard</code>: from 1.2.3 to 1.2.4</li> +<li><code>nosnakecase</code>: from 1.5.0 to 1.7.0</li> +<li><code>honnef.co/go/tools</code>: from 0.3.2 to v0.3.3</li> +</ul> +</li> +<li>misc +<ul> +<li>cgo: fix linters ignoring CGo files</li> +</ul> +</li> +</ol> +<h2>v1.47.2<span class="hx:absolute hx:-mt-20" id="v1472"></span> +<a href="#v1472" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>revive</code>: ignore slow rules</li> +</ul> +</li> +</ol> +<h2>v1.47.1<span class="hx:absolute hx:-mt-20" id="v1471"></span> +<a href="#v1471" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>gci</code>: from 0.4.2 to 0.4.3</li> +<li><code>gci</code>: remove the use of stdin</li> +<li><code>gci</code>: fix options display</li> +<li><code>tenv</code>: from 1.6.0 to 1.7.0</li> +<li><code>unparam</code>: bump to HEAD</li> +</ul> +</li> +</ol> +<h2>v1.47.0<span class="hx:absolute hx:-mt-20" id="v1470"></span> +<a href="#v1470" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>asasalint</code>: <a href="https://github.com/alingse/asasalint"target="_blank" rel="noopener">https://github.com/alingse/asasalint</a></li> +<li><code>nosnakecase</code>: <a href="https://github.com/sivchari/nosnakecase"target="_blank" rel="noopener">https://github.com/sivchari/nosnakecase</a></li> +</ul> +</li> +<li>updated linters: +<ul> +<li><code>decorder</code>: from 0.2.1 to 0.2.2</li> +<li><code>errcheck</code>: from 1.6.0 to 1.6.1</li> +<li><code>errname</code>: from 0.1.6 to 0.1.7</li> +<li><code>exhaustive</code>: from 0.7.11 to 0.8.1</li> +<li><code>gci</code>: fix issues and re-enable autofix</li> +<li><code>gci</code>: from 0.3.4 to 0.4.2</li> +<li><code>go-exhaustruct</code>: from 2.1.0 to 2.2.0</li> +<li><code>go-ruleguard</code>: from 0.3.19 to 0.3.21</li> +<li><code>gocognit</code>: from 1.0.5 to 1.0.6</li> +<li><code>gocyclo</code>: from 0.5.1 to 0.6.0</li> +<li><code>golang.org/x/tools</code>: bump to HEAD</li> +<li><code>gosec</code>: allow <code>global</code> config</li> +<li><code>gosec</code>: from 2.11.0 to 2.12.0</li> +<li><code>nonamedreturns</code>: from 1.0.1 to 1.0.4</li> +<li><code>paralleltest</code>: from 1.0.3 to 1.0.6</li> +<li><code>staticcheck</code>: fix generics</li> +<li><code>staticcheck</code>: from 0.3.1 to 0.3.2</li> +<li><code>tenv</code>: from 1.5.0 to 1.6.0</li> +<li><code>testpackage</code>: from 1.0.1 to 1.1.0</li> +<li><code>thelper</code>: from 0.6.2 to 0.6.3</li> +<li><code>wrapcheck</code>: from 2.6.1 to 2.6.2</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add thanks page</li> +<li>add a clear explanation about the <code>staticcheck</code> integration.</li> +<li><code>depguard</code>: add <code>ignore-file-rules</code></li> +<li><code>depguard</code>: adjust phrasing</li> +<li><code>gocritic</code>: add <code>enable</code> and <code>disable</code> ruleguard settings</li> +<li><code>gomnd</code>: fix typo</li> +<li><code>gosec</code>: add configs for all existing rules</li> +<li><code>govet</code>: add settings for <code>shadow</code> and <code>unusedresult</code></li> +<li><code>thelper</code>: add <code>fuzz</code> config and description</li> +<li>linters: add defaults</li> +</ul> +</li> +</ol> +<h2>v1.46.2<span class="hx:absolute hx:-mt-20" id="v1462"></span> +<a href="#v1462" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>execinquery</code>: bump from v1.2.0 to v1.2.1</li> +<li><code>errorlint</code>: bump to v1.0.0</li> +<li><code>thelper</code>: allow to disable one option</li> +</ul> +</li> +<li>documentation: +<ul> +<li>rename <code>.golangci.example.yml</code> to <code>.golangci.reference.yml</code></li> +<li>add <code>containedctx</code> linter to the list of available linters</li> +</ul> +</li> +</ol> +<h2>v1.46.1<span class="hx:absolute hx:-mt-20" id="v1461"></span> +<a href="#v1461" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>execinquery</code>: bump from v0.6.0 to v0.6.1</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add missing linters</li> +</ul> +</li> +</ol> +<h2>v1.46.0<span class="hx:absolute hx:-mt-20" id="v1460"></span> +<a href="#v1460" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>execinquery</code>: <a href="https://github.com/lufeee/execinquery"target="_blank" rel="noopener">https://github.com/lufeee/execinquery</a></li> +<li><code>nonamedreturns</code>: <a href="https://github.com/firefart/nonamedreturns"target="_blank" rel="noopener">https://github.com/firefart/nonamedreturns</a></li> +<li><code>nosprintfhostport</code>: <a href="https://github.com/stbenjam/no-sprintf-host-port"target="_blank" rel="noopener">https://github.com/stbenjam/no-sprintf-host-port</a></li> +<li><code>exhaustruct</code>: <a href="https://github.com/GaijinEntertainment/go-exhaustruct"target="_blank" rel="noopener">https://github.com/GaijinEntertainment/go-exhaustruct</a></li> +</ul> +</li> +<li>updated linters: +<ul> +<li><code>bidichk</code>: from 0.2.2 to 0.2.3</li> +<li><code>deadcode</code>: bump to HEAD</li> +<li><code>errchkjson</code>: from 0.2.3 to 0.3.0</li> +<li><code>errname</code>: from 0.1.5 to 0.1.6</li> +<li><code>go-critic</code>: from 0.6.2 to 0.6.3</li> +<li><code>gocyclo</code>: from 0.4.0 to 0.5.1</li> +<li><code>gofumpt</code> from 0.3.0 to 0.3.1</li> +<li><code>gomoddirectives</code>: from 0.2.2 to 0.2.3</li> +<li><code>gosec</code>: from 2.10.0 to 2.11.0</li> +<li><code>honnef.co/go/tools</code>: from 0.2.2to 0.3.1 (go1.18 support)</li> +<li><code>nilnil</code>: from 0.1.0 to 0.1.1</li> +<li><code>nonamedreturns</code>: bump from 1.0.0 to 1.0.1</li> +<li><code>predeclared</code>: from 0.2.1 to 0.2.2</li> +<li><code>promlinter</code>: bump to v0.2.0</li> +<li><code>revive</code>: from 1.1.4 to 1.2.1</li> +<li><code>tenv</code>: from 1.4.7 to 1.5.0</li> +<li><code>thelper</code>: from 0.5.1 to 0.6.2</li> +<li><code>unused</code>: fix false-positive</li> +<li><code>varnamelen</code>: bump to v0.8.0</li> +<li><code>wrapcheck</code>: from 2.5.0 to 2.6.1</li> +<li><code>exhaustivestruct</code>: This linter is deprecated use <code>exhaustruct</code> instead.</li> +</ul> +</li> +<li>documentation: +<ul> +<li>Update &ldquo;Shell Completion&rdquo; instruction on Linux</li> +<li>Update FAQ page</li> +</ul> +</li> +<li>misc: +<ul> +<li>log: enable override coloring based on <code>CLICOLOR</code> and <code>CLICOLOR_FORCE</code></li> +</ul> +</li> +</ol> +<h2>v1.45.2<span class="hx:absolute hx:-mt-20" id="v1452"></span> +<a href="#v1452" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>misc: +<ul> +<li>fix: help command</li> +</ul> +</li> +</ol> +<h2>v1.45.1<span class="hx:absolute hx:-mt-20" id="v1451"></span> +<a href="#v1451" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>interfacer</code>: inactivate with go1.18</li> +<li><code>govet</code>: inactivate unsupported analyzers (go1.18)</li> +<li><code>depguard</code>: reduce requirements</li> +<li><code>structcheck</code>: inactivate with go1.18</li> +<li><code>varnamelen</code>: bump from v0.6.0 to v0.6.1</li> +</ul> +</li> +<li>misc: +<ul> +<li>Automatic Go version detection 🎉 (go1.18)</li> +<li>docker: update base images (go1.18)</li> +</ul> +</li> +</ol> +<h2>v1.45.0<span class="hx:absolute hx:-mt-20" id="v1450"></span> +<a href="#v1450" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>cobra</code>: from 1.3.0 to 1.4.0</li> +<li><code>containedctx</code>: from 1.0.1 to 1.0.2</li> +<li><code>errcheck</code>: add an option to remove default exclusions</li> +<li><code>gci</code>: from 0.3.1 to 0.3.2</li> +<li><code>go-header</code>: from 0.4.2 to 0.4.3</li> +<li><code>gofumpt</code>: add module-path setting</li> +<li><code>gofumpt</code>: from 0.2.1 to 0.3.0</li> +<li><code>gopsutil</code>: from 3.22.1 to 3.22.2</li> +<li><code>gosec</code>: from 2.9.6 to 2.10.0</li> +<li><code>makezero</code>: from 1.1.0 to 1.1.1</li> +<li><code>revive</code>: fix default values</li> +<li><code>wrapcheck</code>: from 2.4.0 to 2.5.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>docs: add &ldquo;back to the top&rdquo; button</li> +<li>docs: add <code>forbidigo</code> example that uses comments</li> +<li>docs: improve linters page</li> +</ul> +</li> +<li>misc: +<ul> +<li>go1.18 support 🎉</li> +<li>Add an option to manage the targeted version of Go</li> +<li>Default to YAML when config file has no extension</li> +</ul> +</li> +</ol> +<h2>v1.44.2<span class="hx:absolute hx:-mt-20" id="v1442"></span> +<a href="#v1442" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>gci</code>: bump to HEAD</li> +<li><code>gci</code>: restore defaults for sections</li> +<li><code>whitespace</code>: from 0.0.4 to 0.0.5</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add link to configuration in the linters list</li> +</ul> +</li> +</ol> +<h2>v1.44.1<span class="hx:absolute hx:-mt-20" id="v1441"></span> +<a href="#v1441" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>updated linters: +<ul> +<li><code>bidichk</code>: from 0.2.1 to 0.2.2</li> +<li><code>errchkjson</code>: from 0.2.1 to 0.2.3</li> +<li><code>thelper</code>: from 0.5.0 to 0.5.1</li> +<li><code>tagliatelle</code>: from 0.3.0 to 0.3.1</li> +<li><code>gopsutil</code>: from 3.21.12 to 3.22.1</li> +<li><code>gci</code>: from 0.2.9 to 0.3.0</li> +<li><code>revive</code>: from v1.1.3 to v1.1.4</li> +<li><code>varnamelen</code>: from v0.5.0 to v0.6.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>linters: improve configuration pages</li> +<li><code>decorder</code>: fix <code>disable-init-func-first-check: false</code> elaboration</li> +</ul> +</li> +<li>misc: +<ul> +<li>fix debug output</li> +</ul> +</li> +</ol> +<h2>v1.44.0<span class="hx:absolute hx:-mt-20" id="v1440"></span> +<a href="#v1440" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>containedctx</code>: <a href="https://github.com/sivchari/containedctx"target="_blank" rel="noopener">https://github.com/sivchari/containedctx</a></li> +<li><code>decorder</code>: <a href="https://gitlab.com/bosi/decorder"target="_blank" rel="noopener">https://gitlab.com/bosi/decorder</a></li> +<li><code>errchkjson</code>: <a href="https://github.com/breml/errchkjson"target="_blank" rel="noopener">https://github.com/breml/errchkjson</a></li> +<li><code>maintidx</code>: <a href="https://github.com/yagipy/maintidx"target="_blank" rel="noopener">https://github.com/yagipy/maintidx</a></li> +<li><code>grouper</code>: <a href="https://github.com/leonklingele/grouper"target="_blank" rel="noopener">https://github.com/leonklingele/grouper</a></li> +</ul> +</li> +<li>updated linters: +<ul> +<li><code>asciicheck</code>: bump to v0.1.1</li> +<li><code>bidichk</code>: from 0.1.1 to 0.2.1</li> +<li><code>bodyclose</code>: bump to HEAD</li> +<li><code>decorder</code>: from 0.2.0 to 0.2.1</li> +<li><code>depguard</code>: from 1.0.1 to 1.1.0</li> +<li><code>errchkjson</code>: from 0.2.0 to 0.2.1</li> +<li><code>errorlint</code>: bump to HEAD</li> +<li><code>exhaustive</code>: drop deprecated/unused settings</li> +<li><code>exhaustive</code>: from v0.2.3 to 0.7.11</li> +<li><code>forbidigo</code>: from 1.2.0 to 1.3.0</li> +<li><code>forcetypeassert</code>: bump to v0.1.0</li> +<li><code>gocritic</code>: from 0.6.1 to 0.6.2</li> +<li><code>gocritic</code>: support autofix</li> +<li><code>gocyclo</code>: from 0.3.1 to 0.4.0</li> +<li><code>godot</code>: add period option</li> +<li><code>gofumpt</code>: from 0.1.1 to 0.2.1</li> +<li><code>gomnd</code>: from 2.4.0 to 2.5.0</li> +<li><code>gomnd</code>: new configuration</li> +<li><code>gosec</code>: from 2.9.1 to 2.9.6</li> +<li><code>ifshort</code>: from 1.0.3 to 1.0.4</li> +<li><code>ineffassign</code>: bump to HEAD</li> +<li><code>makezero</code>: to v1.1.0</li> +<li><code>promlinter</code>: from v0.1.0 to HEAD</li> +<li><code>revive</code>: fix <code>enableAllRules</code></li> +<li><code>revive</code>: from 1.1.2 to 1.1.3</li> +<li><code>staticcheck</code>: from 0.2.1 to 0.2.2</li> +<li><code>tagliatelle</code>: from 0.2.0 to 0.3.0</li> +<li><code>thelper</code>: from 0.4.0 to 0.5.0</li> +<li><code>unparam</code>: bump to HEAD</li> +<li><code>varnamelen</code>: bump to v0.5.0</li> +<li><code>wrapcheck</code>: update configuration to include <code>ignoreSignRegexps</code></li> +</ul> +</li> +<li>documentation: +<ul> +<li>linters: improve pages about configuration</li> +<li>improve page about false-positive</li> +<li><code>nolintlint</code>: fix wrong default value in comment</li> +<li><code>revive</code>: add a more detailed configuration</li> +</ul> +</li> +<li>misc: +<ul> +<li>outputs: Add support for multiple outputs</li> +<li>outputs: Print error text in <code>&lt;failure&gt;</code> tag content for more readable JUnit output</li> +<li>outputs: ensure that the Issues key in JSON format is a list</li> +<li>Return error if any linter fails to run</li> +<li>cli: Show deprecated mark in the CLI linters help</li> +</ul> +</li> +</ol> +<h2>November 2021<span class="hx:absolute hx:-mt-20" id="november-2021"></span> +<a href="#november-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>bidichk</code>: <a href="https://github.com/breml/bidichk"target="_blank" rel="noopener">https://github.com/breml/bidichk</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>nestif</code>: from 0.3.0 to 0.3.1</li> +<li><code>rowserrcheck</code>: from 1.1.0 to 1.1.1</li> +<li><code>gopsutil</code>: from 3.21.9 to 3.21.10</li> +<li><code>wrapcheck</code>: from 2.3.1 to 2.4.0</li> +<li><code>gocritic</code>: add support for variable substitution in <code>ruleguard</code> path settings</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve <code>go-critic</code> documentation</li> +<li>improve <code>nolintlint</code> documentation</li> +</ul> +</li> +<li>Misc: +<ul> +<li>cli: don&rsquo;t hide <code>enable-all</code> option</li> +</ul> +</li> +</ol> +<h2>october 2021<span class="hx:absolute hx:-mt-20" id="october-2021"></span> +<a href="#october-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>contextcheck</code>: <a href="https://github.com/kkHAIKE/contextcheck"target="_blank" rel="noopener">https://github.com/kkHAIKE/contextcheck</a></li> +<li><code>varnamelen</code>: <a href="https://github.com/blizzy78/varnamelen"target="_blank" rel="noopener">https://github.com/blizzy78/varnamelen</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>gochecknoglobals</code>: to v0.1.0</li> +<li><code>gosec</code>: filter issues according to the severity and confidence</li> +<li><code>errcheck</code>: empty selector name.</li> +<li><code>ifshort</code>: from 1.0.2 to 1.0.3</li> +<li><code>go-critic</code>: from 0.5.6 to 0.6.0</li> +<li><code>gosec</code>: from 2.8.1 to 2.9.1</li> +<li><code>durationcheck</code>: from 0.0.8 to 0.0.9</li> +<li><code>wrapcheck</code>: from 2.3.0 to 2.3.1</li> +<li><code>revive</code>: from 1.1.1 to 1.1.2</li> +</ul> +</li> +</ol> +<h2>September 2021<span class="hx:absolute hx:-mt-20" id="september-2021"></span> +<a href="#september-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>ireturn</code>: <a href="https://github.com/butuzov/ireturn"target="_blank" rel="noopener">https://github.com/butuzov/ireturn</a></li> +<li><code>nilnil</code>: <a href="https://github.com/Antonboom/nilnil"target="_blank" rel="noopener">https://github.com/Antonboom/nilnil</a></li> +<li><code>tenv</code>: <a href="https://github.com/sivchari/tenv"target="_blank" rel="noopener">https://github.com/sivchari/tenv</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>errcheck</code>: update to HEAD</li> +<li><code>errname</code>: from 0.1.4 to 0.1.5</li> +<li><code>gci</code>: Parse the settings more similarly to the CLI</li> +<li><code>godot</code>: from 1.4.9 to 1.4.11</li> +<li><code>ireturn</code>: from 0.1.0 to 0.1.1</li> +<li><code>nlreturn</code>: add block-size option</li> +<li><code>paralleltest</code>: from 1.0.2 to 1.0.3</li> +</ul> +</li> +<li>Misc: +<ul> +<li>new-from-rev: add support for finding issues in entire files in a diff</li> +</ul> +</li> +</ol> +<h2>August 2021<span class="hx:absolute hx:-mt-20" id="august-2021"></span> +<a href="#august-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>errname</code>: <a href="https://github.com/Antonboom/errname"target="_blank" rel="noopener">https://github.com/Antonboom/errname</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>errname</code>: from 0.1.3 to 0.1.4</li> +<li><code>go-critic</code>: fix invalid type conversions.</li> +<li><code>godot</code>: from 1.4.8 to 1.4.9</li> +<li><code>gomodguard</code>: from 1.2.2 to 1.2.3</li> +<li><code>revive</code>: from 1.0.9 to 1.1.1</li> +<li><code>staticcheck</code>: bump to 2021.1.1 (v0.2.1)</li> +<li><code>wrapcheck</code>: bump to v2.3.0</li> +</ul> +</li> +<li>Misc: +<ul> +<li>build binaries and Docker images with go1.17</li> +</ul> +</li> +</ol> +<h2>July 2021<span class="hx:absolute hx:-mt-20" id="july-2021"></span> +<a href="#july-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>update linters: +<ul> +<li><code>errcheck</code>: allow exclude config without extra file</li> +<li><code>exhaustive</code>: from 0.1.0 to 0.2.3</li> +<li><code>gocognit</code>: from 1.0.1 to 1.0.5</li> +<li><code>godot</code>: from 1.4.7 to 1.4.8</li> +<li><code>gomoddirectives</code>: from 0.2.1 to 0.2.2</li> +<li><code>revive</code>: from 1.0.8 to 1.0.9</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve <code>goconst</code> documentation</li> +<li>improve <code>goimports</code> description</li> +</ul> +</li> +</ol> +<h2>June 2021<span class="hx:absolute hx:-mt-20" id="june-2021"></span> +<a href="#june-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>update linters: +<ul> +<li><code>durationcheck</code>: from 0.0.7 to 0.0.8</li> +<li><code>gci</code>: from 0.2.8 to 0.2.9</li> +<li><code>goconst</code>: from 0.5.6 to 0.5.7</li> +<li><code>gofumpt</code>: Add lang-version option</li> +<li><code>gomodguard</code>: from 1.2.1 to 1.2.2</li> +<li><code>gosec</code>: from 2.8.0 to 2.8.1</li> +<li><code>revive</code>: add enable-all-rules.</li> +<li><code>revive</code>: allow to disable rule</li> +<li><code>revive</code>: fix exclude comment rule for const block</li> +<li><code>revive</code>: from 1.0.7 to 1.0.8</li> +<li><code>wrapcheck</code>: from 2.1.0 to 2.2.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>add all integrations to docs introduction page</li> +</ul> +</li> +<li>Misc: +<ul> +<li>🎉 Un-deprecate enable-all option</li> +<li>output: generate HTML report</li> +<li>Support RISV64</li> +</ul> +</li> +</ol> +<h2>May 2021<span class="hx:absolute hx:-mt-20" id="may-2021"></span> +<a href="#may-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>tagliatelle</code>: <a href="https://github.com/ldez/tagliatelle"target="_blank" rel="noopener">https://github.com/ldez/tagliatelle</a></li> +<li><code>promlinter</code>: <a href="https://github.com/yeya24/promlinter"target="_blank" rel="noopener">https://github.com/yeya24/promlinter</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>durationcheck</code>: from 0.0.6 to 0.0.7</li> +<li><code>errorlint</code>: bump to HEAD</li> +<li><code>forbidigo</code>: from 1.1.0 to 1.2.0</li> +<li><code>go-critic</code>: from 0.5.5 to 0.5.6</li> +<li><code>godot</code>: from 1.4.6 to 1.4.7</li> +<li>⚠ <code>golint</code>: deprecated</li> +<li><code>gomnd</code>: from 2.3.2 to 2.4.0</li> +<li><code>gomodguard</code>: fix problem where duplicate issues were reported</li> +<li><code>gosec</code>: from 2.7.0 to 2.8.0</li> +<li><code>govet</code>: fix <code>sigchanyzer</code></li> +<li><code>govet</code>: Update vet passes</li> +<li><code>importas</code>: allow repeated aliases</li> +<li><code>importas</code>: bump to HEAD</li> +<li><code>makezero</code>: bump to HEAD</li> +<li><code>nolintlint</code>: fix false positive</li> +<li><code>revive</code>: convert hard coded excludes into default exclude patterns</li> +<li><code>revive</code>: fix add-constant rule support</li> +<li><code>revive</code>: fix excludes</li> +<li><code>revive</code>: from 1.0.6 to 1.0.7</li> +<li><code>revive</code>: improve &rsquo;exported&rsquo; rule output</li> +<li><code>rowserrcheck</code>: bump to v1.1.0</li> +<li><code>staticcheck</code>: configuration for <code>staticcheck</code>, <code>gosimple</code>, <code>stylecheck</code></li> +<li><code>staticcheck</code>: from 0.1.3 to 0.1.4</li> +<li><code>staticcheck</code>: from v0.1.4 to v0.2.0</li> +<li><code>wastedassign</code>: from 0.2.0 to 1.0.0</li> +<li><code>wastedassign</code>: from 1.0.0 to v2.0.6</li> +<li><code>wrapcheck</code>: from 1.2.0 to 2.1.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve linters page</li> +<li><code>exhaustivestruct</code> example explanation</li> +<li>fix pattern of <code>forbidigo</code> in example config yaml</li> +<li>bump documentation dependencies</li> +<li>fix typos</li> +</ul> +</li> +<li>Misc: +<ul> +<li>set the minimum Go version to go1.15</li> +<li>non-zero exit code when a linter produces a panic</li> +</ul> +</li> +</ol> +<h2>April 2021<span class="hx:absolute hx:-mt-20" id="april-2021"></span> +<a href="#april-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>tagliatelle</code>: <a href="https://github.com/ldez/tagliatelle"target="_blank" rel="noopener">https://github.com/ldez/tagliatelle</a></li> +<li><code>promlinter</code>: <a href="https://github.com/yeya24/promlinter"target="_blank" rel="noopener">https://github.com/yeya24/promlinter</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>godot</code>: from 1.4.4 to 1.4.6</li> +<li><code>wrapcheck</code>: from 1.0.0 to 1.2.0</li> +<li><code>go-mnd</code>: from 2.3.1 to 2.3.2</li> +<li><code>wsl</code>: from 3.2.0 to 3.3.0</li> +<li><code>revive</code>: from 1.0.5 to 1.0.6</li> +<li><code>importas</code>: bump to HEAD</li> +<li><code>staticcheck</code>: configurable Go version</li> +<li><code>gosec</code>: add configuration</li> +<li><code>typecheck</code>: improve error stack parsing</li> +</ul> +</li> +<li>documentation: +<ul> +<li>bump documentation dependencies</li> +<li>fix typos</li> +</ul> +</li> +<li>Misc: +<ul> +<li>fix: comma in exclude pattern leads to unexpected results</li> +</ul> +</li> +</ol> +<h2>March 2021<span class="hx:absolute hx:-mt-20" id="march-2021"></span> +<a href="#march-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>gomoddirectives</code>: <a href="https://github.com/ldez/gomoddirectives"target="_blank" rel="noopener">https://github.com/ldez/gomoddirectives</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>go-critic</code>: from 0.5.4 to 0.5.5</li> +<li><code>gofumpt</code>: from v0.1.0 to v0.1.1</li> +<li><code>gosec</code>: from 2.6.1 to 2.7.0</li> +<li><code>ifshort</code>: bump to v1.0.2</li> +<li><code>importas</code>: bump to HEAD</li> +<li><code>makezero</code>: bump to HEAD</li> +<li><code>nolintlint</code>: allow to fix //nolint lines</li> +<li><code>revive</code>: from 1.0.3 to 1.0.5</li> +<li><code>revive</code>: the default configuration is only applied when no dedicated configuration</li> +<li><code>rowserrcheck</code>: bump to HEAD</li> +<li>⚠ <code>scopelint</code>: deprecated</li> +<li><code>staticcheck</code>: from v0.1.2 (2020.2.2) to v0.1.3 (2020.2.3)</li> +<li>🎉 <code>typecheck</code>: display compilation errors as report instead of error</li> +<li><code>wastedassign</code>: bump to v0.2.0</li> +<li><code>wrapcheck</code>: bump to v1.0.0</li> +</ul> +</li> +<li>documentation: +<ul> +<li>improve <a href="https://golangci-lint.run/docs/linters/"target="_blank" rel="noopener">linters page</a> (versions, deprecation, and presets)</li> +<li>add <a href="https://golangci-lint.run/docs/configuration/cli/#cache"target="_blank" rel="noopener">cache directory</a> information</li> +<li>adding missing format options</li> +<li>fix typos</li> +</ul> +</li> +<li>Misc: +<ul> +<li>Set <code>version</code> command output to Stdout</li> +<li>fix linters load mode</li> +<li>Restore fast linters meaning</li> +</ul> +</li> +</ol> +<h2>February 2021<span class="hx:absolute hx:-mt-20" id="february-2021"></span> +<a href="#february-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>durationcheck</code>: <a href="https://github.com/charithe/durationcheck"target="_blank" rel="noopener">https://github.com/charithe/durationcheck</a></li> +<li><code>revive</code>: <a href="https://github.com/mgechev/revive"target="_blank" rel="noopener">https://github.com/mgechev/revive</a></li> +<li><code>cyclop</code>: <a href="https://github.com/bkielbasa/cyclop"target="_blank" rel="noopener">https://github.com/bkielbasa/cyclop</a></li> +<li><code>wastedassign</code>: <a href="https://github.com/sanposhiho/wastedassign"target="_blank" rel="noopener">https://github.com/sanposhiho/wastedassign</a></li> +<li><code>importas</code>: <a href="https://github.com/julz/importas"target="_blank" rel="noopener">https://github.com/julz/importas</a></li> +<li><code>nilerr</code>: <a href="https://github.com/gostaticanalysis/nilerr"target="_blank" rel="noopener">https://github.com/gostaticanalysis/nilerr</a></li> +<li><code>forcetypeassert</code>: <a href="https://github.com/gostaticanalysis/forcetypeassert"target="_blank" rel="noopener">https://github.com/gostaticanalysis/forcetypeassert</a></li> +<li><code>govet</code>: add <code>stringintconv</code> and <code>ifaceassert</code></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>prealloc</code>: Use upstream version</li> +<li><code>errcheck</code>: Use upstream version</li> +<li><code>ineffassign</code>: Use upstream version</li> +<li><code>gocyclo</code>: Use upstream version</li> +<li><code>godot</code> from 1.3.2 to 1.4.3</li> +<li><code>exhaustivestruct</code> from 1.1.0 to 1.2.0</li> +<li><code>forbidigo</code> from 1.0.0 to 1.1.0</li> +<li><code>thelper</code> from 0.2.1 to 0.3.1</li> +<li><code>ruleguard</code>: print error message and exit with non-zero status when parsing error occurs</li> +<li>fix wrong load mode for <code>asciicheck</code>, <code>exhaustivestruct</code>, <code>exportloopref</code>, and <code>makezero</code></li> +<li><code>wsl</code>: bump to v3.2.0</li> +<li><code>durationcheck</code>: from 0.0.4 to 0.0.6</li> +<li><code>staticcheck</code>: from 2020.1.6 to v0.1.2 (2020.2.2)</li> +<li><code>thelper</code> from 0.3.1 to 0.4.0</li> +<li><code>bodyclose</code>: bump to HEAD</li> +<li><code>go-err113</code>: bump to HEAD</li> +<li>⚠ <code>interfacer</code>: deprecated</li> +<li>⚠ <code>maligned</code>: deprecated (govet <code>fieldalignment</code> as replacement)</li> +<li><code>govet</code>: use same default linter as go vet</li> +<li><code>go-printf-func-name</code>: to <code>v0.0.0-20200119135958-7558a9eaa5af</code></li> +<li><code>godox</code>: to <code>v0.0.0-20210227103229-6504466cf951</code></li> +<li><code>asciicheck</code>: to <code>v0.0.0-20200416200610-e657995f937b</code></li> +<li><code>wrapcheck</code>: to <code>v0.0.0-20201130113247-1683564d9756</code></li> +<li><code>unparam</code>: to <code>v0.0.0-20210104141923-aac4ce9116a7</code></li> +</ul> +</li> +<li>CLI: truncate multiline descriptions</li> +<li>fix: new-from-rev for a large repository</li> +<li>Support RelatedInformation for analysis Diagnostic</li> +<li>use go1.16 to create binaries</li> +<li>fix: MIPS release</li> +<li>documentation: +<ul> +<li>bump documentation dependencies</li> +<li>fix <code>go-header</code> usage</li> +<li>improve <code>gocritic</code> description</li> +<li>update deprecated hyperlink for Sublime Text plugin</li> +<li>add docs on using homebrew tap</li> +</ul> +</li> +</ol> +<h2>January 2021<span class="hx:absolute hx:-mt-20" id="january-2021"></span> +<a href="#january-2021" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>predeclared</code>: <a href="https://github.com/nishanths/predeclared"target="_blank" rel="noopener">https://github.com/nishanths/predeclared</a></li> +<li><code>ifshort</code>: <a href="https://github.com/esimonov/ifshort"target="_blank" rel="noopener">https://github.com/esimonov/ifshort</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>go-critic</code> from 0.5.2 to 0.5.3</li> +<li><code>thelper</code> from 0.1.0 to 0.2.1</li> +<li>Validate <code>go-critic</code> settings</li> +<li><code>gofumpt</code> to v0.1.0</li> +<li><code>gci</code> to v0.2.8</li> +<li><code>go-mnd</code> to v2.3.1</li> +<li><code>gosec</code> from 2.5.0 to 2.6.1</li> +<li><code>godot</code> from 1.3.2 to 1.4.3</li> +<li><code>ifshort</code> to v1.0.1</li> +<li><code>rowserrcheck</code>: fix reports false positive</li> +</ul> +</li> +<li>fix: modules-download-mode support</li> +<li>documentation: +<ul> +<li>bump documentation dependencies</li> +</ul> +</li> +</ol> +<h2>December 2020<span class="hx:absolute hx:-mt-20" id="december-2020"></span> +<a href="#december-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>forbidigo</code>: <a href="https://github.com/ashanbrown/forbidigo"target="_blank" rel="noopener">https://github.com/ashanbrown/forbidigo</a></li> +<li><code>makezero</code>: <a href="https://github.com/ashanbrown/makezero"target="_blank" rel="noopener">https://github.com/ashanbrown/makezero</a></li> +<li><code>thelper</code>: <a href="https://github.com/kulti/thelper"target="_blank" rel="noopener">https://github.com/kulti/thelper</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>go-header</code> from v0.3.1 to v0.4.2</li> +<li><code>go-mnd</code> from v2.0.0 to v2.2.0</li> +<li><code>godot</code> from v1.3.0 to v1.3.2</li> +<li><code>gci</code> from v0.2.4 to v0.2.7</li> +<li><code>gomodguard</code> from v1.1.0 to v1.2.0</li> +<li><code>go-errorlint</code> from v0.0.0-20201006195004-351e25ade6e3 to v0.0.0-20201127212506-19bd8db6546f</li> +<li><code>gofumpt</code> from v0.0.0-20200802201014-ab5a8192947d to v0.0.0-20201129102820-5c11c50e9475</li> +<li><code>nolintlint</code> fix comment analysis. (#1571)</li> +</ul> +</li> +<li>result/processors: treat all non-Go source as special autogenerated files</li> +<li>throw an error on panic. (#1540)</li> +<li>resolve custom linters&rsquo; path relative to config file directory (#1572)</li> +<li>treat all non-Go source as special autogenerated files</li> +<li>documentation: +<ul> +<li>add settings examples for <code>gocritic</code> (#1562)</li> +<li>removing reference to no-longer-existing linter-in-the-cloud (#1553)</li> +</ul> +</li> +<li>others: +<ul> +<li>bump <code>gopkg.in/yaml.v2</code> from 2.3.0 to 2.4.0 (#1528)</li> +<li>bump <code>gatsby-remark-responsive-iframe</code> in /docs (#1533)</li> +<li>bump <code>gatsby-remark-images</code> from 3.3.29 to 3.6.0 in /docs (#1531)</li> +<li>bump <code>ini</code> from 1.3.5 to 1.3.8 in /tools (#1560)</li> +<li>bump <code>react-headroom</code> from 3.0.0 to 3.0.1 in /docs (#1532)</li> +<li>bump <code>react-live</code> from 2.2.2 to 2.2.3 in /docs (#1534)</li> +<li>bump <code>react</code> from 16.13.1 to 16.14.0 in /docs (#1481)</li> +<li>Fix <code>forbidigo</code> linter name in reports (#1590)</li> +</ul> +</li> +</ol> +<h2>November 2020<span class="hx:absolute hx:-mt-20" id="november-2020"></span> +<a href="#november-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>paralleltest</code>: <a href="https://github.com/kunwardeep/paralleltest"target="_blank" rel="noopener">https://github.com/kunwardeep/paralleltest</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>godot</code> from v0.4.9 to v1.3.0</li> +<li><code>exportloopref</code> from v0.1.7 to v0.1.8</li> +<li><code>gosec</code> from 2.4.0 to 2.5.0</li> +<li><code>goconst</code> using upstream <a href="https://github.com/jgautheron/goconst"target="_blank" rel="noopener">https://github.com/jgautheron/goconst</a></li> +</ul> +</li> +<li><code>DefaultExcludePatterns</code> should only be used for specified linter (#1494)</li> +<li>unknown linter breaks //nolint (#1497)</li> +<li>report all unknown linters at once (#1477)</li> +<li>CI: +<ul> +<li>fix Docker tag for Alpine build</li> +</ul> +</li> +<li>documentation: +<ul> +<li>missing sort-results in the docs (#1514)</li> +<li>add description of Homebrew&rsquo;s official formula (#1421)</li> +</ul> +</li> +<li>others: +<ul> +<li>bump <code>golang.org/x/text</code> to v0.3.4 (#1293)</li> +<li>bump <code>github.com/fatih/color</code> to from 1.9.0 to 1.10.0 (#1485)</li> +<li>bump <code>lodash</code> from 4.17.15 to 4.17.19 in /.github/peril (#1252)</li> +<li>bump <code>polished</code> from 3.6.6 to 4.0.3 in /docs (#1482)</li> +<li>bump <code>gatsby-alias-imports</code> from 1.0.4 to 1.0.6 in /docs (#1479)</li> +<li>bump <code>puppeteer</code> from 5.3.1 to 5.4.1 in /docs (#1480)</li> +<li>bump <code>gatsby-remark-embedder</code> from 3.0.0 to 4.0.0 in /docs (#1478)</li> +</ul> +</li> +</ol> +<h2>October 2020<span class="hx:absolute hx:-mt-20" id="october-2020"></span> +<a href="#october-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new linters: +<ul> +<li><code>exhaustivestruct</code>: <a href="https://github.com/mbilski/exhaustivestruct"target="_blank" rel="noopener">https://github.com/mbilski/exhaustivestruct</a></li> +<li><code>go-errorlint</code>: <a href="https://github.com/polyfloyd/go-errorlint"target="_blank" rel="noopener">https://github.com/polyfloyd/go-errorlint</a></li> +<li><code>tparallel</code>: <a href="https://github.com/moricho/tparallel"target="_blank" rel="noopener">https://github.com/moricho/tparallel</a></li> +<li><code>wrapcheck</code>: <a href="https://github.com/tomarrell/wrapcheck"target="_blank" rel="noopener">https://github.com/tomarrell/wrapcheck</a></li> +</ul> +</li> +<li>update linters: +<ul> +<li><code>honnef.co/go/tools</code> from 2020.1.5 to 2020.1.6</li> +<li><code>exhaustivestruct</code> from v1.0.1 to v1.1.0</li> +<li><code>exhaustive</code> to v0.1.0</li> +<li><code>gochecknoglobals</code>: use <a href="https://github.com/leighmcculloch/gochecknoglobals"target="_blank" rel="noopener">https://github.com/leighmcculloch/gochecknoglobals</a></li> +</ul> +</li> +<li>add support for powershell completion (#1408)</li> +<li>add <code>.golangci.yaml</code> to list of configuration files searched on startup (#1364)</li> +<li>support for only specifying default severity (#1396)</li> +<li>documentation: +<ul> +<li>mention macports installation procedure on macOS (#1352)</li> +<li>sort linters (#1451)</li> +</ul> +</li> +<li>CI: +<ul> +<li>add codeQL scanning (#1405)</li> +<li>fix version details in Docker image (#1471)</li> +<li>releasing docker image for arm64 (#1383)</li> +<li>change interval for npm to monthly (#1424)</li> +</ul> +</li> +<li>others: +<ul> +<li>use tag version for cobra (#1458)</li> +<li>bump <code>nancy</code> to 1.0.1 (#1410)</li> +<li>bump <code>gatsby-plugin-catch-links</code> in /docs (#1415)</li> +<li>bump <code>gatsby-plugin-mdx</code> from 1.2.40 to 1.2.43 in /docs (#1419)</li> +<li>bump <code>gatsby-plugin-sharp</code> from 2.6.31 to 2.6.40 in /docs (#1423)</li> +<li>bump <code>gatsby-plugin-sitemap</code> from 2.4.12 to 2.4.14 in /docs (#1417)</li> +<li>bump <code>github.com/mattn/go-colorable</code> from 0.1.7 to 0.1.8 (#1413)</li> +<li>bump <code>github.com/sirupsen/logrus</code> from 1.6.0 to 1.7.0 (#1412)</li> +<li>bump <code>github.com/sourcegraph/go-diff</code> from 0.6.0 to 0.6.1 (#1414)</li> +<li>bump <code>golangci/golangci-lint-action</code> from v2 to v2.3.0 (#1447) (#1469)</li> +<li>bump <code>puppeteer</code> from 3.3.0 to 5.3.1 in /docs (#1418)</li> +</ul> +</li> +</ol> +<h2>September 2020<span class="hx:absolute hx:-mt-20" id="september-2020"></span> +<a href="#september-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>update linters: +<ul> +<li><code>godot</code> from 0.4.8 to 0.4.9</li> +<li><code>exhaustive</code> from v0.0.0-20200708172631-8866003e3856 to v0.0.0-20200811152831-6cf413ae40e0</li> +<li><code>gofumpt</code> from v0.0.0-20200709182408-4fd085cb6d5f to v0.0.0-20200802201014-ab5a8192947d</li> +</ul> +</li> +<li>add support for fish completion (#1201)</li> +<li>documentation: +<ul> +<li>fix typo in performance docs (#1350)</li> +</ul> +</li> +<li>CI: +<ul> +<li>prevent macos to be marked as passing upon failure (#1381)</li> +<li>check only for go.mod file (#1397)</li> +<li>check if go.mod and go.sum are up to dated (#1377)</li> +<li>trigger Netlify (#1358)</li> +</ul> +</li> +<li>others: +<ul> +<li>bump <code>github.com/sourcegraph/go-diff</code> from 0.5.3 to 0.6.0 (#1353)</li> +<li>bump <code>github.com/valyala/quicktemplate</code> from 1.6.2 to 1.6.3 (#1385)</li> +<li>ignore known dependency failure in nancy (#1378)</li> +<li>bump <code>@mdx-js/mdx</code> from 1.6.16 to 1.6.18 in /docs (#1401)</li> +<li>bump <code>gatsby</code> from 2.24.52 to 2.24.65 in /docs (#1400)</li> +<li>bump <code>gatsby-plugin-canonical-urls</code> in /docs (#1390)</li> +<li>bump <code>gatsby-plugin-google-analytics</code> in /docs (#1388)</li> +<li>bump <code>gatsby-plugin-manifest</code> from 2.4.23 to 2.4.27 in /docs (#1355)</li> +<li>bump <code>gatsby-plugin-mdx</code> from 1.2.35 to 1.2.40 in /docs (#1386)</li> +<li>bump <code>gatsby-plugin-offline</code> from 3.2.23 to 3.2.27 in /docs (#1368)</li> +<li>bump <code>gatsby-plugin-sharp</code> from 2.6.25 to 2.6.31 in /docs (#1354)</li> +<li>bump <code>gatsby-plugin-sitemap</code> from 2.4.11 to 2.4.12 in /docs (#1344)</li> +<li>bump <code>gatsby-remark-autolink-headers</code> in /docs (#1387)</li> +<li>bump <code>gatsby-remark-images</code> from 3.3.25 to 3.3.28 in /docs (#1345)</li> +<li>bump <code>gatsby-remark-images</code> from 3.3.28 to 3.3.29 in /docs (#1365)</li> +<li>bump <code>gatsby-remark-mermaid</code> from 2.0.0 to 2.1.0 in /docs (#1369)</li> +<li>bump <code>gatsby-source-filesystem</code> in /docs (#1366)</li> +<li>bump <code>gatsby-source-filesystem</code> in /docs (#1389)</li> +<li>bump <code>gatsby-transformer-sharp</code> in /docs (#1402)</li> +<li>bump <code>gatsby-transformer-yaml</code> from 2.4.10 to 2.4.11 in /docs (#1367)</li> +<li>bump <code>node-fetch</code> in /.github/contributors (#1363)</li> +<li>bump <code>polished</code> from 3.6.5 to 3.6.6 in /docs (#1347)</li> +</ul> +</li> +</ol> +<h2>August 2020<span class="hx:absolute hx:-mt-20" id="august-2020"></span> +<a href="#august-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>new <code>nlreturn</code> linter: <a href="https://github.com/ssgreg/nlreturn"target="_blank" rel="noopener">https://github.com/ssgreg/nlreturn</a></li> +<li>new <code>gci</code> linter: <a href="https://github.com/daixiang0/gci"target="_blank" rel="noopener">https://github.com/daixiang0/gci</a></li> +<li>support <code>latest</code> version of golangci-lint in golangci-lint-action</li> +<li>update <code>gosec</code> linter from 2.3.0 to 2.4.0</li> +<li>update <code>godot</code> linter from 0.4.2 to 0.4.8</li> +<li>update <code>go-critic</code> from 0.5.0 to 0.5.2 (#1307)</li> +<li>update <code>nlreturn</code> from 2.0.1 to 2.0.2 (#1287), 2.0.2 to 2.1.0 (#1327)</li> +<li>update <code>gci</code> to v0.2.1 (#1292), to v0.2.2 (#1305), to v0.2.4 (#1337),</li> +<li>update <code>funlen</code> from 0.0.2 to 0.0.3 (#1341)</li> +<li>upgrade to golang 1.15 for smaller binary (#1303)</li> +<li>support short and json formats for version cmd (#1315)</li> +<li>add home directory to config file search paths (#1325)</li> +<li>allow for serializing multiple golangci-lint invocations (#1302)</li> +</ol> +<h2>July 2020<span class="hx:absolute hx:-mt-20" id="july-2020"></span> +<a href="#july-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li><code>gofumpt</code> linter: +<ul> +<li>update linter</li> +<li>add <code>extra-rules</code> option</li> +<li>support auto-fixing</li> +</ul> +</li> +<li>upgrade <code>exhaustive</code> linter</li> +<li>upgrade <code>exportloopref</code> linter</li> +<li>improve &rsquo;no such linter&rsquo; error message</li> +<li>sorting result.Issues implementation</li> +<li>enhancements in CI: +<ul> +<li>Run <code>nancy</code> validation for all dependencies</li> +<li>Move dependabot config to <code>.github</code> folder</li> +</ul> +</li> +<li>other +<ul> +<li>bump <code>lodash</code> from 4.17.15 to 4.17.19 in /tools</li> +<li>bump <code>golangci/golangci-lint-action</code> from v1.2.2 to v2</li> +<li>bump <code>github.com/valyala/quicktemplate</code> from 1.5.0 to 1.5.1</li> +</ul> +</li> +</ol> +<h2>June 2020<span class="hx:absolute hx:-mt-20" id="june-2020"></span> +<a href="#june-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add new linters: <code>gofumpt</code></li> +</ol> +<h2>May 2020<span class="hx:absolute hx:-mt-20" id="may-2020"></span> +<a href="#may-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add new linters: <code>nolintlint</code>, <code>goerr113</code></li> +<li>Updated linters: <code>godot</code>, <code>staticcheck</code></li> +<li>Launch a <a href="https://golangci-lint.run/"target="_blank" rel="noopener">website</a></li> +</ol> +<h2>April 2020<span class="hx:absolute hx:-mt-20" id="april-2020"></span> +<a href="#april-2020" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add new linters: <code>testpackage</code>, <code>nestif</code>, <code>godot</code>, <code>gomodguard</code>, <code>asciicheck</code></li> +<li>Add GitHub Actions output format</li> +<li>Update linters: <code>wsl</code>, <code>gomodguard</code>, <code>gosec</code></li> +<li>Support <code>disabled-tags</code> setting for <code>gocritic</code></li> +<li>Mitigate OOM and &ldquo;failed prerequisites&rdquo;</li> +<li>Self-isolate due to unexpected pandemics</li> +<li>Support case-sensitive excludes</li> +<li>Allow granular re-enabling excludes by ID, e.g. <code>EXC0002</code></li> +</ol> +<h2>September 2019<span class="hx:absolute hx:-mt-20" id="september-2019"></span> +<a href="#september-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Support go1.13</li> +<li>Add new linters: <code>funlen</code>, <code>whitespace</code> (with auto-fix) and <code>godox</code></li> +<li>Update linters: <code>gochecknoglobals</code>, <code>scopelint</code>, <code>gosec</code></li> +<li>Provide pre-built binary for ARM and FreeBSD</li> +<li>Fix false-positives in <code>unused</code></li> +<li>Support <code>--skip-dirs-use-default</code></li> +<li>Add support for bash completions</li> +</ol> +<h2>July 2019<span class="hx:absolute hx:-mt-20" id="july-2019"></span> +<a href="#july-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Fix parallel writes race condition</li> +<li>Update bodyclose with fixed panic</li> +</ol> +<h2>June 2019<span class="hx:absolute hx:-mt-20" id="june-2019"></span> +<a href="#june-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Treat Go source files as a plain text by <code>misspell</code>: it allows detecting issues in strings, variable names, etc.</li> +<li>Implement richer and more stable auto-fix of <code>misspell</code> issues.</li> +</ol> +<h2>May 2019<span class="hx:absolute hx:-mt-20" id="may-2019"></span> +<a href="#may-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Add <a href="https://github.com/timakin/bodyclose"target="_blank" rel="noopener">bodyclose</a> linter.</li> +<li>Support junit-xml output.</li> +</ol> +<h2>April 2019<span class="hx:absolute hx:-mt-20" id="april-2019"></span> +<a href="#april-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Update go-critic, new checkers were added: badCall, dupImports, evalOrder, newDeref</li> +<li>Fix staticcheck panic on packages that do not compile</li> +<li>Make install script work on Windows</li> +<li>Fix compatibility with the latest x/tools version and update golang.org/x/tools</li> +<li>Correct import path of module sourcegraph/go-diff</li> +<li>Fix <code>max-issues-per-linter</code> name</li> +<li>Fix linting of preprocessed files (e.g. <code>*.qtpl.go</code>, goyacc)</li> +<li>Enable auto-fixing when running via pre-commit</li> +</ol> +<h2>March 2019<span class="hx:absolute hx:-mt-20" id="march-2019"></span> +<a href="#march-2019" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Support the newest <code>go vet</code> (with <code>go/analysis</code>)</li> +<li>Support configuration of <code>go vet</code>: e.g. you can set print functions by <code>linters-settings.govet.settings.printf.funcs</code></li> +<li>Update megacheck (staticcheck) to 2019.1.1</li> +<li>Add <a href="https://github.com/golangci/golangci-lint#memory-usage-of-golangci-lint"target="_blank" rel="noopener">information</a> about controlling space-time trade-off into README</li> +<li>Exclude issues by source code line regexp by <code>issues.exclude-rules[i].source</code></li> +<li>Build and test on go 1.12</li> +<li>Support <code>--color</code> option</li> +<li>Update x/tools to fix c++ issues</li> +<li>Include support for log level</li> +<li>Sort linters list in help commands</li> +</ol>Migration guidehttps://golangci-lint.run/docs/product/migration-guide/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/migration-guide/ +<h2>Command <code>migrate</code><span class="hx:absolute hx:-mt-20" id="command-migrate"></span> +<a href="#command-migrate" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>You can use golangci-lint to migrate your configuration with the <code>migrate</code> command:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint migrate</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Be aware that <strong>comments inside a configuration file are not migrated.</strong> You need to add them manually after the migration.</p> +<p><strong>Deprecated options from v1 or unknown fields are not migrated.</strong></p> +<p>The migration file format is based on the extension of the <a href="https://golangci-lint.run/docs/configuration/file/">configuration file</a>. +The format can be overridden by using the <code>--format</code> flag:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint migrate --format json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Before the migration, the previous configuration file is copied and saved to a file named <code>&lt;config_file_name&gt;.bck.&lt;config_file_extension&gt;</code>.</p> +<p>By default, before the migration process, the configuration file is validated against the JSON Schema of configuration v1. +If you want to skip this validation, you can use the <code>--skip-validation</code> flag:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint migrate --skip-validation</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The <code>migrate</code> command enforces the following default values:</p> +<ul> +<li><code>run.timeout</code>: the existing value is ignored because, in v2, there is no timeout by default.</li> +<li><code>issues.show-stats</code>: the existing value is ignored because, in v2, stats are enabled by default.</li> +<li><code>run.concurrency</code>: if the existing value was <code>0</code>, it is removed as <code>0</code> is the new default.</li> +<li><code>run.relative-path-mode</code>: if the existing value was <code>cfg</code>, it is removed as <code>cfg</code> is the new default.</li> +</ul> +<p><code>issues.exclude-generated</code> has a new default value (v1 <code>lax</code>, v2 <code>strict</code>), so this field will be added during the migration to maintain the previous behavior.</p> +<p><code>issues.exclude-dirs-use-default</code> has been removed, so it is converted to <code>linters.exclusions.paths</code> and, if needed, <code>formatters.exclusions.paths</code>.</p> +<p>Other fields explicitly defined in the configuration file are migrated even if the value is the same as the default value.</p> +<p>The <code>migrate</code> command automatically migrates <code>linters.presets</code> in individual linters to <code>linters.enable</code>.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint migrate -h +</span></span><span class="line"><span class="cl"><span class="go">Migrate configuration file from v1 to v2. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Usage: +</span></span></span><span class="line"><span class="cl"><span class="go"> golangci-lint migrate [flags] +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> -c, --config PATH Read config from file path PATH +</span></span></span><span class="line"><span class="cl"><span class="go"> --no-config Don&#39;t read config file +</span></span></span><span class="line"><span class="cl"><span class="go"> --format string Output file format. +</span></span></span><span class="line"><span class="cl"><span class="go"> By default, the format of the input configuration file is used. +</span></span></span><span class="line"><span class="cl"><span class="go"> It can be &#39;yml&#39;, &#39;yaml&#39;, &#39;toml&#39;, or &#39;json&#39;. +</span></span></span><span class="line"><span class="cl"><span class="go"> --skip-validation Skip validation of the configuration file against the JSON Schema for v1. +</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err"> +</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">Global Flags: +</span></span></span><span class="line"><span class="cl"><span class="go"> --color string Use color when printing; can be &#39;always&#39;, &#39;auto&#39;, or &#39;never&#39; (default &#34;auto&#34;) +</span></span></span><span class="line"><span class="cl"><span class="go"> -h, --help Help for a command +</span></span></span><span class="line"><span class="cl"><span class="go"> -v, --verbose Verbose output +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h2>Changes<span class="hx:absolute hx:-mt-20" id="changes"></span> +<a href="#changes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3><code>linters</code><span class="hx:absolute hx:-mt-20" id="linters"></span> +<a href="#linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>linters.disable-all</code><span class="hx:absolute hx:-mt-20" id="lintersdisable-all"></span> +<a href="#lintersdisable-all" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.default: none</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">disable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">none</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.enable-all</code><span class="hx:absolute hx:-mt-20" id="lintersenable-all"></span> +<a href="#lintersenable-all" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.default: all</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">all</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.enable[].&lt;formatter_name&gt;</code><span class="hx:absolute hx:-mt-20" id="lintersenableformatter_name"></span> +<a href="#lintersenableformatter_name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The linters <code>gci</code>, <code>gofmt</code>, <code>gofumpt</code>, and <code>goimports</code> have been moved to the <code>formatters</code> section.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gci</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofumpt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goimports</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gci</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofmt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gofumpt</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goimports</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.enable[].{stylecheck,gosimple,staticcheck}</code><span class="hx:absolute hx:-mt-20" id="lintersenablestylecheckgosimplestaticcheck"></span> +<a href="#lintersenablestylecheckgosimplestaticcheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The linters <code>stylecheck</code>, <code>gosimple</code>, and <code>staticcheck</code> has been merged inside the <code>staticcheck</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosimple</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">stylecheck</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters.fast</code><span class="hx:absolute hx:-mt-20" id="lintersfast"></span> +<a href="#lintersfast" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>There are 2 new options (they are not strictly equivalent to the previous option):</p> +<ol> +<li><code>linters.default: fast</code>: set all &ldquo;fast&rdquo; linters as the default set of linters. +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">fast</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</li> +<li><code>--fast-only</code>: filters all enabled linters to keep only &ldquo;fast&rdquo; linters.</li> +</ol> +<h4><code>linters.presets</code><span class="hx:absolute hx:-mt-20" id="linterspresets"></span> +<a href="#linterspresets" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>The <code>migrate</code> command automatically migrates <code>linters.presets</code> in individual linters to <code>linters.enable</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><p>Presets:</p> +<table> +<thead> +<tr> +<th>name</th> +<th>linters</th> +</tr> +</thead> +<tbody> +<tr> +<td>bugs</td> +<td><code>asasalint</code>, <code>asciicheck</code>, <code>bidichk</code>, <code>bodyclose</code>, <code>contextcheck</code>, <code>durationcheck</code>, <code>errcheck</code>, <code>errchkjson</code>, <code>errorlint</code>, <code>exhaustive</code>, <code>gocheckcompilerdirectives</code>, <code>gochecksumtype</code>, <code>gosec</code>, <code>gosmopolitan</code>, <code>govet</code>, <code>loggercheck</code>, <code>makezero</code>, <code>musttag</code>, <code>nilerr</code>, <code>nilnesserr</code>, <code>noctx</code>, <code>protogetter</code>, <code>reassign</code>, <code>recvcheck</code>, <code>rowserrcheck</code>, <code>spancheck</code>, <code>sqlclosecheck</code>, <code>staticcheck</code>, <code>testifylint</code>, <code>zerologlint</code></td> +</tr> +<tr> +<td>comment</td> +<td><code>dupword</code>, <code>godot</code>, <code>godox</code>, <code>misspell</code></td> +</tr> +<tr> +<td>complexity</td> +<td><code>cyclop</code>, <code>funlen</code>, <code>gocognit</code>, <code>gocyclo</code>, <code>maintidx</code>, <code>nestif</code></td> +</tr> +<tr> +<td>error</td> +<td><code>err113</code>, <code>errcheck</code>, <code>errorlint</code>, <code>wrapcheck</code></td> +</tr> +<tr> +<td>format</td> +<td><code>gci</code>, <code>gofmt</code>, <code>gofumpt</code>, <code>goimports</code></td> +</tr> +<tr> +<td>import</td> +<td><code>depguard</code>, <code>gci</code>, <code>goimports</code>, <code>gomodguard</code></td> +</tr> +<tr> +<td>metalinter</td> +<td><code>gocritic</code>, <code>govet</code>, <code>revive</code>, <code>staticcheck</code></td> +</tr> +<tr> +<td>module</td> +<td><code>depguard</code>, <code>gomoddirectives</code>, <code>gomodguard</code></td> +</tr> +<tr> +<td>performance</td> +<td><code>bodyclose</code>, <code>fatcontext</code>, <code>noctx</code>, <code>perfsprint</code>, <code>prealloc</code></td> +</tr> +<tr> +<td>sql</td> +<td><code>rowserrcheck</code>, <code>sqlclosecheck</code></td> +</tr> +<tr> +<td>style</td> +<td><code>asciicheck</code>, <code>canonicalheader</code>, <code>containedctx</code>, <code>copyloopvar</code>, <code>decorder</code>, <code>depguard</code>, <code>dogsled</code>, <code>dupl</code>, <code>err113</code>, <code>errname</code>, <code>exhaustruct</code>, <code>exptostd</code>, <code>forbidigo</code>, <code>forcetypeassert</code>, <code>ginkgolinter</code>, <code>gochecknoglobals</code>, <code>gochecknoinits</code>, <code>goconst</code>, <code>gocritic</code>, <code>godot</code>, <code>godox</code>, <code>goheader</code>, <code>gomoddirectives</code>, <code>gomodguard</code>, <code>goprintffuncname</code>, <code>gosimple</code>, <code>grouper</code>, <code>iface</code>, <code>importas</code>, <code>inamedparam</code>, <code>interfacebloat</code>, <code>intrange</code>, <code>ireturn</code>, <code>lll</code>, <code>loggercheck</code>, <code>makezero</code>, <code>mirror</code>, <code>misspell</code>, <code>mnd</code>, <code>musttag</code>, <code>nakedret</code>, <code>nilnil</code>, <code>nlreturn</code>, <code>nolintlint</code>, <code>nonamedreturns</code>, <code>nosprintfhostport</code>, <code>paralleltest</code>, <code>predeclared</code>, <code>promlinter</code>, <code>revive</code>, <code>sloglint</code>, <code>stylecheck</code>, <code>tagalign</code>, <code>tagliatelle</code>, <code>testpackage</code>, <code>tparallel</code>, <code>unconvert</code>, <code>usestdlibvars</code>, <code>varnamelen</code>, <code>wastedassign</code>, <code>whitespace</code>, <code>wrapcheck</code>, <code>wsl</code></td> +</tr> +<tr> +<td>test</td> +<td><code>exhaustruct</code>, <code>paralleltest</code>, <code>testableexamples</code>, <code>testifylint</code>, <code>testpackage</code>, <code>thelper</code>, <code>tparallel</code>, <code>usetesting</code></td> +</tr> +<tr> +<td>unused</td> +<td><code>ineffassign</code>, <code>unparam</code>, <code>unused</code></td> +</tr> +</tbody> +</table></div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>typecheck</code><span class="hx:absolute hx:-mt-20" id="typecheck"></span> +<a href="#typecheck" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This <code>typecheck</code> is not a linter, so it cannot be enabled or disabled:</p> +<ul> +<li><a href="https://golangci-lint.run/docs/welcome/faq/#why-do-you-have-typecheck-errors">FAQ: Why do you have typecheck errors?</a></li> +<li><a href="https://golangci-lint.run/docs/welcome/faq/#why-is-it-not-possible-to-skipignore-typecheck-errors">FAQ: Why is it not possible to skip/ignore typecheck errors?</a></li> +</ul> +<h4>Deprecated Linters<span class="hx:absolute hx:-mt-20" id="deprecated-linters"></span> +<a href="#deprecated-linters" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The following deprecated linters have been removed:</p> +<ul> +<li><code>deadcode</code></li> +<li><code>execinquery</code></li> +<li><code>exhaustivestruct</code></li> +<li><code>exportloopref</code></li> +<li><code>golint</code></li> +<li><code>ifshort</code></li> +<li><code>interfacer</code></li> +<li><code>maligned</code></li> +<li><code>nosnakecase</code></li> +<li><code>scopelint</code></li> +<li><code>structcheck</code></li> +<li><code>tenv</code></li> +<li><code>varcheck</code></li> +</ul> +<h4>Alternative Linter Names<span class="hx:absolute hx:-mt-20" id="alternative-linter-names"></span> +<a href="#alternative-linter-names" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The alternative linters has been removed.</p> +<table> +<thead> +<tr> +<th>Alt Name v1</th> +<th>Name v2</th> +</tr> +</thead> +<tbody> +<tr> +<td><code>gas</code></td> +<td><code>gosec</code></td> +</tr> +<tr> +<td><code>goerr113</code></td> +<td><code>err113</code></td> +</tr> +<tr> +<td><code>gomnd</code></td> +<td><code>mnd</code></td> +</tr> +<tr> +<td><code>logrlint</code></td> +<td><code>loggercheck</code></td> +</tr> +<tr> +<td><code>megacheck</code></td> +<td><code>staticcheck</code></td> +</tr> +<tr> +<td><code>vet</code></td> +<td><code>govet</code></td> +</tr> +<tr> +<td><code>vetshadow</code></td> +<td><code>govet</code></td> +</tr> +</tbody> +</table> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gas</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goerr113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gomnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">logrlint</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">megacheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">vet</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">vetshadow</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">mnd</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">loggercheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">govet</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>linters-settings</code><span class="hx:absolute hx:-mt-20" id="linters-settings"></span> +<a href="#linters-settings" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The <code>linters-settings</code> section has been split into <code>linters.settings</code> and <code>formatters.settings</code>.</p> +<p>Settings for <code>gci</code>, <code>gofmt</code>, <code>gofumpt</code>, and <code>goimports</code> are moved to the <code>formatters.settings</code> section.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simplify</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable-all</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">formatters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gofmt</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">simplify</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.asasalint.ignore-test</code><span class="hx:absolute hx:-mt-20" id="linters-settingsasasalintignore-test"></span> +<a href="#linters-settingsasasalintignore-test" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To ignore test files, use <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">asasalint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-test</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">asasalint</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.copyloopvar.ignore-alias</code><span class="hx:absolute hx:-mt-20" id="linters-settingscopyloopvarignore-alias"></span> +<a href="#linters-settingscopyloopvarignore-alias" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.58.0 and has been replaced with <code>linters.settings.copyloopvar.check-alias</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">copyloopvar</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-alias</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">copyloopvar</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-alias</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.cyclop.skip-tests</code><span class="hx:absolute hx:-mt-20" id="linters-settingscyclopskip-tests"></span> +<a href="#linters-settingscyclopskip-tests" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To ignore test files, use <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">cyclop</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-test</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">cyclop</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.errcheck.exclude</code><span class="hx:absolute hx:-mt-20" id="linters-settingserrcheckexclude"></span> +<a href="#linters-settingserrcheckexclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.42.0 and has been removed.</p> +<p>To exclude functions, use <code>linters.settings.errcheck.exclude-functions</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> </span><span class="l">./errcheck_excludes.txt</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.ReadFile</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(*bytes.Buffer)</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">io.Copy(os.Stdout)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.errcheck.ignore</code><span class="hx:absolute hx:-mt-20" id="linters-settingserrcheckignore"></span> +<a href="#linters-settingserrcheckignore" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.13.0 and has been removed.</p> +<p>To exclude functions, use <code>linters.settings.errcheck.exclude-functions</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;io:.*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">errcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-functions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;io.ReadFile&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;io.Copy(*bytes.Buffer)&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;io.Copy(os.Stdout)&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.exhaustive.check-generated</code><span class="hx:absolute hx:-mt-20" id="linters-settingsexhaustivecheck-generated"></span> +<a href="#linters-settingsexhaustivecheck-generated" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To analyze generated files, use <code>linters.exclusions.generated</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exhaustive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-generated</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">disable</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.forbidigo.forbid[].p</code><span class="hx:absolute hx:-mt-20" id="linters-settingsforbidigoforbidp"></span> +<a href="#linters-settingsforbidigoforbidp" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This field has been replaced with <code>linters-settings.forbidigo.forbid[].pattern</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">p</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^fmt\.Print.*$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="l">Do not commit print statements.</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^fmt\.Print.*$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="l">Do not commit print statements.</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.forbidigo.forbid[]&lt;pattern&gt;</code><span class="hx:absolute hx:-mt-20" id="linters-settingsforbidigoforbidpattern"></span> +<a href="#linters-settingsforbidigoforbidpattern" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The <code>pattern</code> has become mandatory for the <code>forbid</code> field.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^print(ln)?$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^spew\.(ConfigState\.)?Dump$&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbidigo</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">forbid</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^print(ln)?$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^spew\.(ConfigState\.)?Dump$&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.gci.local-prefixes</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgcilocal-prefixes"></span> +<a href="#linters-settingsgcilocal-prefixes" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.44.0 and has been removed.</p> +<p>Use <code>linters.settings.gci.sections</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">local-prefixes</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;github.com/example/pkg&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sections</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">standard</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">default</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">prefix(github.com/example/pkg)</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.gci.skip-generated</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgciskip-generated"></span> +<a href="#linters-settingsgciskip-generated" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To analyze generated files, use <code>linters.exclusions.generated</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gci</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-generated</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">disable</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.goconst.ignore-tests</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgoconstignore-tests"></span> +<a href="#linters-settingsgoconstignore-tests" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>To ignore test files, use <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">goconst</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-tests</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">goconst</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.gocritic.settings.ruleguard.rules</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgocriticsettingsruleguardrules"></span> +<a href="#linters-settingsgocriticsettingsruleguardrules" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The special variable <code>${configDir}</code> has been replaced with <code>${base-path}</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocritic</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ruleguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;${configDir}/ruleguard/rules-*.go&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">gocritic</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ruleguard</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;${base-path}/ruleguard/rules-*.go&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.govet.check-shadowing</code><span class="hx:absolute hx:-mt-20" id="linters-settingsgovetcheck-shadowing"></span> +<a href="#linters-settingsgovetcheck-shadowing" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.57.0 and has been removed.</p> +<p>Use <code>linters.settings.govet.enable: shadow</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">check-shadowing</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">govet</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">shadow</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.misspell.ignore-words</code><span class="hx:absolute hx:-mt-20" id="linters-settingsmisspellignore-words"></span> +<a href="#linters-settingsmisspellignore-words" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been replaced with <code>linters.settings.misspell.ignore-rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">misspell</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-words</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">misspell</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.predeclared.ignore</code><span class="hx:absolute hx:-mt-20" id="linters-settingspredeclaredignore"></span> +<a href="#linters-settingspredeclaredignore" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This string option has been replaced with the slice option with the same name.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;new,int&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">new</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">int</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.predeclared.q</code><span class="hx:absolute hx:-mt-20" id="linters-settingspredeclaredq"></span> +<a href="#linters-settingspredeclaredq" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been replaced with <code>linters.settings.predeclared.qualified-name</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">q</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">predeclared</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">qualified-name</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.revive.ignore-generated-header</code><span class="hx:absolute hx:-mt-20" id="linters-settingsreviveignore-generated-header"></span> +<a href="#linters-settingsreviveignore-generated-header" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been removed.</p> +<p>Use <code>linters.exclusions.generated</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">revive</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-generated-header</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">strict</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.sloglint.context-only</code><span class="hx:absolute hx:-mt-20" id="linters-settingssloglintcontext-only"></span> +<a href="#linters-settingssloglintcontext-only" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.58.0 and has been replaced with <code>linters.settings.sloglint.context</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sloglint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context-only</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sloglint</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">context</span><span class="p">:</span><span class="w"> </span><span class="l">all</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.staticcheck.go</code><span class="hx:absolute hx:-mt-20" id="linters-settingsstaticcheckgo"></span> +<a href="#linters-settingsstaticcheckgo" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.47.0 and has been removed.</p> +<p>Use <code>run.go</code> instead.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">staticcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1.22&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">go</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1.22&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.unused.exported-is-used</code><span class="hx:absolute hx:-mt-20" id="linters-settingsunusedexported-is-used"></span> +<a href="#linters-settingsunusedexported-is-used" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.60.0 and has been removed.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">unused</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exported-is-used</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.usestdlibvars.os-dev-null</code><span class="hx:absolute hx:-mt-20" id="linters-settingsusestdlibvarsos-dev-null"></span> +<a href="#linters-settingsusestdlibvarsos-dev-null" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.51.0 and has been removed.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usestdlibvars</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">os-dev-null</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.usestdlibvars.syslog-priority</code><span class="hx:absolute hx:-mt-20" id="linters-settingsusestdlibvarssyslog-priority"></span> +<a href="#linters-settingsusestdlibvarssyslog-priority" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been deprecated since v1.51.0 and has been removed.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">usestdlibvars</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">syslog-priority</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Removed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignoreInterfaceRegexps</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignoreinterfaceregexps"></span> +<a href="#linters-settingswrapcheckignoreinterfaceregexps" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-interface-regexps</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignoreInterfaceRegexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^(?i)c(?-i)ach(ing|e)&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-interface-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;^(?i)c(?-i)ach(ing|e)&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignorePackageGlobs</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignorepackageglobs"></span> +<a href="#linters-settingswrapcheckignorepackageglobs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-package-globs</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignorePackageGlobs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;encoding/*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-package-globs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;encoding/*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignoreSigRegexps</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignoresigregexps"></span> +<a href="#linters-settingswrapcheckignoresigregexps" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-sig-regexps</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignoreSigRegexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;\.New.*Error\(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sig-regexps</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;\.New.*Error\(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>linters-settings.wrapcheck.ignoreSigs</code><span class="hx:absolute hx:-mt-20" id="linters-settingswrapcheckignoresigs"></span> +<a href="#linters-settingswrapcheckignoresigs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This option has been renamed to <code>linters.settings.wrapcheck.ignore-sigs</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters-settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignoreSigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.Errorf(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">settings</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">wrapcheck</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">ignore-sigs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.Errorf(&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>issues</code><span class="hx:absolute hx:-mt-20" id="issues"></span> +<a href="#issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>issues.exclude-case-sensitive</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-case-sensitive"></span> +<a href="#issuesexclude-case-sensitive" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p><code>issues.exclude</code>, <code>issues.exclude-rules.text</code>, and <code>issues.exclude-rules.source</code> are case-sensitive by default.</p> +<p>To ignore case, use <code>(?i)</code> at the beginning of a regex syntax.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-case-sensitive</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;abcdef&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="l">(?i)abcdef</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-dirs-use-default</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-dirs-use-default"></span> +<a href="#issuesexclude-dirs-use-default" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>Use <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code> to exclude directories.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-dirs-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">third_party$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">builtin$</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">examples$</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-dirs</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-dirs"></span> +<a href="#issuesexclude-dirs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-dirs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-files</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-files"></span> +<a href="#issuesexclude-files" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-generated-strict</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-generated-strict"></span> +<a href="#issuesexclude-generated-strict" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.59.0 and has been replaced with <code>linters.exclusions.generated: strict</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-generated-strict</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">strict</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-generated</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-generated"></span> +<a href="#issuesexclude-generated" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.generated</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-generated</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">generated</span><span class="p">:</span><span class="w"> </span><span class="l">lax</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-rules</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-rules"></span> +<a href="#issuesexclude-rules" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">internal/hmac/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;weak cryptographic primitive&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;SA9003:&#34;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;foo&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">dupl</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">errcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gocyclo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path-except</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;_test\.go&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">internal/hmac/</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="l">weak cryptographic primitive</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">gosec</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;SA9003:&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">staticcheck</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">err113</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude-use-default</code><span class="hx:absolute hx:-mt-20" id="issuesexclude-use-default"></span> +<a href="#issuesexclude-use-default" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.presets</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">comments</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.exclude</code><span class="hx:absolute hx:-mt-20" id="issuesexclude"></span> +<a href="#issuesexclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.rules</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">abcdef</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(.+)\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="l">abcdef</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>issues.include</code><span class="hx:absolute hx:-mt-20" id="issuesinclude"></span> +<a href="#issuesinclude" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>linters.exclusions.presets</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">EXC0014</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">EXC0015</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">presets</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">common-false-positives</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">legacy</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">std-error-handling</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>output</code><span class="hx:absolute hx:-mt-20" id="output"></span> +<a href="#output" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>output.format</code><span class="hx:absolute hx:-mt-20" id="outputformat"></span> +<a href="#outputformat" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been replaced with <code>output.formats</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;checkstyle:report.xml,json:stdout,colored-line-number&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkstyle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;report.xml&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">color</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: &lt;name&gt;</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-name"></span> +<a href="#outputformatsformat-name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The property <code>output.formats[].format</code> has been replaced with <code>output.formats[].&lt;format_name&gt;</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">json</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stderr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">checkstyle</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">report.xml</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stderr</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkstyle</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">report.xml</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: line-number</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-line-number"></span> +<a href="#outputformatsformat-line-number" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This format has been replaced by the format <code>text</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">line-number</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: colored-line-number</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-colored-line-number"></span> +<a href="#outputformatsformat-colored-line-number" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This format has been replaced by the format <code>text</code> with the option <code>colors</code> (<code>true</code> by default).</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">colored-line-number</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.formats[].format: colored-tab</code><span class="hx:absolute hx:-mt-20" id="outputformatsformat-colored-tab"></span> +<a href="#outputformatsformat-colored-tab" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This format has been replaced by the format <code>tab</code> with the option <code>colors</code> (<code>true</code> by default).</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">colored-tab</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">tab</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">colors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.print-issued-lines</code><span class="hx:absolute hx:-mt-20" id="outputprint-issued-lines"></span> +<a href="#outputprint-issued-lines" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>To not print the lines with issues, use the <code>text</code> format with the option <code>print-issued-lines: false</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">line-number</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-issued-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-issued-lines</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.print-linter-name</code><span class="hx:absolute hx:-mt-20" id="outputprint-linter-name"></span> +<a href="#outputprint-linter-name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been removed.</p> +<p>To not print the linter name, use the <code>text</code> format with the option <code>print-linter-name: false</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">format</span><span class="p">:</span><span class="w"> </span><span class="l">line-number</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">formats</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">stdout</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">print-linter-name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>output.show-stats</code><span class="hx:absolute hx:-mt-20" id="outputshow-stats"></span> +<a href="#outputshow-stats" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property is <code>true</code> by default.</p> +<h4><code>output.sort-order</code><span class="hx:absolute hx:-mt-20" id="outputsort-order"></span> +<a href="#outputsort-order" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has a new default value <code>['linter', 'file']</code> instead of <code>['file']</code>.</p> +<h4><code>output.sort-results</code><span class="hx:absolute hx:-mt-20" id="outputsort-results"></span> +<a href="#outputsort-results" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The property has been removed.</p> +<p>The output results are always sorted.</p> +<h4><code>output.uniq-by-line</code><span class="hx:absolute hx:-mt-20" id="outputuniq-by-line"></span> +<a href="#outputuniq-by-line" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.63.0 and has been replaced by <code>issues.uniq-by-line</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uniq-by-line</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">uniq-by-line</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>run</code><span class="hx:absolute hx:-mt-20" id="run"></span> +<a href="#run" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>run.go</code><span class="hx:absolute hx:-mt-20" id="rungo"></span> +<a href="#rungo" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>The new fallback value for this property is <code>1.22</code> instead of <code>1.17</code>.</p> +<h4><code>run.concurrency</code><span class="hx:absolute hx:-mt-20" id="runconcurrency"></span> +<a href="#runconcurrency" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property value set to match Linux container CPU quota by default and fallback on the number of logical CPUs in the machine.</p> +<h4><code>run.relative-path-mode</code><span class="hx:absolute hx:-mt-20" id="runrelative-path-mode"></span> +<a href="#runrelative-path-mode" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has a new default value of <code>cfg</code> instead of <code>wd</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># When not specified, relative-path-mode is set to &#39;wd&#39; by default</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">relative-path-mode</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;cfg&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.show-stats</code><span class="hx:absolute hx:-mt-20" id="runshow-stats"></span> +<a href="#runshow-stats" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been replaced by <code>output.show-stats</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-stats</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">output</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">show-stats</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.skip-dirs-use-default</code><span class="hx:absolute hx:-mt-20" id="runskip-dirs-use-default"></span> +<a href="#runskip-dirs-use-default" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been replaced by <code>issues.exclude-dirs-use-default</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-dirs-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">issues</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclude-dirs-use-default</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.skip-dirs</code><span class="hx:absolute hx:-mt-20" id="runskip-dirs"></span> +<a href="#runskip-dirs" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been removed.</p> +<p>Use <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code> to exclude directories.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-dirs</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">src/external_libs</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">autogenerated_by_my_lib</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.skip-files</code><span class="hx:absolute hx:-mt-20" id="runskip-files"></span> +<a href="#runskip-files" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been deprecated since v1.57.0 and has been removed.</p> +<p>Use <code>linters.exclusions.paths</code> and <code>formatters.exclusions.paths</code> to exclude files.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">run</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">skip-files</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">exclusions</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">paths</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;.*\.my\.go$&#39;</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">lib/bad.go</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>run.timeout</code><span class="hx:absolute hx:-mt-20" id="runtimeout"></span> +<a href="#runtimeout" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property value is disabled by default (<code>0</code>).</p> +<h3><code>severity</code><span class="hx:absolute hx:-mt-20" id="severity"></span> +<a href="#severity" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4><code>severity.default-severity</code><span class="hx:absolute hx:-mt-20" id="severitydefault-severity"></span> +<a href="#severitydefault-severity" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>This property has been replaced with <code>severity.default</code>.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default-severity</span><span class="p">:</span><span class="w"> </span><span class="l">error</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="l">error</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h4><code>severity.rules.case-sensitive</code><span class="hx:absolute hx:-mt-20" id="severityrulescase-sensitive"></span> +<a href="#severityrulescase-sensitive" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>severity.rules.text</code> and <code>severity.rules.source</code> are case-sensitive by default.</p> +<p>To ignore case, use <code>(?i)</code> at the beginning of a regex syntax.</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">case-sensitive</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Example.*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">severity</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linters</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">foo</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;(?i)Example.*&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3><code>version</code><span class="hx:absolute hx:-mt-20" id="version"></span> +<a href="#version" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The <code>version</code> property has been added to the configuration file.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Integration<span class="hx:absolute hx:-mt-20" id="integration"></span> +<a href="#integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4>Visual Studio Code<span class="hx:absolute hx:-mt-20" id="visual-studio-code"></span> +<a href="#visual-studio-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast-only&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">],</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatTool&#34;</span><span class="p">:</span> <span class="s2">&#34;custom&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.alternateTools&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;customFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">},</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;fmt&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--stdin&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<h3>Command Line Flags<span class="hx:absolute hx:-mt-20" id="command-line-flags"></span> +<a href="#command-line-flags" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The following flags have been removed:</p> +<ul> +<li><code>--disable-all</code></li> +<li><code>--enable-all</code></li> +<li><code>-p, --presets</code></li> +<li><code>--fast</code></li> +<li><code>-e, --exclude</code></li> +<li><code>--exclude-case-sensitive</code></li> +<li><code>--exclude-dirs-use-default</code></li> +<li><code>--exclude-dirs</code></li> +<li><code>--exclude-files</code></li> +<li><code>--exclude-generated</code></li> +<li><code>--exclude-use-default</code></li> +<li><code>--go string</code></li> +<li><code>--sort-order</code></li> +<li><code>--sort-results</code></li> +<li><code>--out-format</code></li> +<li><code>--print-issued-lines</code></li> +<li><code>--print-linter-name</code></li> +</ul> +<h4><code>--out-format</code><span class="hx:absolute hx:-mt-20" id="--out-format"></span> +<a href="#--out-format" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--out-format</code> has been replaced with the following flags:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;colored-line-number&#39; and &#39;line-number&#39;</span> +</span></span><span class="line"><span class="cl">--output.text.path +</span></span><span class="line"><span class="cl">--output.text.print-linter-name +</span></span><span class="line"><span class="cl">--output.text.print-issued-lines +</span></span><span class="line"><span class="cl">--output.text.colors</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;json&#39;</span> +</span></span><span class="line"><span class="cl">--output.json.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;colored-tab&#39; and &#39;tab&#39;</span> +</span></span><span class="line"><span class="cl">--output.tab.path +</span></span><span class="line"><span class="cl">--output.tab.print-linter-name +</span></span><span class="line"><span class="cl">--output.tab.colors</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;html&#39;</span> +</span></span><span class="line"><span class="cl">--output.html.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;checkstyle&#39;</span> +</span></span><span class="line"><span class="cl">--output.checkstyle.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;code-climate&#39;</span> +</span></span><span class="line"><span class="cl">--output.code-climate.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;junit-xml&#39; and &#39;junit-xml-extended&#39;</span> +</span></span><span class="line"><span class="cl">--output.junit-xml.path +</span></span><span class="line"><span class="cl">--output.junit-xml.extended</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;teamcity&#39;</span> +</span></span><span class="line"><span class="cl">--output.teamcity.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Previously &#39;sarif&#39;</span> +</span></span><span class="line"><span class="cl">--output.sarif.path</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h4><code>--print-issued-lines</code><span class="hx:absolute hx:-mt-20" id="--print-issued-lines"></span> +<a href="#--print-issued-lines" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--print-issued-lines</code> has been replaced with <code>--output.text.print-issued-lines</code>.</p> +<h4><code>--print-linter-name</code><span class="hx:absolute hx:-mt-20" id="--print-linter-name"></span> +<a href="#--print-linter-name" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--print-linter-name</code> has been replaced with <code>--output.text.print-linter-name</code> or <code>--output.tab.print-linter-name</code>.</p> +<h4><code>--disable-all</code> and <code>--enable-all</code><span class="hx:absolute hx:-mt-20" id="--disable-all-and---enable-all"></span> +<a href="#--disable-all-and---enable-all" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p><code>--disable-all</code> has been replaced with <code>--default=none</code>.</p> +<p><code>--enable-all</code> has been replaced with <code>--default=all</code>.</p> +<h4>Examples<span class="hx:absolute hx:-mt-20" id="examples"></span> +<a href="#examples" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Run only the <code>govet</code> linter, output results to stdout in JSON format, and sort results:</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --disable-all --enable<span class="o">=</span>govet --out-format<span class="o">=</span>json --sort-order<span class="o">=</span>linter --sort-results</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --default<span class="o">=</span>none --enable<span class="o">=</span>govet --output.json.path<span class="o">=</span>stdout</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div> +<p>Do not print issued lines, output results to stdout without colors in text format, and to <code>gl-code-quality-report.json</code> file in Code Climate&rsquo;s format:</p> +<div class="hextra-scrollbar hx:overflow-x-auto hx:overflow-y-hidden hx:overscroll-x-contain"> +<div class="hx:mt-4 hx:flex hx:w-max hx:min-w-full hx:border-b hx:border-gray-200 hx:pb-px hx:dark:border-neutral-800"><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-0" aria-selected="true" tabindex="0" data-state="selected">v1</button><button +class="hextra-tabs-toggle hx:cursor-pointer hx:data-[state=selected]:border-primary-500 hx:data-[state=selected]:text-primary-600 hx:data-[state=selected]:dark:border-primary-500 hx:data-[state=selected]:dark:text-primary-600 hx:mr-2 hx:rounded-t hx:p-2 hx:font-medium hx:leading-5 hx:transition-colors hx:-mb-0.5 hx:select-none hx:border-b-2 hx:border-transparent hx:text-gray-600 hx:hover:border-gray-200 hx:hover:text-black hx:dark:text-gray-200 hx:dark:hover:border-neutral-800 hx:dark:hover:text-white" +role="tab" +type="button" +aria-controls="tabs-panel-1">v2</button></div> +</div> +<div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-0" +role="tabpanel" tabindex="0" data-state="selected" ><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --print-issued-lines<span class="o">=</span><span class="nb">false</span> --out-format code-climate:gl-code-quality-report.json,line-number</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +<div +class="hextra-tabs-panel hx:rounded-sm hx:pt-6 hx:hidden hx:data-[state=selected]:block" +id="tabs-panel-1" +role="tabpanel"><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --output.text.path<span class="o">=</span>stdout --output.text.colors<span class="o">=</span><span class="nb">false</span> --output.text.print-issued-lines<span class="o">=</span><span class="nb">false</span> --output.code-climate.path<span class="o">=</span>gl-code-quality-report.json</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</div>Roadmaphttps://golangci-lint.run/docs/product/roadmap/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/product/roadmap/ +<h2>💡 Feature Requests<span class="hx:absolute hx:-mt-20" id="-feature-requests"></span> +<a href="#-feature-requests" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Please file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.</p> +<p><a href="https://github.com/golangci/golangci-lint/issues?utf8=%e2%9c%93&amp;q=is%3Aissue&#43;is%3Aopen&#43;sort%3Areactions-%2B1-desc&#43;label%3Aenhancement"target="_blank" rel="noopener">See Feature Requests</a></p> +<h2>🐛 Bugs<span class="hx:absolute hx:-mt-20" id="-bugs"></span> +<a href="#-bugs" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Please file an issue for bugs, missing documentation or unexpected behavior.</p> +<p><a href="https://github.com/golangci/golangci-lint/issues?utf8=%e2%9c%93&amp;q=is%3Aissue&#43;is%3Aopen&#43;label%3A%22bug%22&#43;sort%3Acreated-desc"target="_blank" rel="noopener">See Bugs</a></p> +<h2>Versioning Policy<span class="hx:absolute hx:-mt-20" id="versioning-policy"></span> +<a href="#versioning-policy" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>golangci-lint follows <a href="https://semver.org/"target="_blank" rel="noopener">semantic versioning</a>. However, due to the nature of golangci-lint as a code quality tool, +it&rsquo;s not always clear when a minor or major version bump occurs. +To help clarify this for everyone, we&rsquo;ve defined the following semantic versioning policy:</p> +<ul> +<li>Patch release (intended to not break your lint build) +<ul> +<li>A patch version update in a specific linter that results in golangci-lint reporting fewer errors.</li> +<li>A bug fix to the CLI or core (packages loading, runner, postprocessors, etc).</li> +<li>Improvements to documentation.</li> +<li>Non-user-facing changes such as refactoring code, adding, deleting, or modifying tests, and increasing test coverage.</li> +<li>Re-releasing after a failed release (i.e., publishing a release that doesn&rsquo;t work for anyone).</li> +</ul> +</li> +<li>Minor release (might break your lint build because of newly found issues) +<ul> +<li>A major or minor version update of a specific linter that results in golangci-lint reporting more errors.</li> +<li>A new linter is added.</li> +<li>An existing configuration option or linter is deprecated.</li> +<li>A new CLI command is created.</li> +<li>Backward incompatible change of configuration.</li> +</ul> +</li> +<li>Major release (likely to break your lint build) +<ul> +<li>Backward incompatible change of configuration with huge impact.</li> +</ul> +</li> +</ul> +<p>According to our policy, any minor update may report more errors than the previous release (ex: from a bug fix). +As such, we recommend using the fixed minor version and fixed or the latest patch version to guarantee the results of your builds.</p> +<p>For example, in our <a href="https://github.com/golangci/golangci-lint-action"target="_blank" rel="noopener">GitHub Action</a> we require users to explicitly set the minor version of golangci-lint +and we always use the latest patch version.</p> +<h2>Linter Deprecation Cycle<span class="hx:absolute hx:-mt-20" id="linter-deprecation-cycle"></span> +<a href="#linter-deprecation-cycle" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A linter can be deprecated for various reasons, e.g. the linter stops working with a newer version of Go or the author has abandoned its linter.</p> +<p>The deprecation of a linter will follow 3 phases:</p> +<ol> +<li><strong>Display of a warning message</strong>: The linter can still be used (unless it&rsquo;s completely non-functional), +but it&rsquo;s recommended to remove it from your configuration.</li> +<li><strong>Display of an error message</strong>: At this point, you should remove the linter. +The original implementation is replaced by a placeholder that does nothing. +The linter is NOT enabled when using <code>default: all</code> and should be removed from the <code>disable</code> option.</li> +<li><strong>Removal of the linter</strong> from golangci-lint.</li> +</ol> +<p>Each phase corresponds to a minor version:</p> +<ul> +<li>v1.0.0 -&gt; warning message</li> +<li>v1.1.0 -&gt; error message</li> +<li>v1.2.0 -&gt; linter removed</li> +</ul> +<p>We will provide clear information about those changes on different supports: changelog, logs, social network, etc.</p> +<p>We consider the removal of a linter as non-breaking changes for golangci-lint itself. +No major version will be created when a linter is removed.</p> +<h2>Future Plans<span class="hx:absolute hx:-mt-20" id="future-plans"></span> +<a href="#future-plans" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Upstream all changes of forked linters.</li> +<li>Make it easy to write own linter/checker: it should take a minimum code, have perfect documentation, debugging and testing tooling.</li> +<li>Speed up SSA loading: on-disk cache and existing code profiling-optimizing.</li> +<li>Analyze (don&rsquo;t only filter) only new code: analyze only changed files and dependencies, make incremental analysis, caches.</li> +<li>Smart new issues detector: don&rsquo;t print existing issues on changed lines.</li> +<li>Minimize false-positives by fixing linters and improving testing tooling.</li> +<li>Documentation for every issue type.</li> +</ol> \ No newline at end of file diff --git a/docs/product/migration-guide/index.html b/docs/product/migration-guide/index.html new file mode 100644 index 000000000000..f6c79174f2c1 --- /dev/null +++ b/docs/product/migration-guide/index.html @@ -0,0 +1,634 @@ +Migration guide – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Migration guide

    Command migrate +

    You can use golangci-lint to migrate your configuration with the migrate command:

    golangci-lint migrate

    Be aware that comments inside a configuration file are not migrated. You need to add them manually after the migration.

    Deprecated options from v1 or unknown fields are not migrated.

    The migration file format is based on the extension of the configuration file. +The format can be overridden by using the --format flag:

    golangci-lint migrate --format json

    Before the migration, the previous configuration file is copied and saved to a file named <config_file_name>.bck.<config_file_extension>.

    By default, before the migration process, the configuration file is validated against the JSON Schema of configuration v1. +If you want to skip this validation, you can use the --skip-validation flag:

    golangci-lint migrate --skip-validation

    The migrate command enforces the following default values:

    • run.timeout: the existing value is ignored because, in v2, there is no timeout by default.
    • issues.show-stats: the existing value is ignored because, in v2, stats are enabled by default.
    • run.concurrency: if the existing value was 0, it is removed as 0 is the new default.
    • run.relative-path-mode: if the existing value was cfg, it is removed as cfg is the new default.

    issues.exclude-generated has a new default value (v1 lax, v2 strict), so this field will be added during the migration to maintain the previous behavior.

    issues.exclude-dirs-use-default has been removed, so it is converted to linters.exclusions.paths and, if needed, formatters.exclusions.paths.

    Other fields explicitly defined in the configuration file are migrated even if the value is the same as the default value.

    The migrate command automatically migrates linters.presets in individual linters to linters.enable.

    $ golangci-lint migrate -h
    +Migrate configuration file from v1 to v2.
    +
    +Usage:
    +  golangci-lint migrate [flags]
    +
    +Flags:
    +  -c, --config PATH       Read config from file path PATH
    +      --no-config         Don't read config file
    +      --format string     Output file format.
    +                          By default, the format of the input configuration file is used.
    +                          It can be 'yml', 'yaml', 'toml', or 'json'.
    +      --skip-validation   Skip validation of the configuration file against the JSON Schema for v1.
    +
    +Global Flags:
    +      --color string   Use color when printing; can be 'always', 'auto', or 'never' (default "auto")
    +  -h, --help           Help for a command
    +  -v, --verbose        Verbose output
    +

    Changes +

    linters +

    linters.disable-all +

    This property has been replaced with linters.default: none.

    linters:
    +  disable-all: true
    linters:
    +  default: none

    linters.enable-all +

    This property has been replaced with linters.default: all.

    linters:
    +  enable-all: true
    linters:
    +  default: all

    linters.enable[].<formatter_name> +

    The linters gci, gofmt, gofumpt, and goimports have been moved to the formatters section.

    linters:
    +  enable:
    +    - gci
    +    - gofmt
    +    - gofumpt
    +    - goimports
    formatters:
    +  enable:
    +    - gci
    +    - gofmt
    +    - gofumpt
    +    - goimports

    linters.enable[].{stylecheck,gosimple,staticcheck} +

    The linters stylecheck, gosimple, and staticcheck has been merged inside the staticcheck.

    linters:
    +  enable:
    +    - gosimple
    +    - staticcheck
    +    - stylecheck
    linters:
    +  enable:
    +    - staticcheck

    linters.fast +

    This property has been removed.

    There are 2 new options (they are not strictly equivalent to the previous option):

    1. linters.default: fast: set all “fast” linters as the default set of linters.
      linters:
      +  default: fast
    2. --fast-only: filters all enabled linters to keep only “fast” linters.

    linters.presets +

    This property has been removed.

    The migrate command automatically migrates linters.presets in individual linters to linters.enable.

    Presets:

    namelinters
    bugsasasalint, asciicheck, bidichk, bodyclose, contextcheck, durationcheck, errcheck, errchkjson, errorlint, exhaustive, gocheckcompilerdirectives, gochecksumtype, gosec, gosmopolitan, govet, loggercheck, makezero, musttag, nilerr, nilnesserr, noctx, protogetter, reassign, recvcheck, rowserrcheck, spancheck, sqlclosecheck, staticcheck, testifylint, zerologlint
    commentdupword, godot, godox, misspell
    complexitycyclop, funlen, gocognit, gocyclo, maintidx, nestif
    errorerr113, errcheck, errorlint, wrapcheck
    formatgci, gofmt, gofumpt, goimports
    importdepguard, gci, goimports, gomodguard
    metalintergocritic, govet, revive, staticcheck
    moduledepguard, gomoddirectives, gomodguard
    performancebodyclose, fatcontext, noctx, perfsprint, prealloc
    sqlrowserrcheck, sqlclosecheck
    styleasciicheck, canonicalheader, containedctx, copyloopvar, decorder, depguard, dogsled, dupl, err113, errname, exhaustruct, exptostd, forbidigo, forcetypeassert, ginkgolinter, gochecknoglobals, gochecknoinits, goconst, gocritic, godot, godox, goheader, gomoddirectives, gomodguard, goprintffuncname, gosimple, grouper, iface, importas, inamedparam, interfacebloat, intrange, ireturn, lll, loggercheck, makezero, mirror, misspell, mnd, musttag, nakedret, nilnil, nlreturn, nolintlint, nonamedreturns, nosprintfhostport, paralleltest, predeclared, promlinter, revive, sloglint, stylecheck, tagalign, tagliatelle, testpackage, tparallel, unconvert, usestdlibvars, varnamelen, wastedassign, whitespace, wrapcheck, wsl
    testexhaustruct, paralleltest, testableexamples, testifylint, testpackage, thelper, tparallel, usetesting
    unusedineffassign, unparam, unused
    # Removed

    typecheck +

    This typecheck is not a linter, so it cannot be enabled or disabled:

    Deprecated Linters +

    The following deprecated linters have been removed:

    • deadcode
    • execinquery
    • exhaustivestruct
    • exportloopref
    • golint
    • ifshort
    • interfacer
    • maligned
    • nosnakecase
    • scopelint
    • structcheck
    • tenv
    • varcheck

    Alternative Linter Names +

    The alternative linters has been removed.

    Alt Name v1Name v2
    gasgosec
    goerr113err113
    gomndmnd
    logrlintloggercheck
    megacheckstaticcheck
    vetgovet
    vetshadowgovet
    linters:
    +  enable:
    +    - gas
    +    - goerr113
    +    - gomnd
    +    - logrlint
    +    - megacheck
    +    - vet
    +    - vetshadow
    linters:
    +  enable:
    +    - gosec
    +    - err113
    +    - mnd
    +    - loggercheck
    +    - staticcheck
    +    - govet

    linters-settings +

    The linters-settings section has been split into linters.settings and formatters.settings.

    Settings for gci, gofmt, gofumpt, and goimports are moved to the formatters.settings section.

    linters-settings:
    +  govet:
    +    enable-all: true
    +  gofmt:
    +    simplify: false
    linters:
    +  settings:
    +    govet:
    +      enable-all: true
    +
    +formatters:
    +  settings:
    +    gofmt:
    +      simplify: false

    linters-settings.asasalint.ignore-test +

    This option has been removed.

    To ignore test files, use linters.exclusions.rules.

    linters-settings:
    +  asasalint:
    +    ignore-test: true
    linters:
    +  exclusions:
    +    rules:
    +      - path: '(.+)_test\.go'
    +        linters:
    +          - asasalint

    linters-settings.copyloopvar.ignore-alias +

    This option has been deprecated since v1.58.0 and has been replaced with linters.settings.copyloopvar.check-alias.

    linters-settings:
    +  copyloopvar:
    +    ignore-alias: false
    linters:
    +  settings:
    +    copyloopvar:
    +      check-alias: true

    linters-settings.cyclop.skip-tests +

    This option has been removed.

    To ignore test files, use linters.exclusions.rules.

    linters-settings:
    +  cyclop:
    +    skip-test: true
    linters:
    +  exclusions:
    +    rules:
    +      - path: '(.+)_test\.go'
    +        linters:
    +          - cyclop

    linters-settings.errcheck.exclude +

    This option has been deprecated since v1.42.0 and has been removed.

    To exclude functions, use linters.settings.errcheck.exclude-functions instead.

    linters-settings:
    +  errcheck:
    +    exclude: ./errcheck_excludes.txt
    linters:
    +  settings:
    +    errcheck:
    +      exclude-functions:
    +        - io.ReadFile
    +        - io.Copy(*bytes.Buffer)
    +        - io.Copy(os.Stdout)

    linters-settings.errcheck.ignore +

    This option has been deprecated since v1.13.0 and has been removed.

    To exclude functions, use linters.settings.errcheck.exclude-functions instead.

    linters-settings:
    +  errcheck:
    +    ignore: 'io:.*'
    linters:
    +  settings:
    +    errcheck:
    +      exclude-functions:
    +        - 'io.ReadFile'
    +        - 'io.Copy(*bytes.Buffer)'
    +        - 'io.Copy(os.Stdout)'

    linters-settings.exhaustive.check-generated +

    This option has been removed.

    To analyze generated files, use linters.exclusions.generated.

    linters-settings:
    +  exhaustive:
    +    check-generated: true
    linters:
    +  exclusions:
    +    generated: disable

    linters-settings.forbidigo.forbid[].p +

    This field has been replaced with linters-settings.forbidigo.forbid[].pattern.

    linters-settings:
    +  forbidigo:
    +    forbid:
    +      - p: '^fmt\.Print.*$'
    +        msg: Do not commit print statements.
    linters:
    +  settings:
    +    forbidigo:
    +      forbid:
    +        - pattern: '^fmt\.Print.*$'
    +          msg: Do not commit print statements.

    linters-settings.forbidigo.forbid[]<pattern> +

    The pattern has become mandatory for the forbid field.

    linters-settings:
    +  forbidigo:
    +    forbid:
    +      - '^print(ln)?$'
    +      - '^spew\.(ConfigState\.)?Dump$'
    linters:
    +  settings:
    +    forbidigo:
    +      forbid:
    +        - pattern: '^print(ln)?$'
    +        - pattern: '^spew\.(ConfigState\.)?Dump$'

    linters-settings.gci.local-prefixes +

    This option has been deprecated since v1.44.0 and has been removed.

    Use linters.settings.gci.sections instead.

    linters-settings:
    +  gci:
    +    local-prefixes: 'github.com/example/pkg'
    linters:
    +  settings:
    +    gci:
    +      sections:
    +        - standard
    +        - default
    +        - prefix(github.com/example/pkg)

    linters-settings.gci.skip-generated +

    This option has been removed.

    To analyze generated files, use linters.exclusions.generated.

    linters:
    +  settings:
    +    gci:
    +      skip-generated: false
    linters:
    +  exclusions:
    +    generated: disable

    linters-settings.goconst.ignore-tests +

    This option has been removed.

    To ignore test files, use linters.exclusions.rules.

    linters-settings:
    +  goconst:
    +    ignore-tests: true
    linters:
    +  exclusions:
    +    rules:
    +      - path: '(.+)_test\.go'
    +        linters:
    +          - goconst

    linters-settings.gocritic.settings.ruleguard.rules +

    The special variable ${configDir} has been replaced with ${base-path}.

    linters-settings:
    +  gocritic:
    +    settings:
    +      ruleguard:
    +        rules: '${configDir}/ruleguard/rules-*.go'
    linters:
    +  settings:
    +    gocritic:
    +      settings:
    +        ruleguard:
    +          rules: '${base-path}/ruleguard/rules-*.go'

    linters-settings.govet.check-shadowing +

    This option has been deprecated since v1.57.0 and has been removed.

    Use linters.settings.govet.enable: shadow instead.

    linters-settings:
    +  govet:
    +    check-shadowing: true
    linters:
    +  settings:
    +    govet:
    +      enable:
    +        - shadow

    linters-settings.misspell.ignore-words +

    This option has been replaced with linters.settings.misspell.ignore-rules.

    linters-settings:
    +  misspell:
    +    ignore-words:
    +      - foo
    linters:
    +  settings:
    +    misspell:
    +      ignore-rules:
    +        - foo

    linters-settings.predeclared.ignore +

    This string option has been replaced with the slice option with the same name.

    linters-settings:
    +  predeclared:
    +    ignore: "new,int"
    linters:
    +  settings:
    +    predeclared:
    +      ignore:
    +        - new
    +        - int

    linters-settings.predeclared.q +

    This option has been replaced with linters.settings.predeclared.qualified-name.

    linters-settings:
    +  predeclared:
    +    q: true
    linters:
    +  settings:
    +    predeclared:
    +      qualified-name: true

    linters-settings.revive.ignore-generated-header +

    This option has been removed.

    Use linters.exclusions.generated instead.

    linters-settings:
    +  revive:
    +    ignore-generated-header: true
    linters:
    +  exclusions:
    +    generated: strict

    linters-settings.sloglint.context-only +

    This option has been deprecated since v1.58.0 and has been replaced with linters.settings.sloglint.context.

    linters-settings:
    +  sloglint:
    +    context-only: true
    linters:
    +  settings:
    +    sloglint:
    +      context: all

    linters-settings.staticcheck.go +

    This option has been deprecated since v1.47.0 and has been removed.

    Use run.go instead.

    linters-settings:
    +  staticcheck:
    +    go: '1.22'
    run:
    +  go: '1.22'

    linters-settings.unused.exported-is-used +

    This option has been deprecated since v1.60.0 and has been removed.

    linters-settings:
    +  unused:
    +    exported-is-used: true
    # Removed

    linters-settings.usestdlibvars.os-dev-null +

    This option has been deprecated since v1.51.0 and has been removed.

    linters-settings:
    +  usestdlibvars:
    +    os-dev-null: true
    # Removed

    linters-settings.usestdlibvars.syslog-priority +

    This option has been deprecated since v1.51.0 and has been removed.

    linters-settings:
    +  usestdlibvars:
    +    syslog-priority: true
    # Removed

    linters-settings.wrapcheck.ignoreInterfaceRegexps +

    This option has been renamed to linters.settings.wrapcheck.ignore-interface-regexps.

    linters-settings:
    +  wrapcheck:
    +    ignoreInterfaceRegexps:
    +      - '^(?i)c(?-i)ach(ing|e)'
    linters:
    +  settings:
    +    wrapcheck:
    +      ignore-interface-regexps:
    +        - '^(?i)c(?-i)ach(ing|e)'

    linters-settings.wrapcheck.ignorePackageGlobs +

    This option has been renamed to linters.settings.wrapcheck.ignore-package-globs.

    linters-settings:
    +  wrapcheck:
    +    ignorePackageGlobs:
    +      - 'encoding/*'
    linters:
    +  settings:
    +    wrapcheck:
    +      ignore-package-globs:
    +        - 'encoding/*'

    linters-settings.wrapcheck.ignoreSigRegexps +

    This option has been renamed to linters.settings.wrapcheck.ignore-sig-regexps.

      linters-settings:
    +    wrapcheck:
    +      ignoreSigRegexps:
    +        - '\.New.*Error\('
    linters:
    +  settings:
    +    wrapcheck:
    +      ignore-sig-regexps:
    +        - '\.New.*Error\('

    linters-settings.wrapcheck.ignoreSigs +

    This option has been renamed to linters.settings.wrapcheck.ignore-sigs.

    linters-settings:
    +  wrapcheck:
    +    ignoreSigs:
    +      - '.Errorf('
    linters:
    +  settings:
    +    wrapcheck:
    +      ignore-sigs:
    +        - '.Errorf('

    issues +

    issues.exclude-case-sensitive +

    This property has been removed.

    issues.exclude, issues.exclude-rules.text, and issues.exclude-rules.source are case-sensitive by default.

    To ignore case, use (?i) at the beginning of a regex syntax.

    issues:
    +  exclude-case-sensitive: false
    +  exclude:
    +    - 'abcdef'
    linters:
    +  exclusions:
    +    rules:
    +      - path: '(.+)\.go$'
    +        text: (?i)abcdef

    issues.exclude-dirs-use-default +

    This property has been removed.

    Use linters.exclusions.paths and formatters.exclusions.paths to exclude directories.

    issues:
    +  exclude-dirs-use-default: true
    linters:
    +  exclusions:
    +    paths:
    +      - third_party$
    +      - builtin$
    +      - examples$

    issues.exclude-dirs +

    This property has been replaced with linters.exclusions.paths and formatters.exclusions.paths.

    issues:
    +  exclude-dirs:
    +    - src/external_libs
    +    - autogenerated_by_my_lib
    linters:
    +  exclusions:
    +    paths:
    +      - src/external_libs
    +      - autogenerated_by_my_lib

    issues.exclude-files +

    This property has been replaced with linters.exclusions.paths and formatters.exclusions.paths.

    issues:
    +  exclude-files:
    +    - '.*\.my\.go$'
    +    - lib/bad.go
    linters:
    +  exclusions:
    +    paths:
    +      - '.*\.my\.go$'
    +      - lib/bad.go

    issues.exclude-generated-strict +

    This property has been deprecated since v1.59.0 and has been replaced with linters.exclusions.generated: strict.

    linters:
    +  exclude-generated-strict: true
    linters:
    +  exclusions:
    +    generated: strict

    issues.exclude-generated +

    This property has been replaced with linters.exclusions.generated.

    linters:
    +  exclude-generated: lax
    linters:
    +  exclusions:
    +    generated: lax

    issues.exclude-rules +

    This property has been replaced with linters.exclusions.rules.

    issues:
    +  exclude-rules:
    +    - path: '_test\.go'
    +      linters:
    +        - gocyclo
    +        - errcheck
    +        - dupl
    +        - gosec
    +    - path-except: '_test\.go'
    +      linters:
    +        - staticcheck
    +    - path: internal/hmac/
    +      text: "weak cryptographic primitive"
    +      linters:
    +        - gosec
    +    - linters:
    +        - staticcheck
    +      text: "SA9003:"
    +    - linters:
    +        - err113
    +      source: "foo"
    linters:
    +  exclusions:
    +    rules:
    +      - path: '_test\.go'
    +        linters:
    +          - dupl
    +          - errcheck
    +          - gocyclo
    +          - gosec
    +      - path-except: '_test\.go'
    +        linters:
    +          - staticcheck
    +      - path: internal/hmac/
    +        text: weak cryptographic primitive
    +        linters:
    +          - gosec
    +      - text: 'SA9003:'
    +        linters:
    +          - staticcheck
    +      - source: foo
    +        linters:
    +          - err113

    issues.exclude-use-default +

    This property has been replaced with linters.exclusions.presets.

    issues:
    +  exclude-use-default: true
    linters:
    +  exclusions:
    +    presets:
    +      - comments
    +      - common-false-positives
    +      - legacy
    +      - std-error-handling

    issues.exclude +

    This property has been replaced with linters.exclusions.rules.

    issues:
    +  exclude:
    +    - abcdef
    linters:
    +  exclusions:
    +  rules:
    +    - path: '(.+)\.go$'
    +      text: abcdef

    issues.include +

    This property has been replaced with linters.exclusions.presets.

    issues:
    +  include:
    +    - EXC0014
    +    - EXC0015
    linters:
    +  exclusions:
    +    presets:
    +      - common-false-positives
    +      - legacy
    +      - std-error-handling

    output +

    output.format +

    This property has been deprecated since v1.57.0 and has been replaced with output.formats.

    output:
    +  format: 'checkstyle:report.xml,json:stdout,colored-line-number'
    output:
    +  formats:
    +    checkstyle:
    +      path: 'report.xml'
    +    json:
    +      path: stdout
    +    text:
    +      path: stdout
    +      color: true

    output.formats[].format: <name> +

    The property output.formats[].format has been replaced with output.formats[].<format_name>.

    output:
    +  formats:
    +    - format: json
    +      path: stderr
    +    - format: checkstyle
    +      path: report.xml
    output:
    +  formats:
    +    json:
    +      path: stderr
    +    checkstyle:
    +      path: report.xml

    output.formats[].format: line-number +

    This format has been replaced by the format text.

    output:
    +  formats:
    +    - format: line-number
    output:
    +  formats:
    +    text:
    +      path: stdout

    output.formats[].format: colored-line-number +

    This format has been replaced by the format text with the option colors (true by default).

    output:
    +  formats:
    +    - format: colored-line-number
    output:
    +  formats:
    +    text:
    +      path: stdout
    +      colors: true

    output.formats[].format: colored-tab +

    This format has been replaced by the format tab with the option colors (true by default).

    output:
    +  formats:
    +    - format: colored-tab
    output:
    +  formats:
    +    tab:
    +      path: stdout
    +      colors: true

    output.print-issued-lines +

    This property has been removed.

    To not print the lines with issues, use the text format with the option print-issued-lines: false.

    output:
    +  formats:
    +    - format: line-number
    +      path: stdout
    +  print-issued-lines: false
    output:
    +  formats:
    +    text:
    +      path: stdout
    +      print-issued-lines: false

    output.print-linter-name +

    This property has been removed.

    To not print the linter name, use the text format with the option print-linter-name: false.

    output:
    +  formats:
    +    - format: line-number
    +      path: stdout
    +  print-linter-name: false
    output:
    +  formats:
    +    text:
    +      path: stdout
    +      print-linter-name: false

    output.show-stats +

    This property is true by default.

    output.sort-order +

    This property has a new default value ['linter', 'file'] instead of ['file'].

    output.sort-results +

    The property has been removed.

    The output results are always sorted.

    output.uniq-by-line +

    This property has been deprecated since v1.63.0 and has been replaced by issues.uniq-by-line.

    output:
    +  uniq-by-line: true
    issues:
    +  uniq-by-line: true

    run +

    run.go +

    The new fallback value for this property is 1.22 instead of 1.17.

    run.concurrency +

    This property value set to match Linux container CPU quota by default and fallback on the number of logical CPUs in the machine.

    run.relative-path-mode +

    This property has a new default value of cfg instead of wd.

    run:
    +# When not specified, relative-path-mode is set to 'wd' by default
    run:
    +  relative-path-mode: 'cfg'

    run.show-stats +

    This property has been deprecated since v1.57.0 and has been replaced by output.show-stats.

    run:
    +  show-stats: true
    output:
    +  show-stats: true

    run.skip-dirs-use-default +

    This property has been deprecated since v1.57.0 and has been replaced by issues.exclude-dirs-use-default.

    run:
    +  skip-dirs-use-default: false
    issues:
    +  exclude-dirs-use-default: false

    run.skip-dirs +

    This property has been deprecated since v1.57.0 and has been removed.

    Use linters.exclusions.paths and formatters.exclusions.paths to exclude directories.

    run:
    +  skip-dirs:
    +    - src/external_libs
    +    - autogenerated_by_my_lib
    linters:
    +  exclusions:
    +    paths:
    +      - src/external_libs
    +      - autogenerated_by_my_lib

    run.skip-files +

    This property has been deprecated since v1.57.0 and has been removed.

    Use linters.exclusions.paths and formatters.exclusions.paths to exclude files.

    run:
    +  skip-files:
    +    - '.*\.my\.go$'
    +    - lib/bad.go
    linters:
    +  exclusions:
    +    paths:
    +      - '.*\.my\.go$'
    +      - lib/bad.go

    run.timeout +

    This property value is disabled by default (0).

    severity +

    severity.default-severity +

    This property has been replaced with severity.default.

    severity:
    +  default-severity: error
    severity:
    +  default: error

    severity.rules.case-sensitive +

    severity.rules.text and severity.rules.source are case-sensitive by default.

    To ignore case, use (?i) at the beginning of a regex syntax.

    severity:
    +  case-sensitive: true
    +  rules:
    +    - severity: info
    +      linters:
    +        - foo
    +      text: 'Example.*'
    severity:
    +  rules:
    +    - severity: info
    +      linters:
    +        - foo
    +      text: '(?i)Example.*'

    version +

    The version property has been added to the configuration file.

    version: "2"

    Integration +

    Visual Studio Code +

    "go.lintTool": "golangci-lint",
    +"go.lintFlags": [
    +  "--fast"
    +]
    "go.lintTool": "golangci-lint",
    +"go.lintFlags": [
    +  "--fast-only"
    +],
    +"go.formatTool": "custom",
    +"go.alternateTools": {
    +  "customFormatter": "golangci-lint"
    +},
    +"go.formatFlags": [
    +  "fmt",
    +  "--stdin"
    +]

    Command Line Flags +

    The following flags have been removed:

    • --disable-all
    • --enable-all
    • -p, --presets
    • --fast
    • -e, --exclude
    • --exclude-case-sensitive
    • --exclude-dirs-use-default
    • --exclude-dirs
    • --exclude-files
    • --exclude-generated
    • --exclude-use-default
    • --go string
    • --sort-order
    • --sort-results
    • --out-format
    • --print-issued-lines
    • --print-linter-name

    --out-format +

    --out-format has been replaced with the following flags:

    # Previously 'colored-line-number' and 'line-number'
    +--output.text.path
    +--output.text.print-linter-name
    +--output.text.print-issued-lines
    +--output.text.colors
    # Previously 'json'
    +--output.json.path
    # Previously 'colored-tab' and 'tab'
    +--output.tab.path
    +--output.tab.print-linter-name
    +--output.tab.colors
    # Previously 'html'
    +--output.html.path
    # Previously 'checkstyle'
    +--output.checkstyle.path
    # Previously 'code-climate'
    +--output.code-climate.path
    # Previously 'junit-xml' and 'junit-xml-extended'
    +--output.junit-xml.path
    +--output.junit-xml.extended
    # Previously 'teamcity'
    +--output.teamcity.path
    # Previously 'sarif'
    +--output.sarif.path

    --print-issued-lines +

    --print-issued-lines has been replaced with --output.text.print-issued-lines.

    --print-linter-name +

    --print-linter-name has been replaced with --output.text.print-linter-name or --output.tab.print-linter-name.

    --disable-all and --enable-all +

    --disable-all has been replaced with --default=none.

    --enable-all has been replaced with --default=all.

    Examples +

    Run only the govet linter, output results to stdout in JSON format, and sort results:

    golangci-lint run --disable-all --enable=govet --out-format=json --sort-order=linter --sort-results
    golangci-lint run --default=none --enable=govet --output.json.path=stdout

    Do not print issued lines, output results to stdout without colors in text format, and to gl-code-quality-report.json file in Code Climate’s format:

    golangci-lint run --print-issued-lines=false --out-format code-climate:gl-code-quality-report.json,line-number
    golangci-lint run --output.text.path=stdout --output.text.colors=false --output.text.print-issued-lines=false --output.code-climate.path=gl-code-quality-report.json
    Last updated on
    \ No newline at end of file diff --git a/docs/product/roadmap/index.html b/docs/product/roadmap/index.html new file mode 100644 index 000000000000..78e0656b01b6 --- /dev/null +++ b/docs/product/roadmap/index.html @@ -0,0 +1,135 @@ +Roadmap – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Roadmap

    💡 Feature Requests +

    Please file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.

    See Feature Requests

    🐛 Bugs +

    Please file an issue for bugs, missing documentation or unexpected behavior.

    See Bugs

    Versioning Policy +

    golangci-lint follows semantic versioning. However, due to the nature of golangci-lint as a code quality tool, +it’s not always clear when a minor or major version bump occurs. +To help clarify this for everyone, we’ve defined the following semantic versioning policy:

    • Patch release (intended to not break your lint build)
      • A patch version update in a specific linter that results in golangci-lint reporting fewer errors.
      • A bug fix to the CLI or core (packages loading, runner, postprocessors, etc).
      • Improvements to documentation.
      • Non-user-facing changes such as refactoring code, adding, deleting, or modifying tests, and increasing test coverage.
      • Re-releasing after a failed release (i.e., publishing a release that doesn’t work for anyone).
    • Minor release (might break your lint build because of newly found issues)
      • A major or minor version update of a specific linter that results in golangci-lint reporting more errors.
      • A new linter is added.
      • An existing configuration option or linter is deprecated.
      • A new CLI command is created.
      • Backward incompatible change of configuration.
    • Major release (likely to break your lint build)
      • Backward incompatible change of configuration with huge impact.

    According to our policy, any minor update may report more errors than the previous release (ex: from a bug fix). +As such, we recommend using the fixed minor version and fixed or the latest patch version to guarantee the results of your builds.

    For example, in our GitHub Action we require users to explicitly set the minor version of golangci-lint +and we always use the latest patch version.

    Linter Deprecation Cycle +

    A linter can be deprecated for various reasons, e.g. the linter stops working with a newer version of Go or the author has abandoned its linter.

    The deprecation of a linter will follow 3 phases:

    1. Display of a warning message: The linter can still be used (unless it’s completely non-functional), +but it’s recommended to remove it from your configuration.
    2. Display of an error message: At this point, you should remove the linter. +The original implementation is replaced by a placeholder that does nothing. +The linter is NOT enabled when using default: all and should be removed from the disable option.
    3. Removal of the linter from golangci-lint.

    Each phase corresponds to a minor version:

    • v1.0.0 -> warning message
    • v1.1.0 -> error message
    • v1.2.0 -> linter removed

    We will provide clear information about those changes on different supports: changelog, logs, social network, etc.

    We consider the removal of a linter as non-breaking changes for golangci-lint itself. +No major version will be created when a linter is removed.

    Future Plans +

    1. Upstream all changes of forked linters.
    2. Make it easy to write own linter/checker: it should take a minimum code, have perfect documentation, debugging and testing tooling.
    3. Speed up SSA loading: on-disk cache and existing code profiling-optimizing.
    4. Analyze (don’t only filter) only new code: analyze only changed files and dependencies, make incremental analysis, caches.
    5. Smart new issues detector: don’t print existing issues on changed lines.
    6. Minimize false-positives by fixing linters and improving testing tooling.
    7. Documentation for every issue type.
    Last updated on
    \ No newline at end of file diff --git a/docs/product/thanks/index.html b/docs/product/thanks/index.html new file mode 100644 index 000000000000..87f9d469f50c --- /dev/null +++ b/docs/product/thanks/index.html @@ -0,0 +1,362 @@ +Thanks – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Thanks

    ❤️ +

    Thanks to developers and authors of used linters +

    4meepo4meepo
    tagalign
    AbirdcflyAbirdcfly
    dupword
    AdminBenniAdminBenni
    iotamixing
    alecthomasalecthomas
    gochecksumtype
    alexkohleralexkohler
    dogsled
    nakedret
    prealloc
    alingsealingse
    asasalint
    nilnesserr
    AlwxSinAlwxSin
    noinlineerr
    AntonboomAntonboom
    errname
    nilnil
    testifylint
    ashanbrownashanbrown
    forbidigo
    makezero
    babakksbabakks
    godoclint
    bkielbasabkielbasa
    cyclop
    blizzy78blizzy78
    varnamelen
    bombsimonbombsimon
    wsl
    wsl_v5
    bosibosi
    decorder
    bremlbreml
    bidichk
    errchkjson
    butuzovbutuzov
    ireturn
    mirror
    catenacybercatenacyber
    perfsprint
    charithecharithe
    durationcheck
    chokoswitchchokoswitch
    reassign
    ckaznochackaznocha
    intrange
    client9client9
    misspell
    CrocmagnonCrocmagnon
    arangolint
    fatcontext
    daixiang0daixiang0
    gci
    denis-tingaikindenis-tingaikin
    goheader
    dixonwilledixonwille
    depguard
    DjarvurDjarvur
    err113
    dominikhdominikh
    staticcheck
    unused
    firefartfirefart
    nonamedreturns
    fzippfzipp
    gocyclo
    ghostiamghostiam
    protogetter
    go-criticgo-critic
    gocritic
    golanggolang
    gofmt
    goimports
    govet
    gordonklausgordonklaus
    ineffassign
    jgautheronjgautheron
    goconst
    jingyugaojingyugao
    rowserrcheck
    jjtijjti
    spancheck
    julzjulz
    importas
    karamaru-alphakaramaru-alpha
    copyloopvar
    kisielkkisielk
    errcheck
    kkHAIKEkkHAIKE
    contextcheck
    kultikulti
    thelper
    kunwardeepkunwardeep
    paralleltest
    lasiarlasiar
    canonicalheader
    ldezldez
    exptostd
    gomoddirectives
    tagliatelle
    usetesting
    leighmccullochleighmcculloch
    gocheckcompilerdirectives
    gochecknoglobals
    leonklingeleleonklingele
    grouper
    macabumacabu
    inamedparam
    manuelartemanuelarte
    embeddedstructfieldcheck
    funcorder
    maratorimaratori
    testableexamples
    testpackage
    matoousmatoous
    godox
    mdempskymdempsky
    unconvert
    mgechevmgechev
    revive
    mibkmibk
    dupl
    MirrexOneMirrexOne
    unqueryvet
    morichomoricho
    tparallel
    mvdanmvdan
    gofumpt
    unparam
    nakabonnenakabonne
    nestif
    nishanthsnishanths
    exhaustive
    predeclared
    nunnatsanunnatsa
    ginkgolinter
    polyfloydpolyfloyd
    errorlint
    raeperdraeperd
    recvcheck
    ryancurrahryancurrah
    gomodguard
    ryanroldsryanrolds
    sqlclosecheck
    sanposhihosanposhiho
    wastedassign
    sashamelentyevsashamelentyev
    interfacebloat
    usestdlibvars
    securegosecurego
    gosec
    segmentiosegmentio
    golines
    sivcharisivchari
    containedctx
    sonatardsonatard
    noctx
    ssgregssgreg
    nlreturn
    stbenjamstbenjam
    nosprintfhostport
    swaggoswaggo
    swaggo
    tenntenntenntenn
    forcetypeassert
    nilerr
    tetafrotetafro
    godot
    timakintimakin
    bodyclose
    timonwongtimonwong
    loggercheck
    tmzanetmzane
    musttag
    sloglint
    tomarrelltomarrell
    wrapcheck
    tommy-muehletommy-muehle
    mnd
    ultrawareultraware
    funlen
    whitespace
    uudashruudashr
    gocognit
    iface
    xen0nxen0n
    gosmopolitan
    xobotyixobotyi
    exhaustruct
    yagipyyagipy
    maintidx
    yeya24yeya24
    promlinter
    ykadowakykadowak
    zerologlint

    Thanks to all contributors +

    golangci-lint contributors

    Special thanks +

    Thanks to alecthomas/gometalinter for inspiration and amazing work.

    Thanks to bradleyfalzon/revgrep for cool diff tool.

    The golangci-lint logo is inspired by the Go gopher designed by Renee French CC BY 3.0.

    Last updated on
    \ No newline at end of file diff --git a/docs/welcome/faq/index.html b/docs/welcome/faq/index.html new file mode 100644 index 000000000000..d80730137a56 --- /dev/null +++ b/docs/welcome/faq/index.html @@ -0,0 +1,134 @@ +FAQ – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    FAQ

    Which Go versions are supported? +

    The same as the Go team (the 2 latest minor versions).

    Basically, golangci-lint supports Go versions lower or equal to the Go version used to compile it.

    New versions of Go are not automatically supported because, in addition of the Go version used to build it, +some linters and/or internal pieces of golangci-lint could need to be adapted to support this new Go version.

    How to use golangci-lint in CI +

    Run golangci-lint in CI and check the exit code. If it’s non-zero - fail the build.

    See how to properly install golangci-lint in CI

    golangci-lint doesn’t work +

    1. Please ensure you are using the latest binary release.
    2. Run it with -v option and check the output.
    3. If it doesn’t help, create a GitHub issue with the output from the error and #2 above.

    Why do you have typecheck errors? +

    typecheck is like a front-end for the Go compiler errors. +Compilation errors are identified/labeled as reports of typecheck but they are not produced by a linter called typecheck.

    typecheck is not a linter, it doesn’t perform any analysis, +it’s just a way to identify, parse, and display compiling errors (produced by the types.Checker) and some linter errors.

    It cannot be disabled because of that.

    Of course, this is just as good as the compiler itself, and a lot of compilation issues will not properly show where in the code your error lies.

    As a consequence, the code to analyze should compile. +It means that if you try to run an analysis on a single file or a group of files or a package or a group of packages, +with dependencies on other files or packages of your project, as it doesn’t compile (because of the missing pieces of code), +it also cannot be analyzed.

    If there are typecheck errors, golangci-lint will not be able to produce other reports because that kind of error doesn’t allow it to perform any analysis.

    How to troubleshoot:

    1. Ensure the version of golangci-lint is built with a compatible version of Go (golangci-lint version).
    2. Ensure dependencies are up to date with go mod tidy.
    3. Ensure building works with go run ./.../go build ./... - whole package.
    4. Ensure you are not running an analysis on code that depends on files/packages outside the scope of the analyzed elements.
    5. If using CGO, ensure all required system libraries are installed.
    6. If you are using private repositories/dependencies, ensure the Go proxy (GOPROXY) and checksum database (GOSUMDB) are right and/or your git configuration.

    Why is it not possible to skip/ignore typecheck errors? +

    For mainly the same reasons that you cannot compile when you have a compiler error.

    typecheck errors are reported in the same style as linter reports/issues, +but are completely different because they are related to problems that block the analysis (typecheck is not a linter).

    When there are typecheck errors, +most linters are not able to perform the analysis, +and they simply do not produce any reports, +so it’s not possible to skip/ignore typecheck errors.

    Why running with --fast-only can be slow on the first run? +

    Because the first run caches type information. +All subsequent runs will be faster. +Usually this option is used during development on a local machine and compilation was already performed.

    How do you add a custom linter? +

    You can integrate it yourself, see this manual. +Or you can create a GitHub Issue and we will integrate when time permits.

    How to integrate golangci-lint into a large project with thousands of issues +

    We are sure that every project can easily integrate golangci-lint, even the large one.

    The idea is to not fix all existing issues. +Fix only newly added issue: issues in new code.

    To do this, set up the CI to run golangci-lint with options --new-from-merge-base=main or --new-from-rev=HEAD~1.

    Also, take a look at option --new, +but consider that CI scripts that generate unstaged files will make --new only point out issues in those files and not in the last commit. +In that regard --new-from-merge-base=main or --new-from-rev=HEAD~1 are safer.

    By doing this you won’t create new issues in your code and can choose fix existing issues (or not).

    Why --new-from-xxx don’t seem to be working in some cases? +

    The options --new-from-merge-base, --new-from-rev, and --new-from-patch work by comparing git diff output and issues.

    If an issue is not reported as the same line as the changes then the issue will be skipped. +This is the line of the issue is not inside the lines changed.

    To fix that, you have to use the option --whole-files.

    The side effect is the issues inside the file that contain changes but not directly related to the changes themselves will be reported.

    Last updated on
    \ No newline at end of file diff --git a/docs/welcome/index.html b/docs/welcome/index.html new file mode 100644 index 000000000000..3b2327bf8f21 --- /dev/null +++ b/docs/welcome/index.html @@ -0,0 +1,106 @@ +Welcome – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
    \ No newline at end of file diff --git a/docs/welcome/index.xml b/docs/welcome/index.xml new file mode 100644 index 000000000000..087cf6b2cd4b --- /dev/null +++ b/docs/welcome/index.xml @@ -0,0 +1,677 @@ +Golangci-lint – Welcomehttps://golangci-lint.run/docs/welcome/Recent content in Welcome on Golangci-lintHugo -- gohugo.ioen-usInstallhttps://golangci-lint.run/docs/welcome/install/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/install/ +<h2>CI installation<span class="hx:absolute hx:-mt-20" id="ci-installation"></span> +<a href="#ci-installation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Most installations of golangci-lint are performed for CI.</p> +<p>It&rsquo;s important to have reproducible CI: don&rsquo;t start to fail all builds at the same time. +With golangci-lint this can happen if you use option <code>linters.default: all</code> and a new linter is added +or even without <code>linters.default: all</code> when one upstream linter is upgraded.</p> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-purple-200 hx:bg-purple-100 hx:text-purple-900 hx:dark:border-purple-200/30 hx:dark:bg-purple-900/30 hx:dark:text-purple-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>Important</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>It&rsquo;s highly recommended installing a specific version of golangci-lint available on the <a href="https://github.com/golangci/golangci-lint/releases"target="_blank" rel="noopener">releases page</a>.</p></div> +</div> +</div> +<h3>GitHub Actions<span class="hx:absolute hx:-mt-20" id="github-actions"></span> +<a href="#github-actions" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>We recommend using <a href="https://github.com/golangci/golangci-lint-action"target="_blank" rel="noopener">our GitHub Action</a> for running golangci-lint in CI for GitHub projects.</p> +<p>It&rsquo;s <a href="https://github.com/golangci/golangci-lint-action#performance"target="_blank" rel="noopener">fast and uses smart caching</a> inside, +and it can be much faster than the simple binary installation.</p> +<p>Also, the action creates GitHub annotations for found issues (you don&rsquo;t need to dig into build log to see found by golangci-lint issues).</p> +<div class="hextra-cards hx:mt-4 hx:gap-4 hx:grid not-prose" style="--hextra-cards-grid-cols: 2;"> +<div class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden"> +<img class="hextra-card-image" src="https://golangci-lint.run/images/colored-line-number.png" alt="Console Output" title="Console Output"/> +</div> +<div class="hextra-card hx:group hx:flex hx:flex-col hx:justify-start hx:overflow-hidden"> +<img class="hextra-card-image" src="https://golangci-lint.run/images/annotations.png" alt="Annotations" title="Annotations"/> +</div> +</div> +<h3>GitLab CI<span class="hx:absolute hx:-mt-20" id="gitlab-ci"></span> +<a href="#gitlab-ci" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>GitLab provides a <a href="https://docs.gitlab.com/ci/testing/code_quality/#golangci-lint"target="_blank" rel="noopener">guide for integrating golangci-lint into the Code Quality widget</a>. +A simple quickstart is their <a href="https://gitlab.com/explore/catalog/components/code-quality-oss/codequality-os-scanners-integration"target="_blank" rel="noopener">CI component</a>, which can be used like this:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div class="hextra-code-filename not-prose" dir="auto">.gitlab-ci.yml</div><div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">include</span><span class="p">:</span><span class="w"> +</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">component</span><span class="p">:</span><span class="w"> </span><span class="l">$CI_SERVER_FQDN/components/code-quality-oss/codequality-os-scanners-integration/golangci@1.0.1</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-8"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Note that you <a href="https://docs.gitlab.com/ci/components/#use-a-component"target="_blank" rel="noopener">can only reference components in the same GitLab instance as your project</a></p> +<h3>Other CI<span class="hx:absolute hx:-mt-20" id="other-ci"></span> +<a href="#other-ci" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Here is the other way to install golangci-lint:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># binary will be $(go env GOPATH)/bin/golangci-lint</span> +</span></span><span class="line"><span class="cl">curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s -- -b <span class="k">$(</span>go env GOPATH<span class="k">)</span>/bin v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># or install it into ./bin/</span> +</span></span><span class="line"><span class="cl">curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="c1"># In Alpine Linux (as it does not come with curl by default)</span> +</span></span><span class="line"><span class="cl">wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">golangci-lint --version</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>It is advised that you periodically update the version of golangci-lint as the project is under active development and is constantly being improved. +For any problems with golangci-lint, check out recent <a href="https://github.com/golangci/golangci-lint/issues"target="_blank" rel="noopener">GitHub issues</a> and update if needed.</p> +<h2>Local Installation<span class="hx:absolute hx:-mt-20" id="local-installation"></span> +<a href="#local-installation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><a href="https://repology.org/project/golangci-lint/versions"target="_blank" rel="noopener"><img src="https://repology.org/badge/vertical-allrepos/golangci-lint.svg" alt="Packaging status" loading="lazy" /></a></p> +<h3>Binaries<span class="hx:absolute hx:-mt-20" id="binaries"></span> +<a href="#binaries" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># binary will be $(go env GOPATH)/bin/golangci-lint</span> +</span></span><span class="line"><span class="cl">curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh <span class="p">|</span> sh -s -- -b <span class="k">$(</span>go env GOPATH<span class="k">)</span>/bin v2.5.0 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">golangci-lint --version</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>On Windows, you can run the above commands with Git Bash, which comes with <a href="https://git-scm.com/download/win"target="_blank" rel="noopener">Git for Windows</a>.</p> +<h3>Linux<span class="hx:absolute hx:-mt-20" id="linux"></span> +<a href="#linux" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Golangci-lint is available inside the majority of the package managers.</p> +<h3>macOS<span class="hx:absolute hx:-mt-20" id="macos"></span> +<a href="#macos" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4>Homebrew<span class="hx:absolute hx:-mt-20" id="homebrew"></span> +<a href="#homebrew" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>Note: Homebrew can use an unexpected version of Go to build the binary, +so we recommend either using our binaries or ensuring the version of Go used to build.</p> +<p>You can install a binary release on macOS using <a href="https://brew.sh/"target="_blank" rel="noopener">brew</a>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew install golangci-lint +</span></span><span class="line"><span class="cl">brew upgrade golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Note: Previously, we used a <a href="https://github.com/golangci/homebrew-tap"target="_blank" rel="noopener">Homebrew tap</a>. +We recommend using the <a href="https://formulae.brew.sh/formula/golangci-lint"target="_blank" rel="noopener">official formula</a> instead of the tap, +but sometimes the most recent release isn&rsquo;t immediately available via Homebrew core due to manual updates that need to occur from Homebrew core maintainers. +In this case, the tap formula, which is updated automatically, +can be used to install the latest version of golangci-lint:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew tap golangci/tap +</span></span><span class="line"><span class="cl">brew install golangci/tap/golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h4>MacPorts<span class="hx:absolute hx:-mt-20" id="macports"></span> +<a href="#macports" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>It can also be installed through <a href="https://www.macports.org/"target="_blank" rel="noopener">MacPorts</a> +The MacPorts installation mode is community-driven and not officially maintained by the golangci team.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo port install golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Windows<span class="hx:absolute hx:-mt-20" id="windows"></span> +<a href="#windows" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><h4>Chocolatey<span class="hx:absolute hx:-mt-20" id="chocolatey"></span> +<a href="#chocolatey" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>You can install a binary on Windows using <a href="https://community.chocolatey.org/packages/golangci-lint"target="_blank" rel="noopener">chocolatey</a>.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">choco install golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h4>Scoop<span class="hx:absolute hx:-mt-20" id="scoop"></span> +<a href="#scoop" class="subheading-anchor" aria-label="Permalink for this section"></a></h4><p>You can install a binary on Windows using <a href="https://scoop.sh/"target="_blank" rel="noopener">scoop</a>.</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">scoop install main/golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>The scoop package is not officially maintained by golangci team.</p> +<h3>Docker<span class="hx:absolute hx:-mt-20" id="docker"></span> +<a href="#docker" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Colored output:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run -t --rm -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Preserving caches between consecutive runs:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker run --rm -t -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/app -w /app <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>--user <span class="k">$(</span>id -u<span class="k">)</span>:<span class="k">$(</span>id -g<span class="k">)</span> <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>-v <span class="k">$(</span>go env GOCACHE<span class="k">)</span>:/.cache/go-build -e <span class="nv">GOCACHE</span><span class="o">=</span>/.cache/go-build <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>-v <span class="k">$(</span>go env GOMODCACHE<span class="k">)</span>:/.cache/mod -e <span class="nv">GOMODCACHE</span><span class="o">=</span>/.cache/mod <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>-v ~/.cache/golangci-lint:/.cache/golangci-lint -e <span class="nv">GOLANGCI_LINT_CACHE</span><span class="o">=</span>/.cache/golangci-lint <span class="se">\ +</span></span></span><span class="line"><span class="cl"><span class="se"></span>golangci/golangci-lint:v2.5.0 golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<h3>Install from Sources<span class="hx:absolute hx:-mt-20" id="install-from-sources"></span> +<a href="#install-from-sources" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg>Warning</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>Using <code>go install</code>/<code>go get</code>, &ldquo;tools pattern&rdquo;, and <code>tool</code> command/directives installations aren&rsquo;t guaranteed to work.<br> +We recommend using binary installation.</p></div> +</div> +</div> +<p>These installations aren&rsquo;t recommended because of the following points:</p> +<ol> +<li>These installations compile golangci-lint locally. The Go version used to build will depend on your local Go version.</li> +<li>Some users use the <code>-u</code> flag for <code>go get</code>, which upgrades our dependencies. The resulting binary was not tested and is not guaranteed to work.</li> +<li>When using the &ldquo;tools pattern&rdquo; or <code>tool</code> command/directives, the dependencies of a tool can modify the dependencies of another tool or your project. The resulting binary was not tested and is not guaranteed to work.</li> +<li>We&rsquo;ve encountered issues with Go module hashes due to the unexpected recreation of dependency tags.</li> +<li><code>go.mod</code> replacement directives don&rsquo;t apply transitively. It means a user will be using a patched version of golangci-lint if we use such replacements.</li> +<li>It allows installation from the main branch, which can&rsquo;t be considered stable.</li> +<li>It&rsquo;s slower than binary installation.</li> +</ol> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg"><code>go tool</code> usage recommendations</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-amber-200 hx:bg-amber-100 hx:text-amber-900 hx:dark:border-amber-200/30 hx:dark:bg-amber-900/30 hx:dark:text-amber-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg>Warning</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>We don&rsquo;t recommend using <code>go tool</code>.</p></div> +</div> +</div> +<p>But if you want to use <code>go tool</code> to install and run golangci-lint (<strong>once again we don&rsquo;t recommend that</strong>), +the best approach is to use a dedicated module or module file to isolate golangci-lint from other tools or dependencies.</p> +<p>This approach avoids modifying your project dependencies and the golangci-lint dependencies.</p> +<div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:flex-col hx:rounded-lg hx:border hx:py-4 hx:px-4 hx:border-gray-200 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-red-200 hx:bg-red-100 hx:text-red-900 hx:dark:border-red-200/30 hx:dark:bg-red-900/30 hx:dark:text-red-200"> +<p class="hx:flex hx:items-center hx:font-medium"><svg height=16px class="hx:inline-block hx:align-middle hx:mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/></svg>Caution</p> +<div class="hx:w-full hx:min-w-0 hx:leading-7"> +<div class="hx:mt-6 hx:leading-7 hx:first:mt-0"><p>You should never update golangci-lint dependencies manually.</p></div> +</div> +</div> +<p><strong>Method 1: dedicated module file</strong></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Create a dedicated module file</span> +</span></span><span class="line"><span class="cl">go mod init -modfile<span class="o">=</span>golangci-lint.mod &lt;your_module_path&gt;/golangci-lint +</span></span><span class="line"><span class="cl"><span class="c1"># Example: go mod init -modfile=golangci-lint.mod github.com/org/repo/golangci-lint</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Add golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Run golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go tool -modfile<span class="o">=</span>golangci-lint.mod golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Update golangci-lint</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p><strong>Method 2: dedicated module</strong></p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Create a dedicated directory</span> +</span></span><span class="line"><span class="cl">mkdir golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Create a dedicated module file</span> +</span></span><span class="line"><span class="cl">go mod init -modfile<span class="o">=</span>tools/go.mod &lt;your_module_path&gt;/golangci-lint +</span></span><span class="line"><span class="cl"><span class="c1"># Example: go mod init -modfile=golangci-lint/go.mod github.com/org/repo/golangci-lint</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Setup a Go workspace</span> +</span></span><span class="line"><span class="cl">go work init . golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Add golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Run golangci-lint as a tool</span> +</span></span><span class="line"><span class="cl">go tool golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"><span class="c1"># Update golangci-lint</span> +</span></span><span class="line"><span class="cl">go get -tool -modfile<span class="o">=</span>golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</details>Quick Starthttps://golangci-lint.run/docs/welcome/quick-start/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/quick-start/ +<h2>Linting<span class="hx:absolute hx:-mt-20" id="linting"></span> +<a href="#linting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To run golangci-lint:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>It&rsquo;s an equivalent of:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run ./...</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You can choose which directories or files to analyze:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run dir1 dir2/... +</span></span><span class="line"><span class="cl">golangci-lint run file1.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Directories are NOT analyzed recursively. +To analyze them recursively append <code>/...</code> to their path. +It&rsquo;s not possible to mix files and packages/directories, and files must come from the same package.</p> +<p>Golangci-lint can be used with zero configuration. By default, the following linters are enabled:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> golangci-lint <span class="nb">help</span> linters +</span></span><span class="line"><span class="cl"><span class="go">Enabled by default linters: +</span></span></span><span class="line"><span class="cl"><span class="go">errcheck: Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases. +</span></span></span><span class="line"><span class="cl"><span class="go">govet: Vet examines Go source code and reports suspicious constructs. It is roughly the same as &#39;go vet&#39; and uses its passes. [auto-fix] +</span></span></span><span class="line"><span class="cl"><span class="go">ineffassign: Detects when assignments to existing variables are not used. [fast] +</span></span></span><span class="line"><span class="cl"><span class="go">staticcheck: It&#39;s the set of rules from staticcheck. [auto-fix] +</span></span></span><span class="line"><span class="cl"><span class="go">unused: Checks Go code for unused constants, variables, functions and types. +</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Pass <code>-E/--enable</code> to enable linter and <code>-D/--disable</code> to disable:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint run --default<span class="o">=</span>none -E errcheck</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>More information about available linters can be found in the <a href="https://golangci-lint.run/docs/linters/">linters page</a>.</p> +<h2>Formatting<span class="hx:absolute hx:-mt-20" id="formatting"></span> +<a href="#formatting" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To format your code:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint fmt</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>You can choose which directories or files to analyze:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">golangci-lint fmt dir1 dir2/... +</span></span><span class="line"><span class="cl">golangci-lint fmt file1.go</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>More information about available formatters can be found in the <a href="https://golangci-lint.run/docs/formatters/">formatters page</a>.</p>Integrationshttps://golangci-lint.run/docs/welcome/integrations/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/integrations/ +<h2>Editor Integration<span class="hx:absolute hx:-mt-20" id="editor-integration"></span> +<a href="#editor-integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>GoLand<span class="hx:absolute hx:-mt-20" id="goland"></span> +<a href="#goland" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Starting from version 2025.1, GoLand has built-in support of golangci-lint. +For IntelliJ IDEA with the Go plugin, please install the <a href="https://plugins.jetbrains.com/plugin/12496-go-linter"target="_blank" rel="noopener">plugin</a>.</p> +<p>Both v1 and v2 versions are supported.</p> +<h3>Visual Studio Code<span class="hx:absolute hx:-mt-20" id="visual-studio-code"></span> +<a href="#visual-studio-code" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Install the <a href="https://marketplace.visualstudio.com/items?itemName=golang.Go"target="_blank" rel="noopener">extension</a>.</p> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg">Recommended settings for those who installed golangci-lint manually</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--path-mode=abs&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast-only&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">],</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatTool&#34;</span><span class="p">:</span> <span class="s2">&#34;custom&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.alternateTools&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;customFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">},</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;fmt&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--stdin&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Using it in an editor without <code>--fast-only</code> can freeze your editor. +Golangci-lint automatically discovers the <code>.golangci.yml</code> config for the edited file, so you don&rsquo;t need to configure it in VS Code settings.</p> +</div> +</details> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg">Recommended settings for those who installed golangci-lint via extension</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<p>Install <code>golangci-lint-v2</code> via the <code>Go: Install/Update Tools</code> command after setting these configs. +This will enable golangci-lint v1 to co-exist with v2. +And use the following settings:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-JSONata" data-lang="JSONata"><span class="line"><span class="cl"><span class="nt">&#34;go.lintTool&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint-v2&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.lintFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--path-mode=abs&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--fast-only&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">],</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatTool&#34;</span><span class="p">:</span> <span class="s2">&#34;custom&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.alternateTools&#34;</span><span class="p">:</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nt">&#34;customFormatter&#34;</span><span class="p">:</span> <span class="s2">&#34;golangci-lint-v2&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">},</span> +</span></span><span class="line"><span class="cl"><span class="nt">&#34;go.formatFlags&#34;</span><span class="p">:</span> <span class="p">[</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;fmt&#34;</span><span class="p">,</span> +</span></span><span class="line"><span class="cl"> <span class="s2">&#34;--stdin&#34;</span> +</span></span><span class="line"><span class="cl"><span class="p">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Using it in an editor without <code>--fast-only</code> can freeze your editor. +Golangci-lint automatically discovers the <code>.golangci.yml</code> config for the edited file, so you don&rsquo;t need to configure it in VS Code settings.</p> +</div> +</details> +<h3>GNU Emacs<span class="hx:absolute hx:-mt-20" id="gnu-emacs"></span> +<a href="#gnu-emacs" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>There are available plugins:</p> +<ul> +<li><a href="https://github.com/syl20bnr/spacemacs/blob/develop/layers/&#43;lang/go/README.org#linting"target="_blank" rel="noopener">Spacemacs</a></li> +<li><a href="https://github.com/weijiangan/flycheck-golangci-lint"target="_blank" rel="noopener">Flycheck checker</a></li> +</ul> +<h3>Vim<span class="hx:absolute hx:-mt-20" id="vim"></span> +<a href="#vim" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The following plugins support golangci-lint:</p> +<ul> +<li><a href="https://github.com/fatih/vim-go"target="_blank" rel="noopener">vim-go</a></li> +<li><a href="https://github.com/w0rp/ale"target="_blank" rel="noopener">ALE</a></li> +</ul> +<h3>LSP Server<span class="hx:absolute hx:-mt-20" id="lsp-server"></span> +<a href="#lsp-server" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/nametake/golangci-lint-langserver"target="_blank" rel="noopener">golangci-lint-langserver</a> (NeoVim, Vim, Emacs, &hellip;)</p> +<h3>Sublime Text<span class="hx:absolute hx:-mt-20" id="sublime-text"></span> +<a href="#sublime-text" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>There is a <a href="https://github.com/SublimeLinter/SublimeLinter-golangcilint"target="_blank" rel="noopener">plugin</a> for SublimeLinter.</p> +<h2>Shell Completion<span class="hx:absolute hx:-mt-20" id="shell-completion"></span> +<a href="#shell-completion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Golangci-lint can generate Bash, fish, PowerShell, and Zsh completion files.</p> +<p>See the instructions on <code>golangci-lint completion &lt;YOUR_SHELL&gt; --help</code> (replace <code>&lt;YOUR_SHELL&gt;</code> with your favorite one).</p> +<details class="hx:last-of-type:mb-0 hx:rounded-lg hx:bg-neutral-50 hx:dark:bg-neutral-800 hx:p-2 hx:mt-4 hx:group" > +<summary class="hx:flex hx:items-center hx:cursor-pointer hx:select-none hx:list-none hx:p-1 hx:rounded-sm hx:transition-colors hx:hover:bg-gray-100 hx:dark:hover:bg-neutral-800 hx:before:mr-1 hx:before:inline-block hx:before:transition-transform hx:before:content-[''] hx:dark:before:invert hx:rtl:before:rotate-180 hx:group-open:before:rotate-90"> +<span class="hx:text-lg">Bash &amp; macOS</span> +</summary> +<div class="hx:p-2 hx:overflow-hidden"> +<p>There are two versions of <code>bash-completion</code>, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+.</p> +<p>The golangci-lint completion script doesn’t work correctly with bash-completion v1 and Bash 3.2. It requires bash-completion v2 and Bash 4.1+.</p> +<p>Thus, to be able to correctly use golangci-lint completion on macOS, you have to install and use Bash 4.1+ (<a href="https://itnext.io/upgrading-bash-on-macos-7138bd1066ba"target="_blank" rel="noopener">instructions</a>).</p> +<p>The following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).</p> +<p>Install <code>bash-completion v2</code>:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew install bash-completion@2 +</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;export BASH_COMPLETION_COMPAT_DIR=&#34;/usr/local/etc/bash_completion.d&#34;&#39;</span> &gt;&gt;~/.bashrc +</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;[[ -r &#34;/usr/local/etc/profile.d/bash_completion.sh&#34; ]] &amp;&amp; . &#34;/usr/local/etc/profile.d/bash_completion.sh&#34;&#39;</span> &gt;&gt;~/.bashrc +</span></span><span class="line"><span class="cl"><span class="nb">exec</span> bash <span class="c1"># reload and replace (if it was updated) shell</span> +</span></span><span class="line"><span class="cl"><span class="nb">type</span> _init_completion <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">&#34;completion is OK&#34;</span> <span class="c1"># verify that bash-completion v2 is correctly installed</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +<p>Add golangci-lint bash completion:</p> +<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"> +<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;source &lt;(golangci-lint completion bash)&#39;</span> &gt;&gt;~/.bashrc +</span></span><span class="line"><span class="cl"><span class="nb">source</span> ~/.bashrc</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"> +<button +class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50" +title="Copy code" +> +<div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div> +<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div> +</button> +</div> +</div> +</div> +</details> +<h2>CI Integration<span class="hx:absolute hx:-mt-20" id="ci-integration"></span> +<a href="#ci-integration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Check out our <a href="https://golangci-lint.run/docs/welcome/install/#ci-installation">documentation for CI integrations</a>.</p>FAQhttps://golangci-lint.run/docs/welcome/faq/Mon, 01 Jan 0001 00:00:00 +0000https://golangci-lint.run/docs/welcome/faq/ +<h2>Which Go versions are supported?<span class="hx:absolute hx:-mt-20" id="which-go-versions-are-supported"></span> +<a href="#which-go-versions-are-supported" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The same as the Go team (the 2 latest minor versions).</p> +<p>Basically, golangci-lint supports Go versions lower or equal to the Go version used to compile it.</p> +<p>New versions of Go are not automatically supported because, in addition of the Go version used to build it, +some linters and/or internal pieces of golangci-lint could need to be adapted to support this new Go version.</p> +<h2>How to use golangci-lint in CI<span class="hx:absolute hx:-mt-20" id="how-to-use-golangci-lint-in-ci"></span> +<a href="#how-to-use-golangci-lint-in-ci" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Run golangci-lint in CI and check the exit code. If it&rsquo;s non-zero - fail the build.</p> +<p>See <a href="https://golangci-lint.run/docs/welcome/install/#ci-installation">how to properly install golangci-lint in CI</a></p> +<h2>golangci-lint doesn&rsquo;t work<span class="hx:absolute hx:-mt-20" id="golangci-lint-doesnt-work"></span> +<a href="#golangci-lint-doesnt-work" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol> +<li>Please ensure you are using the latest binary release.</li> +<li>Run it with <code>-v</code> option and check the output.</li> +<li>If it doesn&rsquo;t help, create a <a href="https://github.com/golangci/golangci-lint/issues/new/choose"target="_blank" rel="noopener">GitHub issue</a> with the output from the error and #2 above.</li> +</ol> +<h2>Why do you have <code>typecheck</code> errors?<span class="hx:absolute hx:-mt-20" id="why-do-you-have-typecheck-errors"></span> +<a href="#why-do-you-have-typecheck-errors" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><code>typecheck</code> is like a front-end for the Go compiler errors. +Compilation errors are identified/labeled as reports of <code>typecheck</code> but they are not produced by a linter called <code>typecheck</code>.</p> +<p><code>typecheck</code> is not a linter, it doesn&rsquo;t perform any analysis, +it&rsquo;s just a way to identify, parse, and display compiling errors (produced by the <code>types.Checker</code>) and some linter errors.</p> +<p>It cannot be disabled because of that.</p> +<p>Of course, this is just as good as the compiler itself, and a lot of compilation issues will not properly show where in the code your error lies.</p> +<p>As a consequence, the code to analyze should compile. +It means that if you try to run an analysis on a single file or a group of files or a package or a group of packages, +with dependencies on other files or packages of your project, as it doesn&rsquo;t compile (because of the missing pieces of code), +it also cannot be analyzed.</p> +<p>If there are <code>typecheck</code> errors, golangci-lint will not be able to produce other reports because that kind of error doesn&rsquo;t allow it to perform any analysis.</p> +<p>How to troubleshoot:</p> +<ol> +<li>Ensure the version of golangci-lint is built with a compatible version of Go (<code>golangci-lint version</code>).</li> +<li>Ensure dependencies are up to date with <code>go mod tidy</code>.</li> +<li>Ensure building works with <code>go run ./...</code>/<code>go build ./...</code> - whole package.</li> +<li>Ensure you are not running an analysis on code that depends on files/packages outside the scope of the analyzed elements.</li> +<li>If using CGO, ensure all required system libraries are installed.</li> +<li>If you are using private repositories/dependencies, ensure the <a href="https://go.dev/ref/mod#module-proxy"target="_blank" rel="noopener">Go proxy</a> (<code>GOPROXY</code>) and <a href="https://go.dev/ref/mod#checksum-database"target="_blank" rel="noopener">checksum database</a> (<code>GOSUMDB</code>) are right and/or your git configuration.</li> +</ol> +<h2>Why is it not possible to skip/ignore <code>typecheck</code> errors?<span class="hx:absolute hx:-mt-20" id="why-is-it-not-possible-to-skipignore-typecheck-errors"></span> +<a href="#why-is-it-not-possible-to-skipignore-typecheck-errors" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For mainly the same reasons that you cannot compile when you have a compiler error.</p> +<p><code>typecheck</code> errors are reported in the same style as linter reports/issues, +but are completely different because they are related to problems that block the analysis (<code>typecheck</code> is not a linter).</p> +<p>When there are <code>typecheck</code> errors, +most linters are not able to perform the analysis, +and they simply do not produce any reports, +so it&rsquo;s not possible to skip/ignore <code>typecheck</code> errors.</p> +<h2>Why running with <code>--fast-only</code> can be slow on the first run?<span class="hx:absolute hx:-mt-20" id="why-running-with---fast-only-can-be-slow-on-the-first-run"></span> +<a href="#why-running-with---fast-only-can-be-slow-on-the-first-run" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Because the first run caches type information. +All subsequent runs will be faster. +Usually this option is used during development on a local machine and compilation was already performed.</p> +<h2>How do you add a custom linter?<span class="hx:absolute hx:-mt-20" id="how-do-you-add-a-custom-linter"></span> +<a href="#how-do-you-add-a-custom-linter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>You can integrate it yourself, see this <a href="https://golangci-lint.run/docs/contributing/new-linters/">manual</a>. +Or you can create a <a href="https://github.com/golangci/golangci-lint/issues/new?assignees=&amp;labels=enhancement&amp;projects=&amp;template=feature_request.yml"target="_blank" rel="noopener">GitHub Issue</a> and we will integrate when time permits.</p> +<h2>How to integrate golangci-lint into a large project with thousands of issues<span class="hx:absolute hx:-mt-20" id="how-to-integrate-golangci-lint-into-a-large-project-with-thousands-of-issues"></span> +<a href="#how-to-integrate-golangci-lint-into-a-large-project-with-thousands-of-issues" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We are sure that every project can easily integrate golangci-lint, even the large one.</p> +<p>The idea is to not fix all existing issues. +Fix only newly added issue: issues in new code.</p> +<p>To do this, set up the CI to run golangci-lint with options <code>--new-from-merge-base=main</code> or <code>--new-from-rev=HEAD~1</code>.</p> +<p>Also, take a look at option <code>--new</code>, +but consider that CI scripts that generate unstaged files will make <code>--new</code> only point out issues in those files and not in the last commit. +In that regard <code>--new-from-merge-base=main</code> or <code>--new-from-rev=HEAD~1</code> are safer.</p> +<p>By doing this you won&rsquo;t create new issues in your code and can choose fix existing issues (or not).</p> +<h2>Why <code>--new-from-xxx</code> don&rsquo;t seem to be working in some cases?<span class="hx:absolute hx:-mt-20" id="why---new-from-xxx-dont-seem-to-be-working-in-some-cases"></span> +<a href="#why---new-from-xxx-dont-seem-to-be-working-in-some-cases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The options <code>--new-from-merge-base</code>, <code>--new-from-rev</code>, and <code>--new-from-patch</code> work by comparing <code>git diff</code> output and issues.</p> +<p>If an issue is not reported as the same line as the changes then the issue will be skipped. +This is the line of the issue is not inside the lines changed.</p> +<p>To fix that, you have to use the option <code>--whole-files</code>.</p> +<p>The side effect is the issues inside the file that contain changes but not directly related to the changes themselves will be reported.</p> \ No newline at end of file diff --git a/docs/welcome/install/index.html b/docs/welcome/install/index.html new file mode 100644 index 000000000000..3f6355f898b7 --- /dev/null +++ b/docs/welcome/install/index.html @@ -0,0 +1,172 @@ +Install – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Install

    CI installation +

    Most installations of golangci-lint are performed for CI.

    It’s important to have reproducible CI: don’t start to fail all builds at the same time. +With golangci-lint this can happen if you use option linters.default: all and a new linter is added +or even without linters.default: all when one upstream linter is upgraded.

    Important

    It’s highly recommended installing a specific version of golangci-lint available on the releases page.

    GitHub Actions +

    We recommend using our GitHub Action for running golangci-lint in CI for GitHub projects.

    It’s fast and uses smart caching inside, +and it can be much faster than the simple binary installation.

    Also, the action creates GitHub annotations for found issues (you don’t need to dig into build log to see found by golangci-lint issues).

    Console Output
    Annotations

    GitLab CI +

    GitLab provides a guide for integrating golangci-lint into the Code Quality widget. +A simple quickstart is their CI component, which can be used like this:

    .gitlab-ci.yml
    include:
    +  - component: $CI_SERVER_FQDN/components/code-quality-oss/codequality-os-scanners-integration/golangci@1.0.1

    Note that you can only reference components in the same GitLab instance as your project

    Other CI +

    Here is the other way to install golangci-lint:

    # binary will be $(go env GOPATH)/bin/golangci-lint
    +curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.5.0
    +
    +# or install it into ./bin/
    +curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s v2.5.0
    +
    +# In Alpine Linux (as it does not come with curl by default)
    +wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s v2.5.0
    +
    +golangci-lint --version

    It is advised that you periodically update the version of golangci-lint as the project is under active development and is constantly being improved. +For any problems with golangci-lint, check out recent GitHub issues and update if needed.

    Local Installation +

    Packaging status

    Binaries +

    # binary will be $(go env GOPATH)/bin/golangci-lint
    +curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.5.0
    +
    +golangci-lint --version

    On Windows, you can run the above commands with Git Bash, which comes with Git for Windows.

    Linux +

    Golangci-lint is available inside the majority of the package managers.

    macOS +

    Homebrew +

    Note: Homebrew can use an unexpected version of Go to build the binary, +so we recommend either using our binaries or ensuring the version of Go used to build.

    You can install a binary release on macOS using brew:

    brew install golangci-lint
    +brew upgrade golangci-lint

    Note: Previously, we used a Homebrew tap. +We recommend using the official formula instead of the tap, +but sometimes the most recent release isn’t immediately available via Homebrew core due to manual updates that need to occur from Homebrew core maintainers. +In this case, the tap formula, which is updated automatically, +can be used to install the latest version of golangci-lint:

    brew tap golangci/tap
    +brew install golangci/tap/golangci-lint

    MacPorts +

    It can also be installed through MacPorts +The MacPorts installation mode is community-driven and not officially maintained by the golangci team.

    sudo port install golangci-lint

    Windows +

    Chocolatey +

    You can install a binary on Windows using chocolatey.

    choco install golangci-lint

    Scoop +

    You can install a binary on Windows using scoop.

    scoop install main/golangci-lint

    The scoop package is not officially maintained by golangci team.

    Docker +

    docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run

    Colored output:

    docker run -t --rm -v $(pwd):/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run

    Preserving caches between consecutive runs:

    docker run --rm -t -v $(pwd):/app -w /app \
    +--user $(id -u):$(id -g) \
    +-v $(go env GOCACHE):/.cache/go-build -e GOCACHE=/.cache/go-build \
    +-v $(go env GOMODCACHE):/.cache/mod -e GOMODCACHE=/.cache/mod \
    +-v ~/.cache/golangci-lint:/.cache/golangci-lint -e GOLANGCI_LINT_CACHE=/.cache/golangci-lint \
    +golangci/golangci-lint:v2.5.0 golangci-lint run

    Install from Sources +

    Warning

    Using go install/go get, “tools pattern”, and tool command/directives installations aren’t guaranteed to work.
    We recommend using binary installation.

    These installations aren’t recommended because of the following points:

    1. These installations compile golangci-lint locally. The Go version used to build will depend on your local Go version.
    2. Some users use the -u flag for go get, which upgrades our dependencies. The resulting binary was not tested and is not guaranteed to work.
    3. When using the “tools pattern” or tool command/directives, the dependencies of a tool can modify the dependencies of another tool or your project. The resulting binary was not tested and is not guaranteed to work.
    4. We’ve encountered issues with Go module hashes due to the unexpected recreation of dependency tags.
    5. go.mod replacement directives don’t apply transitively. It means a user will be using a patched version of golangci-lint if we use such replacements.
    6. It allows installation from the main branch, which can’t be considered stable.
    7. It’s slower than binary installation.
    go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0
    go tool usage recommendations

    Warning

    We don’t recommend using go tool.

    But if you want to use go tool to install and run golangci-lint (once again we don’t recommend that), +the best approach is to use a dedicated module or module file to isolate golangci-lint from other tools or dependencies.

    This approach avoids modifying your project dependencies and the golangci-lint dependencies.

    Caution

    You should never update golangci-lint dependencies manually.

    Method 1: dedicated module file

    # Create a dedicated module file
    +go mod init -modfile=golangci-lint.mod <your_module_path>/golangci-lint
    +# Example: go mod init -modfile=golangci-lint.mod github.com/org/repo/golangci-lint
    # Add golangci-lint as a tool
    +go get -tool -modfile=golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0
    # Run golangci-lint as a tool
    +go tool -modfile=golangci-lint.mod golangci-lint run
    # Update golangci-lint
    +go get -tool -modfile=golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest

    Method 2: dedicated module

    # Create a dedicated directory
    +mkdir golangci-lint
    # Create a dedicated module file
    +go mod init -modfile=tools/go.mod <your_module_path>/golangci-lint
    +# Example: go mod init -modfile=golangci-lint/go.mod github.com/org/repo/golangci-lint
    # Setup a Go workspace
    +go work init . golangci-lint
    # Add golangci-lint as a tool
    +go get -tool -modfile=golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint
    # Run golangci-lint as a tool
    +go tool golangci-lint run
    # Update golangci-lint
    +go get -tool -modfile=golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
    Last updated on
    \ No newline at end of file diff --git a/docs/welcome/integrations/index.html b/docs/welcome/integrations/index.html new file mode 100644 index 000000000000..995d497abb32 --- /dev/null +++ b/docs/welcome/integrations/index.html @@ -0,0 +1,186 @@ +Integrations – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Integrations

    Editor Integration +

    GoLand +

    Starting from version 2025.1, GoLand has built-in support of golangci-lint. +For IntelliJ IDEA with the Go plugin, please install the plugin.

    Both v1 and v2 versions are supported.

    Visual Studio Code +

    Install the extension.

    Recommended settings for those who installed golangci-lint manually
    "go.lintTool": "golangci-lint",
    +"go.lintFlags": [
    +  "--path-mode=abs",
    +  "--fast-only"
    +],
    +"go.formatTool": "custom",
    +"go.alternateTools": {
    +  "customFormatter": "golangci-lint"
    +},
    +"go.formatFlags": [
    +  "fmt",
    +  "--stdin"
    +]

    Using it in an editor without --fast-only can freeze your editor. +Golangci-lint automatically discovers the .golangci.yml config for the edited file, so you don’t need to configure it in VS Code settings.

    Recommended settings for those who installed golangci-lint via extension

    Install golangci-lint-v2 via the Go: Install/Update Tools command after setting these configs. +This will enable golangci-lint v1 to co-exist with v2. +And use the following settings:

    "go.lintTool": "golangci-lint-v2",
    +"go.lintFlags": [
    +  "--path-mode=abs",
    +  "--fast-only"
    +],
    +"go.formatTool": "custom",
    +"go.alternateTools": {
    +  "customFormatter": "golangci-lint-v2"
    +},
    +"go.formatFlags": [
    +  "fmt",
    +  "--stdin"
    +]

    Using it in an editor without --fast-only can freeze your editor. +Golangci-lint automatically discovers the .golangci.yml config for the edited file, so you don’t need to configure it in VS Code settings.

    GNU Emacs +

    There are available plugins:

    Vim +

    The following plugins support golangci-lint:

    LSP Server +

    golangci-lint-langserver (NeoVim, Vim, Emacs, …)

    Sublime Text +

    There is a plugin for SublimeLinter.

    Shell Completion +

    Golangci-lint can generate Bash, fish, PowerShell, and Zsh completion files.

    See the instructions on golangci-lint completion <YOUR_SHELL> --help (replace <YOUR_SHELL> with your favorite one).

    Bash & macOS

    There are two versions of bash-completion, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+.

    The golangci-lint completion script doesn’t work correctly with bash-completion v1 and Bash 3.2. It requires bash-completion v2 and Bash 4.1+.

    Thus, to be able to correctly use golangci-lint completion on macOS, you have to install and use Bash 4.1+ (instructions).

    The following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).

    Install bash-completion v2:

    brew install bash-completion@2
    +echo 'export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"' >>~/.bashrc
    +echo '[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"' >>~/.bashrc
    +exec bash # reload and replace (if it was updated) shell
    +type _init_completion && echo "completion is OK" # verify that bash-completion v2 is correctly installed

    Add golangci-lint bash completion:

    echo 'source <(golangci-lint completion bash)' >>~/.bashrc
    +source ~/.bashrc

    CI Integration +

    Check out our documentation for CI integrations.

    Last updated on
    \ No newline at end of file diff --git a/docs/welcome/quick-start/index.html b/docs/welcome/quick-start/index.html new file mode 100644 index 000000000000..6b107665a786 --- /dev/null +++ b/docs/welcome/quick-start/index.html @@ -0,0 +1,141 @@ +Quick Start – Golangci-lint
    New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!

    Quick Start

    Linting +

    To run golangci-lint:

    golangci-lint run

    It’s an equivalent of:

    golangci-lint run ./...

    You can choose which directories or files to analyze:

    golangci-lint run dir1 dir2/...
    +golangci-lint run file1.go

    Directories are NOT analyzed recursively. +To analyze them recursively append /... to their path. +It’s not possible to mix files and packages/directories, and files must come from the same package.

    Golangci-lint can be used with zero configuration. By default, the following linters are enabled:

    $ golangci-lint help linters
    +Enabled by default linters:
    +errcheck: Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases.
    +govet: Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes. [auto-fix]
    +ineffassign: Detects when assignments to existing variables are not used. [fast]
    +staticcheck: It's the set of rules from staticcheck. [auto-fix]
    +unused: Checks Go code for unused constants, variables, functions and types.
    +

    Pass -E/--enable to enable linter and -D/--disable to disable:

    golangci-lint run --default=none -E errcheck

    More information about available linters can be found in the linters page.

    Formatting +

    To format your code:

    golangci-lint fmt

    You can choose which directories or files to analyze:

    golangci-lint fmt dir1 dir2/...
    +golangci-lint fmt file1.go

    More information about available formatters can be found in the formatters page.

    Last updated on
    \ No newline at end of file diff --git a/donate/index.html b/donate/index.html new file mode 100644 index 000000000000..72350d4bbc96 --- /dev/null +++ b/donate/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/donate/ \ No newline at end of file diff --git a/en.search-data.json b/en.search-data.json new file mode 100644 index 000000000000..b8799ee9bb02 --- /dev/null +++ b/en.search-data.json @@ -0,0 +1 @@ +{"/docs/":{"data":{"":"Everything you need to know for your golangci-lint journey. Getting StartedGet ready to use golangci-lint LintersList of all the linters FormattersList of all the formatters","contributors#Contributors":"This project exists thanks to all the people who contribute. How to contribute.","stargazers-over-time#Stargazers over time":"","support-us#Support Us":"Golangci-lint is a free and open-source project built by volunteers.\nIf you value it, consider supporting us, we appreciate it!\nDonate ❤️"},"title":"Golangci-lint Documentation"},"/docs/configuration/":{"data":{"":"The config file has lower priority than command-line options. If the same bool/string/int option is provided on the command-line and in the config file, the option from command-line will be used. Slice options (e.g. list of enabled/disabled linters) are combined from the command-line and config file.","more#More":"Command Line Configuration File"},"title":"Configuration"},"/docs/configuration/cli/":{"data":{"":"$ golangci-lint -h Smart, fast linters runner. Usage: golangci-lint [flags] golangci-lint [command] Available Commands: cache Cache control and information. completion Generate the autocompletion script for the specified shell config Configuration file information and verification. custom Build a version of golangci-lint with custom linters. fmt Format Go source files. formatters List current formatters configuration. help Display extra help linters List current linters configuration. migrate Migrate configuration file from v1 to v2. run Lint the code. version Display the golangci-lint version. Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output --version Print version Use \"golangci-lint [command] --help\" for more information about a command.","cache#\u003ccode\u003ecache\u003c/code\u003e":"Golangci-lint stores its cache in the subdirectory golangci-lint inside the default user cache directory.\nYou can override the default cache directory with the environment variable GOLANGCI_LINT_CACHE; the path must be absolute.\nThe cache is only used by golangci-lint run (linters).\n$ golangci-lint cache -h Cache control and information. Usage: golangci-lint cache [flags] golangci-lint cache [command] Available Commands: clean Clean cache status Show cache status Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output Use \"golangci-lint cache [command] --help\" for more information about a command.","completion#\u003ccode\u003ecompletion\u003c/code\u003e":"$ golangci-lint completion -h Generate the autocompletion script for golangci-lint for the specified shell. See each sub-command's help for details on how to use the generated script. Usage: golangci-lint completion [command] Available Commands: bash Generate the autocompletion script for bash fish Generate the autocompletion script for fish powershell Generate the autocompletion script for powershell zsh Generate the autocompletion script for zsh Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output Use \"golangci-lint completion [command] --help\" for more information about a command.","config#\u003ccode\u003econfig\u003c/code\u003e":"$ golangci-lint config -h Configuration file information and verification. Usage: golangci-lint config [flags] golangci-lint config [command] Available Commands: path Print used configuration path. verify Verify configuration against JSON schema. Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output Use \"golangci-lint config [command] --help\" for more information about a command.","custom#\u003ccode\u003ecustom\u003c/code\u003e":"$ golangci-lint custom -h Build a version of golangci-lint with custom linters. Usage: golangci-lint custom [flags] Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output","fmt#fmt":"Formatters Overview Global Configuration Formatter Settings $ golangci-lint fmt -h Format Go source files. Usage: golangci-lint fmt [flags] Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file -E, --enable strings Enable specific formatter -d, --diff Display diffs instead of rewriting files --diff-colored Display diffs instead of rewriting files (with colors) --stdin Use standard input for piping source files Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output","formatters#\u003ccode\u003eformatters\u003c/code\u003e":"$ golangci-lint formatters -h List current formatters configuration. Usage: golangci-lint formatters [flags] Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file -E, --enable strings Enable specific formatter --json Display as JSON Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output","help#\u003ccode\u003ehelp\u003c/code\u003e":"$ golangci-lint help -h Display extra help Usage: golangci-lint help [flags] golangci-lint help [command] Available Commands: formatters Display help for formatters. linters Display help for linters. Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output Use \"golangci-lint help [command] --help\" for more information about a command.","linters#\u003ccode\u003elinters\u003c/code\u003e":"$ golangci-lint linters -h List current linters configuration. Usage: golangci-lint linters [flags] Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file --default string Default set of linters to enable (default \"standard\") -D, --disable strings Disable specific linter -E, --enable strings Enable specific linter --enable-only strings Override linters configuration section to only run the specific linter(s) --fast-only Filter enabled linters to run only fast linters --json Display as JSON Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output","migrate#\u003ccode\u003emigrate\u003c/code\u003e":"$ golangci-lint migrate -h Migrate configuration file from v1 to v2. Usage: golangci-lint migrate [flags] Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file --format string Output file format. By default, the format of the input configuration file is used. It can be 'yml', 'yaml', 'toml', or 'json'. --skip-validation Skip validation of the configuration file against the JSON Schema for v1. Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output","run#\u003ccode\u003erun\u003c/code\u003e":"Linters Overview Global Configuration Linter Settings Note\nThis command executes enabled linters, and the formatters defined in formatters, but it does not format the code.\nTo only format code, use golangci-lint fmt. To apply both linter fixes and formatting, use golangci-lint run --fix.\nThe formatters cannot be enabled or disabled inside the linters section or the flags -E/--enable, -D/--disable of the command golangci-lint run.\nThe formatters can be enabled/disabled by defining them inside the formatters section or by using the flags -E/--enable, -D/--disable of command golangci-lint fmt.\n$ golangci-lint run -h Lint the code. Usage: golangci-lint run [flags] Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file --default string Default set of linters to enable (default \"standard\") -D, --disable strings Disable specific linter -E, --enable strings Enable specific linter --enable-only strings Override linters configuration section to only run the specific linter(s) --fast-only Filter enabled linters to run only fast linters -j, --concurrency int Number of CPUs to use (Default: Automatically set to match Linux container CPU quota and fall back to the number of logical CPUs in the machine) --modules-download-mode string Modules download mode. If not empty, passed as -mod= to go tools --issues-exit-code int Exit code when issues were found (default 1) --build-tags strings Build tags --timeout duration Timeout for total work. Disabled by default --tests Analyze tests (*_test.go) (default true) --allow-parallel-runners Allow multiple parallel golangci-lint instances running. If false (default) - golangci-lint acquires file lock on start. --allow-serial-runners Allow multiple golangci-lint instances running, but serialize them around a lock. If false (default) - golangci-lint exits with an error if it fails to acquire file lock on start. --path-prefix string Path prefix to add to output --path-mode string Path mode to use (empty, or 'abs') --show-stats Show statistics per linter (default true) --output.text.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.text.print-linter-name Print linter name in the end of issue text. (default true) --output.text.print-issued-lines Print lines of code with issue. (default true) --output.text.colors Use colors. (default true) --output.json.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.tab.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.tab.print-linter-name Print linter name in the end of issue text. (default true) --output.tab.colors Use colors. (default true) --output.html.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.checkstyle.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.code-climate.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.junit-xml.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.junit-xml.extended Support extra JUnit XML fields. --output.teamcity.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --output.sarif.path stdout Output path can be either stdout, `stderr` or path to the file to write to. --max-issues-per-linter int Maximum issues count per one linter. Set to 0 to disable (default 50) --max-same-issues int Maximum count of issues with the same text. Set to 0 to disable (default 3) --uniq-by-line Make issues output unique by line (default true) -n, --new Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed. It's a super-useful option for integration of golangci-lint into existing large codebase. It's not practical to fix all existing issues at the moment of integration: much better to not allow issues in new code. For CI setups, prefer --new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate unstaged files before golangci-lint runs. --new-from-rev REV Show only new issues created after git revision REV --new-from-patch PATH Show only new issues created in git patch with file path PATH --new-from-merge-base string Show only new issues created after the best common ancestor (merge-base against HEAD) --whole-files Show issues in any part of update files (requires new-from-rev or new-from-patch) --fix Fix found issues (if it's supported by the linter) --cpu-profile-path string Path to CPU profile output file --mem-profile-path string Path to memory profile output file --trace-path string Path to trace output file Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output When the --cpu-profile-path or --mem-profile-path arguments are specified, golangci-lint writes runtime profiling data in the format expected by the pprof visualization tool.\nWhen the --trace-path argument is specified, golangci-lint writes runtime tracing data in the format expected by the go tool trace command and visualization tool.","version#\u003ccode\u003eversion\u003c/code\u003e":"$ golangci-lint version -h Display the golangci-lint version. Usage: golangci-lint version [flags] Flags: --debug Add build information --json Display as JSON --short Display only the version number Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output"},"title":"Command-Line"},"/docs/configuration/file/":{"data":{"":"Golangci-lint looks for config files in the following paths from the current working directory:\n.golangci.yml .golangci.yaml .golangci.toml .golangci.json Golangci-lint also searches for config files in all directories from the directory of the first analyzed path up to the root. If no configuration file has been found, golangci-lint will try to find one in your home directory. To see which config file is being used and where it was sourced from run golangci-lint with -v option.\nConfig options inside the file are identical to command-line options. You can configure specific linters’ options only within the config file (not the command-line).\nThere is a .golangci.reference.yml file with all supported options, their descriptions, and default values. This file is neither a working example nor a recommended configuration, it’s just a reference to display all the configuration options used to generate the documentation.\nThe configuration file can be validated with the JSON Schema: golangci.jsonschema.json\n# See the dedicated \"version\" documentation section. version: \"2\" linters: # See the dedicated \"linters\" documentation section. option: value formatters: # See the dedicated \"formatters\" documentation section. option: value issues: # See the dedicated \"issues\" documentation section. option: value # Output configuration options. output: # See the dedicated \"output\" documentation section. option: value # Options for analysis running. run: # See the dedicated \"run\" documentation section. option: value severity: # See the dedicated \"severity\" documentation section. option: value","formatters-configuration#\u003ccode\u003eformatters\u003c/code\u003e configuration":"Formatters Overview Formatters Settings formatters: # Enable specific formatter. # Default: [] (uses standard Go formatting) enable: - gci - gofmt - gofumpt - goimports - golines - swaggo # Formatters settings. settings: # See the dedicated \"formatters.settings\" documentation section. option: value exclusions: # Log a warning if an exclusion path is unused. # Default: false warn-unused: true # Mode of the generated files analysis. # # - `strict`: sources are excluded by strictly following the Go generated file convention. # Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\.$` # This line must appear before the first non-comment, non-blank text in the file. # https://go.dev/s/generatedcode # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc. # - `disable`: disable the generated files exclusion. # # Default: lax generated: strict # Which file paths to exclude. # This option is ignored when using `--stdin` as the path is unknown. # Default: [] paths: - \".*\\\\.my\\\\.go$\" - lib/bad.go","issues-configuration#\u003ccode\u003eissues\u003c/code\u003e configuration":"issues: # Maximum issues count per one linter. # Set to 0 to disable. # Default: 50 max-issues-per-linter: 0 # Maximum count of issues with the same text. # Set to 0 to disable. # Default: 3 max-same-issues: 0 # Make issues output unique by line. # Default: true uniq-by-line: false # Show only new issues: if there are unstaged changes or untracked files, # only those changes are analyzed, else only changes in HEAD~ are analyzed. # It's a super-useful option for integration of golangci-lint into existing large codebase. # It's not practical to fix all existing issues at the moment of integration: # much better don't allow issues in new code. # # Default: false new: true # Show only new issues created after the best common ancestor (merge-base against HEAD). # Default: \"\" new-from-merge-base: main # Show only new issues created after git revision `REV`. # Default: \"\" new-from-rev: HEAD # Show only new issues created in git patch with set file path. # Default: \"\" new-from-patch: path/to/patch/file # Show issues in any part of update files (requires new-from-rev or new-from-patch). # Default: false whole-files: true # Fix found issues (if it's supported by the linter). # Default: false fix: true","linters-configuration#\u003ccode\u003elinters\u003c/code\u003e configuration":"Linters Overview Linters Settings linters: # Default set of linters. # The value can be: # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default # - `all`: enables all linters by default. # - `none`: disables all linters by default. # - `fast`: enables only linters considered as \"fast\" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`). # Default: standard default: all # Enable specific linter. enable: - arangolint - asasalint - asciicheck - bidichk - bodyclose - canonicalheader - containedctx - contextcheck - copyloopvar - cyclop - decorder - depguard - dogsled - dupl - dupword - durationcheck - embeddedstructfieldcheck - err113 - errcheck - errchkjson - errname - errorlint - exhaustive - exhaustruct - exptostd - fatcontext - forbidigo - forcetypeassert - funcorder - funlen - ginkgolinter - gocheckcompilerdirectives - gochecknoglobals - gochecknoinits - gochecksumtype - gocognit - goconst - gocritic - gocyclo - godoclint - godot - godox - goheader - gomoddirectives - gomodguard - goprintffuncname - gosec - gosmopolitan - govet - grouper - iface - importas - inamedparam - ineffassign - interfacebloat - intrange - iotamixing - ireturn - lll - loggercheck - maintidx - makezero - mirror - misspell - mnd - musttag - nakedret - nestif - nilerr - nilnesserr - nilnil - nlreturn - noctx - noinlineerr - nolintlint - nonamedreturns - nosprintfhostport - paralleltest - perfsprint - prealloc - predeclared - promlinter - protogetter - reassign - recvcheck - revive - rowserrcheck - sloglint - spancheck - sqlclosecheck - staticcheck - tagalign - tagliatelle - testableexamples - testifylint - testpackage - thelper - tparallel - unconvert - unparam - unqueryvet - unused - usestdlibvars - usetesting - varnamelen - wastedassign - whitespace - wrapcheck - wsl - wsl_v5 - zerologlint # Disable specific linters. disable: - arangolint - asasalint - asciicheck - bidichk - bodyclose - canonicalheader - containedctx - contextcheck - copyloopvar - cyclop - decorder - depguard - dogsled - dupl - dupword - durationcheck - embeddedstructfieldcheck - err113 - errcheck - errchkjson - errname - errorlint - exhaustive - exhaustruct - exptostd - fatcontext - forbidigo - forcetypeassert - funcorder - funlen - ginkgolinter - gocheckcompilerdirectives - gochecknoglobals - gochecknoinits - gochecksumtype - gocognit - goconst - gocritic - gocyclo - godoclint - godot - godox - goheader - gomoddirectives - gomodguard - goprintffuncname - gosec - gosmopolitan - govet - grouper - iface - importas - inamedparam - ineffassign - interfacebloat - intrange - iotamixing - ireturn - lll - loggercheck - maintidx - makezero - mirror - misspell - mnd - musttag - nakedret - nestif - nilerr - nilnesserr - nilnil - nlreturn - noctx - noinlineerr - nolintlint - nonamedreturns - nosprintfhostport - paralleltest - perfsprint - prealloc - predeclared - promlinter - protogetter - reassign - recvcheck - revive - rowserrcheck - sloglint - spancheck - sqlclosecheck - staticcheck - tagalign - tagliatelle - testableexamples - testifylint - testpackage - thelper - tparallel - unconvert - unparam - unqueryvet - unused - usestdlibvars - usetesting - varnamelen - wastedassign - whitespace - wrapcheck - wsl - wsl_v5 - zerologlint # All available settings of specific linters. settings: # See the dedicated \"linters.settings\" documentation section. option: value # Defines a set of rules to ignore issues. # It does not skip the analysis, and so does not ignore \"typecheck\" errors. exclusions: # Mode of the generated files analysis. # # - `strict`: sources are excluded by strictly following the Go generated file convention. # Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\\.$` # This line must appear before the first non-comment, non-blank text in the file. # https://go.dev/s/generatedcode # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc. # - `disable`: disable the generated files exclusion. # # Default: strict generated: lax # Log a warning if an exclusion rule is unused. # Default: false warn-unused: true # Predefined exclusion rules. # Default: [] presets: - comments - std-error-handling - common-false-positives - legacy # Excluding configuration per-path, per-linter, per-text and per-source. rules: # Exclude some linters from running on tests files. - path: _test\\.go linters: - gocyclo - errcheck - dupl - gosec # Run some linter only for test files by excluding its issues for everything else. - path-except: _test\\.go linters: - forbidigo # Exclude known linters from partially hard-vendored code, # which is impossible to exclude via `nolint` comments. # `/` will be replaced by the current OS file path separator to properly work on Windows. - path: internal/hmac/ text: \"weak cryptographic primitive\" linters: - gosec # Exclude some `staticcheck` messages. - linters: - staticcheck text: \"SA9003:\" # Exclude `lll` issues for long lines with `go:generate`. - linters: - lll source: \"^//go:generate \" # Which file paths to exclude: they will be analyzed, but issues from them won't be reported. # \"/\" will be replaced by the current OS file path separator to properly work on Windows. # Default: [] paths: - \".*\\\\.my\\\\.go$\" - lib/bad.go # Which file paths to not exclude. # Default: [] paths-except: - \".*\\\\.my\\\\.go$\" - lib/bad.go","output-configuration#\u003ccode\u003eoutput\u003c/code\u003e configuration":"# Output configuration options. output: # The formats used to render issues. formats: # Prints issues in a text format with colors, line number, and linter name. # This format is the default format. text: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.txt # Print linter name in the end of issue text. # Default: true print-linter-name: false # Print lines of code with issue. # Default: true print-issued-lines: false # Use colors. # Default: true colors: false # Prints issues in a JSON representation. json: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.json # Prints issues in columns representation separated by tabulations. tab: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.txt # Print linter name in the end of issue text. # Default: true print-linter-name: true # Use colors. # Default: true colors: false # Prints issues in an HTML page. # It uses the Cloudflare CDN (cdnjs) and React. html: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.html # Prints issues in the Checkstyle format. checkstyle: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.xml # Prints issues in the Code Climate format. code-climate: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.json # Prints issues in the JUnit XML format. junit-xml: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.xml # Support extra JUnit XML fields. # Default: false extended: true # Prints issues in the TeamCity format. teamcity: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.txt # Prints issues in the SARIF format. sarif: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: ./path/to/output.json # Add a prefix to the output file references. # This option is ignored when using `output.path-mode: abs` mode. # Default: \"\" path-prefix: \"\" # By default, the report are related to the path obtained by `run.relative-path-mode`. # The mode `abs` allows to show absolute file paths instead of relative file paths. # The option `output.path-prefix` is ignored when using `abs` mode. # Default: \"\" path-mode: \"abs\" # Order to use when sorting results. # Possible values: `file`, `linter`, and `severity`. # # If the severity values are inside the following list, they are ordered in this order: # 1. error # 2. warning # 3. high # 4. medium # 5. low # Either they are sorted alphabetically. # # Default: [\"linter\", \"file\"] sort-order: - linter - severity - file # filepath, line, and column. # Show statistics per linter. # Default: true show-stats: false","run-configuration#\u003ccode\u003erun\u003c/code\u003e configuration":"# Options for analysis running. run: # Timeout for total work, e.g. 30s, 5m, 5m30s. # If the value is lower or equal to 0, the timeout is disabled. # Default: 0 (disabled) timeout: 5m # The mode used to evaluate relative paths. # It's used by exclusions, Go plugins, and some linters. # The value can be: # - `gomod`: the paths will be relative to the directory of the `go.mod` file. # - `gitroot`: the paths will be relative to the git root (the parent directory of `.git`). # - `cfg`: the paths will be relative to the configuration file. # - `wd` (NOT recommended): the paths will be relative to the place where golangci-lint is run. # Default: cfg relative-path-mode: gomod # Exit code when at least one issue was found. # Default: 1 issues-exit-code: 2 # Include test files or not. # Default: true tests: false # List of build tags, all linters use it. # Default: [] build-tags: - mytag # If set, we pass it to \"go list -mod={option}\". From \"go help modules\": # If invoked with -mod=readonly, the go command is disallowed from the implicit # automatic updating of go.mod described above. Instead, it fails when any changes # to go.mod are needed. This setting is most useful to check that go.mod does # not need updates, such as in a continuous integration and testing system. # If invoked with -mod=vendor, the go command assumes that the vendor # directory holds the correct copies of dependencies and ignores # the dependency descriptions in go.mod. # # Allowed values: readonly|vendor|mod # Default: \"\" modules-download-mode: readonly # Allow multiple parallel golangci-lint instances running. # If false, golangci-lint acquires file lock on start. # Default: false allow-parallel-runners: true # Allow multiple golangci-lint instances running, but serialize them around a lock. # If false, golangci-lint exits with an error if it fails to acquire file lock on start. # Default: false allow-serial-runners: true # Define the Go version limit. # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.22. go: '1.23' # Number of operating system threads (`GOMAXPROCS`) that can execute golangci-lint simultaneously. # Default: 0 (automatically set to match Linux container CPU quota and # fall back to the number of logical CPUs in the machine) concurrency: 4","severity-configuration#\u003ccode\u003eseverity\u003c/code\u003e configuration":"severity: # Set the default severity for issues. # # If severity rules are defined and the issues do not match or no severity is provided to the rule # this will be the default severity applied. # Severities should match the supported severity names of the selected out format. # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance # # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...) # # Default: \"\" default: error # When a list of severity rules are provided, severity information will be added to lint issues. # Severity rules have the same filtering capability as exclude rules # except you are allowed to specify one matcher per severity rule. # # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...) # # Only affects out formats that support setting severity information. # # Default: [] rules: - linters: - dupl severity: info","version-configuration#\u003ccode\u003eversion\u003c/code\u003e configuration":"# Defines the configuration version. # The only possible value is \"2\". version: \"2\""},"title":"Configuration File"},"/docs/contributing/":{"data":{"":"Contributing workflow Architecture of golangci-lint How to add new linters Debugging golangci-lint FAQ Contributing to this website"},"title":"Contributing"},"/docs/contributing/architecture/":{"data":{"":"There are the following golangci-lint execution steps:\ngraph LR init[Init] loadPackages[Load packages] runLinters[Run linters] postprocess[Postprocess issues] print[Print issues] init --\u003e loadPackages --\u003e runLinters --\u003e postprocess --\u003e print","init#Init":"The configuration is loaded from file and flags by config.Loader inside PersistentPreRun (or PreRun) of the commands that require configuration.\nThe linter database (linterdb.Manager) is fill based on the configuration:\nThe linters (“internals” and plugins) are built by linterdb.LinterBuilder and linterdb.PluginBuilder builders. The configuration is validated by linterdb.Validator.","load-packages#Load Packages":"Loading packages is listing all packages and their recursive dependencies for analysis.\nAlso, depending on the enabled linters set some parsing of the source code can be performed at this step.\nPackages loading starts here:\npkg/lint/package.gofunc (l *PackageLoader) Load(ctx context.Context, linters []*linter.Config) (pkgs, deduplicatedPkgs []*packages.Package, err error) { loadMode := findLoadMode(linters) pkgs, err = l.loadPackages(ctx, loadMode) if err != nil { return nil, nil, fmt.Errorf(\"failed to load packages: %w\", err) } // ... First, we find a load mode as union of load modes for all enabled linters. We use go/packages for packages loading and use it’s enum packages.Need* for load modes. Load mode sets which data does a linter needs for execution.\nA linter that works only with AST need minimum of information: only filenames and AST.\nThere is no need for packages dependencies or type information. AST is built during go/analysis execution to reduce memory usage. Such AST-based linters are configured with the following code:\npkg/lint/linter/config.gofunc (lc *Config) WithLoadFiles() *Config { lc.LoadMode |= packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles return lc } If a linter uses go/analysis and needs type information, we need to extract more data by go/packages:\npkg/lint/linter/config.gofunc (lc *Config) WithLoadForGoAnalysis() *Config { lc = lc.WithLoadFiles() lc.LoadMode |= packages.NeedImports | packages.NeedDeps | packages.NeedExportFile | packages.NeedTypesSizes lc.IsSlow = true return lc } After finding a load mode, we run go/packages: the library get list of dirs (or ./... as the default value) as input and outputs list of packages and requested information about them: filenames, type information, AST, etc.","postprocess-issues#Postprocess Issues":"We have an abstraction of result.Processor to postprocess found issues:\n./pkg/result/processors/ cgo.go diff.go exclusion_generated_file_filter.go exclusion_generated_file_matcher.go exclusion_paths.go exclusion_presets.go exclusion_rules.go filename_unadjuster.go fixer.go identifier_marker.go invalid_issue.go issues.go max_from_linter.go max_per_file_from_linter.go max_same_issues.go nolint_filter.go path_absoluter.go path_prettifier.go path_relativity.go path_shortener.go processor.go severity.go sort_results.go source_code.go uniq_by_line.go The abstraction is simple:\npkg/result/processors/processor.gotype Processor interface { Process(issues []*result.Issue) ([]*result.Issue, error) Name() string Finish() } A processor can hide issues (nolint, exclude) or change issues (path_prettifier).","print-issues#Print Issues":"We have an abstraction for printing found issues.\n./pkg/printers/ checkstyle.go codeclimate.go html.go json.go junitxml.go printer.go sarif.go tab.go teamcity.go text.go","run-linters#Run Linters":"First, we need to find all enabled linters. All linters are registered here:\npkg/lint/lintersdb/builder_linter.gofunc (b LinterBuilder) Build(cfg *config.Config) []*linter.Config { // ... return []*linter.Config{ // ... linter.NewConfig(golinters.NewBodyclose()). WithSince(\"v1.18.0\"). WithLoadForGoAnalysis(). WithURL(\"https://github.com/timakin/bodyclose/"), // ... linter.NewConfig(golinters.NewGovet(govetCfg)). WithGroups(config.GroupStandard). WithSince(\"v1.0.0\"). WithLoadForGoAnalysis(). WithURL(\"https://pkg.go.dev/cmd/vet/"), // ... } } We filter requested in config and command-line linters in EnabledSet:\npkg/lint/lintersdb/manager.gofunc (m *Manager) GetEnabledLintersMap() (map[string]*linter.Config, error) We merge enabled linters into one MetaLinter to improve execution time if we can:\npkg/lint/lintersdb/manager.go// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters into a fewer number of linters. // E.g. some go/analysis linters can be optimized into one metalinter for data reuse and speed up. func (m *Manager) GetOptimizedLinters() ([]*linter.Config, error) { // ... m.combineGoAnalysisLinters(resultLintersSet) // ... } The MetaLinter just stores all merged linters inside to run them at once:\npkg/goanalysis/metalinter.gotype MetaLinter struct { linters []*Linter analyzerToLinterName map[*analysis.Analyzer]string } Currently, all linters except unused can be merged into this meta linter.\nThe unused isn’t merged because it has high memory usage.\nLinters execution starts in runAnalyzers. It’s the most complex part of the golangci-lint. We use custom go/analysis runner there.\nIt runs as much as it can in parallel. It lazy-loads as much as it can to reduce memory usage. Also, it sets all heavyweight data to nil as becomes unneeded to save memory.\nWe don’t use existing multichecker because it doesn’t use caching and doesn’t have some important performance optimizations.\nAll found by linters issues are represented with result.Issue struct:\npkg/result/issue.gotype Issue struct { FromLinter string Text string Severity string // Source lines of a code with the issue to show SourceLines []string // Pkg is needed for proper caching of linting results Pkg *packages.Package `json:\"-\"` Pos token.Position LineRange *Range `json:\",omitempty\"` // HunkPos is used only when golangci-lint is run over a diff HunkPos int `json:\",omitempty\"` // If we know how to fix the issue we can provide replacement lines SuggestedFixes []analysis.SuggestedFix `json:\",omitempty\"` // If we are expecting a nolint (because this is from nolintlint), record the expected linter ExpectNoLint bool ExpectedNoLintLinter string // ... }"},"title":"Architecture"},"/docs/contributing/debug/":{"data":{"":"You can see a verbose output of linter by using -v option.\ngolangci-lint run -v If you would like to see more detailed logs you can use the environment variable GL_DEBUG.\nIts value is a list of debug tags.\nThe existing debug tags are documented in the following file: /pkg/logutils/logutils.go\nFor example:\nGL_DEBUG=\"loader,gocritic\" golangci-lint run GL_DEBUG=\"loader,env\" golangci-lint run"},"title":"Debugging"},"/docs/contributing/faq/":{"data":{"":"","how-to-add-a-configuration-option-to-an-existing-linter#How to add a configuration option to an existing linter":"Add a new field to the linter settings struct.\nDocument it in .golangci.next.reference.yml.\nPass it to the linter.","how-to-add-a-new-open-source-linter-to-golangci-lint#How to add a new open-source linter to \u003ccode\u003egolangci-lint\u003c/code\u003e":"See there.","how-to-add-a-new-private-linter-to-golangci-lint#How to add a new private linter to \u003ccode\u003egolangci-lint\u003c/code\u003e":"See there.","how-to-see-info-or-debug-logs#How to see \u003ccode\u003eINFO\u003c/code\u003e or \u003ccode\u003eDEBUG\u003c/code\u003e logs":"See tutorial about debugging.","how-to-update-an-existing-linter#How to update an existing linter":"We use Dependabot to update dependencies, including linters.\nThe updates happen at least automatically once a week (Sunday 11am UTC).\nNo pull requests to update a linter will be accepted unless you are the author of the linter and specific changes are required."},"title":"FAQ"},"/docs/contributing/new-linters/":{"data":{"":"","how-to-add-a-private-linter-to-golangci-lint#How to add a private linter to \u003ccode\u003egolangci-lint\u003c/code\u003e":"Some people and organizations may choose to have custom-made linters run as a part of golangci-lint.\nTypically, these linters can’t be open-sourced or too specific.\nSuch linters can be added through 2 plugin systems:\nModule Plugin System Recommended Go Plugin System","how-to-add-a-public-linter-to-golangci-lint#How to add a public linter to \u003ccode\u003egolangci-lint\u003c/code\u003e":"You need to implement a new linter using go/analysis API.\nWe don’t accept non go/analysis linters.\nAfter that:\nImplement functional tests for the linter: Add one file into directory pkg/golinters/{yourlintername}/testdata/. Add a new file pkg/golinters/{yourlintername}/{yourlintername}.go. Other linters implementation can help you. Add the new struct for the linter (which you’ve implemented in pkg/golinters/{yourlintername}/{yourlintername}.go) to the list of all supported linters in pkg/lint/lintersdb/builder_linter.go to the method LinterBuilder.Build. Add WithSince(\"next_version\"), where next_version must be replaced by the next minor version. (ex: v1.2.0 if the current version is v1.1.0) Find out what options do you need to configure for the linter. For example, nakedret has only 1 option: max-func-lines. Choose default values to not being annoying for users of golangci-lint. Add configuration options to: .golangci.next.reference.yml: the example of a configuration file. You can also add them to .golangci.yml if you think that this project needs not default values. config struct: don’t forget about mapstructure tags for proper configuration files parsing. Take a look at the example of pull requests with new linter support. Run the tests: go run ./cmd/golangci-lint/ run --no-config --default=none --enable={yourlintername} ./pkg/golinters/{yourlintername}/testdata/{yourlintername}.go","how-to-write-a-linter#How to write a linter":"Use go/analysis and take a look at this tutorial: it shows how to write go/analysis linter from scratch and integrate it into golangci-lint."},"title":"New linters"},"/docs/contributing/website/":{"data":{"":"","hosting#Hosting":"We use GitHub Pages for static website hosting and CD.\nGitHub deploys the website to production after merging anything to a main branch.","local-testing#Local Testing":"Install Hugo Extended (v0.148.1 or newer).\nRun:\n# (in the root of the repository) make docs_serve or\n# (in the root of the repository) make website_expand_templates cd docs/ # (inside the docs/ folder) make serve And navigate to http://localhost:1313 after a successful build.\nThere is no need to restart the Hugo server for almost all changes: it supports hot reload.\nAlso, there is no need to refresh a webpage: hot reload updates changed content on the open page.","some-notes#Some Notes":"shortcodes:\ncannot be used inside another shortcode can only be used inside a page can contain Markdown or HTML, but the tag is different: {{% shortcode %}} vs {{\u003c shortcode \u003e}} partials:\nare reusable HTML blocks or “functions” cannot be used inside a page can be used inside another partial can be used inside a shortcode can be used inside a layout","source-code#Source Code":"The website lives in docs/ directory of golangci-lint repository.","technology#Technology":"We use Hugo for static site generation because sites built with it are very fast.","templating#Templating":"We use shortcodes and partials based on files from ./docs/.tmp/ and ./docs/data/.\nThe files in ./docs/.tmp/ are used to be embedded with the shortcode {{% golangci/embed file=\"filename.ext\" %}}. The files in ./docs/data/ are used as data sources. These files are created by running:\nmake website_expand_templates in the root of the repository. make website_dump_info in the root of the repository. (only during a release)","theme#Theme":"The site is based on hextra theme.","website-build#Website Build":"To do this, run:\n# (in the root of the repository) make docs_build or\n# (in the root of the repository) make website_copy_jsonschema website_expand_templates cd docs/ # (inside the docs/ folder) make build"},"title":"This Website"},"/docs/contributing/workflow/":{"data":{"":"By participating in this project, you agree to abide our code of conduct.","create-or-update-parameters-for-docs#Create or update parameters for docs":"Add your new or updated parameters to .golangci.next.reference.yml so they will be shown in the docs","new-releases#New releases":"First, see our versioning policy.\nTo make a new release create a tag vX.Y.Z.\nDon’t forget to add zero patch version for a new minor release, e.g. v1.99.0.\nA GitHub Action workflow will start building and publishing release after that.\nAfter making a release, you need to update GitHub Action config by running:\nmake assets/github-action-config.json","pull-request-checks#Pull request checks":"First, please, accept CLA - CLA assistant will make a comment on the pull request about it.\nAlso, we run a few checks in CI by using GitHub Actions, you can see them here.","set-up-your-machine#Set up your machine":"Golangci-lint is written in Go.\nPrerequisites:\nmake Go Fork and clone golangci-lint repository.\nA good way of making sure everything is all right is running the following:\nmake build ./golangci-lint run -v","submit-a-pull-request#Submit a pull request":"Push your branch to your golangci-lint fork and open a pull request against the main branch.","test-your-change#Test your change":"When you are satisfied with the changes, we suggest you run:\nmake test Which runs all the linters and tests."},"title":"Workflow"},"/docs/donate/":{"data":{"":"Golangci-lint is a free and open-source project built by volunteers.\nIf you value it, consider supporting us, we appreciate it! ❤️\nYou can support us via:\nGitHub SponsorsCredit card Open CollectiveCredit card, PayPal, etc. Thanks.devCredit card"},"title":"Support Us"},"/docs/formatters/configuration/":{"data":{"":"","gci#gci":"Check if code and import statements are formatted, with additional rules.\nSince golangci-lint v1.30.0 Autofix Repository formatters: settings: gci: # Section configuration to compare against. # Section names are case-insensitive and may contain parameters in (). # The default order of sections is `standard \u003e default \u003e custom \u003e blank \u003e dot \u003e alias \u003e localmodule`. # If `custom-order` is `true`, it follows the order of `sections` option. # Default: [\"standard\", \"default\"] sections: - standard # Standard section: captures all standard packages. - default # Default section: contains all imports that could not be matched to another section type. - prefix(github.com/org/project) # Custom section: groups all imports with the specified Prefix. - blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled. - dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled. - alias # Alias section: contains all alias imports. This section is not present unless explicitly enabled. - localmodule # Local module section: contains all local packages. This section is not present unless explicitly enabled. # Checks that no inline comments are present. # Default: false no-inline-comments: true # Checks that no prefix comments (comment lines above an import) are present. # Default: false no-prefix-comments: true # Enable custom order of sections. # If `true`, make the section order the same as the order of `sections`. # Default: false custom-order: true # Drops lexical ordering for custom sections. # Default: false no-lex-order: true","gofmt#gofmt":"Check if the code is formatted according to 'gofmt' command.\nSince golangci-lint v1.0.0 Autofix Repository formatters: settings: gofmt: # Simplify code: gofmt with `-s` option. # Default: true simplify: false # Apply the rewrite rules to the source before reformatting. # https://pkg.go.dev/cmd/gofmt # Default: [] rewrite-rules: - pattern: 'interface{}' replacement: 'any' - pattern: 'a[b:len(a)]' replacement: 'a[b:]'","gofumpt#gofumpt":"Check if code and import statements are formatted, with additional rules.\nSince golangci-lint v1.28.0 Autofix Repository formatters: settings: gofumpt: # Module path which contains the source code being formatted. # Default: \"\" module-path: github.com/org/project # Choose whether to use the extra rules. # Default: false extra-rules: true","goimports#goimports":"Checks if the code and import statements are formatted according to the 'goimports' command.\nSince golangci-lint v1.20.0 Autofix Repository formatters: settings: goimports: # A list of prefixes, which, if set, checks import paths # with the given prefixes are grouped after 3rd-party packages. # Default: [] local-prefixes: - github.com/org/project","golines#golines":"Checks if code is formatted, and fixes long lines.\nSince golangci-lint v2.0.0 Autofix Repository formatters: settings: golines: # Target maximum line length. # Default: 100 max-len: 200 # Length of a tabulation. # Default: 4 tab-len: 8 # Shorten single-line comments. # Default: false shorten-comments: true # Default: true reformat-tags: false # Split chained methods on the dots as opposed to the arguments. # Default: true chain-split-dots: false","swaggo#swaggo":"Check if swaggo comments are formatted.\nSince golangci-lint v2.2.0 Autofix Repository No settings available."},"title":"Settings"},"/docs/linters/configuration/":{"data":{"":"","arangolint#arangolint":"Opinionated best practices for arangodb client.\nSince golangci-lint v2.2.0 Repository No settings available.","asasalint#asasalint":"Check for pass []any as any in variadic func(…any).\nSince golangci-lint v1.47.0 Repository linters: settings: asasalint: # To specify a set of function names to exclude. # The values are merged with the builtin exclusions. # The builtin exclusions can be disabled by setting `use-builtin-exclusions` to `false`. # Default: [\"^(fmt|log|logger|t|)\\.(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$\"] exclude: - Append - \\.Wrapf # To enable/disable the asasalint builtin exclusions of function names. # See the default value of `exclude` to get the builtin exclusions. # Default: true use-builtin-exclusions: false","asciicheck#asciicheck":"Checks that all code identifiers does not have non-ASCII symbols in the name.\nSince golangci-lint v1.26.0 Repository No settings available.","bidichk#bidichk":"Checks for dangerous unicode character sequences.\nSince golangci-lint v1.43.0 Repository linters: settings: bidichk: # The following configurations check for all mentioned invisible Unicode runes. # All runes are enabled by default. left-to-right-embedding: false right-to-left-embedding: false pop-directional-formatting: false left-to-right-override: false right-to-left-override: false left-to-right-isolate: false right-to-left-isolate: false first-strong-isolate: false pop-directional-isolate: false","bodyclose#bodyclose":"Checks whether HTTP response body is closed successfully.\nSince golangci-lint v1.18.0 Repository No settings available.","canonicalheader#canonicalheader":"Canonicalheader checks whether net/http.Header uses canonical header.\nSince golangci-lint v1.58.0 Autofix Repository No settings available.","containedctx#containedctx":"Containedctx is a linter that detects struct contained context.Context field.\nSince golangci-lint v1.44.0 Repository No settings available.","contextcheck#contextcheck":"Check whether the function uses a non-inherited context.\nSince golangci-lint v1.43.0 Repository No settings available.","copyloopvar#copyloopvar":"A linter detects places where loop variables are copied.\nSince golangci-lint v1.57.0 Autofix Repository linters: settings: copyloopvar: # Check all assigning the loop variable to another variable. # Default: false check-alias: true","cyclop#cyclop":"Checks function and package cyclomatic complexity.\nSince golangci-lint v1.37.0 Repository linters: settings: cyclop: # The maximal code complexity to report. # Default: 10 max-complexity: 10 # The maximal average package complexity. # If it's higher than 0.0 (float) the check is enabled. # Default: 0.0 package-average: 0.5","decorder#decorder":"Check declaration order and count of types, constants, variables and functions.\nSince golangci-lint v1.44.0 Repository linters: settings: decorder: # Required order of `type`, `const`, `var` and `func` declarations inside a file. # Default: types before constants before variables before functions. dec-order: - type - const - var - func # If true, underscore vars (vars with \"_\" as the name) will be ignored at all checks. # Default: false (underscore vars are not ignored) ignore-underscore-vars: false # If true, order of declarations is not checked at all. # Default: true (disabled) disable-dec-order-check: false # If true, `init` func can be anywhere in file (does not have to be declared before all other functions). # Default: true (disabled) disable-init-func-first-check: false # If true, multiple global `type`, `const` and `var` declarations are allowed. # Default: true (disabled) disable-dec-num-check: false # If true, type declarations will be ignored for dec num check. # Default: false (type statements are not ignored) disable-type-dec-num-check: false # If true, const declarations will be ignored for dec num check. # Default: false (const statements are not ignored) disable-const-dec-num-check: false # If true, var declarations will be ignored for dec num check. # Default: false (var statements are not ignored) disable-var-dec-num-check: false","depguard#depguard":"Go linter that checks if package imports are in a list of acceptable packages.\nSince golangci-lint v1.4.0 Repository linters: settings: depguard: # Rules to apply. # # Variables: # - File Variables # Use an exclamation mark `!` to negate a variable. # Example: `!$test` matches any file that is not a go test file. # # `$all` - matches all go files # `$test` - matches all go test files # # - Package Variables # # `$gostd` - matches all of go's standard library (Pulled from `GOROOT`) # # Default (applies if no custom rules are defined): Only allow $gostd in all files. rules: # Name of a rule. main: # Defines package matching behavior. Available modes: # - `original`: allowed if it doesn't match the deny list and either matches the allow list or the allow list is empty. # - `strict`: allowed only if it matches the allow list and either doesn't match the deny list or the allow rule is more specific (longer) than the deny rule. # - `lax`: allowed if it doesn't match the deny list or the allow rule is more specific (longer) than the deny rule. # Default: \"original\" list-mode: lax # List of file globs that will match this list of settings to compare against. # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed. # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`. # The placeholder '${config-path}' is substituted with a path relative to the configuration file. # Default: $all files: - \"!**/*_a _file.go\" # List of allowed packages. # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $). # Default: [] allow: - $gostd - github.com/OpenPeeDeeP # List of packages that are not allowed. # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $). # Default: [] deny: - pkg: \"math/rand$\" desc: use math/rand/v2 - pkg: \"github.com/sirupsen/logrus\" desc: not allowed - pkg: \"github.com/pkg/errors\" desc: Should be replaced by standard lib errors package","dogsled#dogsled":"Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()).\nSince golangci-lint v1.19.0 Repository linters: settings: dogsled: # Checks assignments with too many blank identifiers. # Default: 2 max-blank-identifiers: 3","dupl#dupl":"Detects duplicate fragments of code.\nSince golangci-lint v1.0.0 Repository linters: settings: dupl: # Tokens count to trigger issue. # Default: 150 threshold: 100","dupword#dupword":"Checks for duplicate words in the source code.\nSince golangci-lint v1.50.0 Autofix Repository linters: settings: dupword: # Keywords for detecting duplicate words. # If this list is not empty, only the words defined in this list will be detected. # Default: [] keywords: - \"the\" - \"and\" - \"a\" # Keywords used to ignore detection. # Default: [] ignore: - \"0C0C\"","durationcheck#durationcheck":"Check for two durations multiplied together.\nSince golangci-lint v1.37.0 Repository No settings available.","embeddedstructfieldcheck#embeddedstructfieldcheck":"Embedded types should be at the top of the field list of a struct, and there must be an empty line separating embedded fields from regular fields.\nSince golangci-lint v2.2.0 Repository linters: settings: embeddedstructfieldcheck: # Checks that there is an empty space between the embedded fields and regular fields. # Default: true empty-line: false # Checks that sync.Mutex and sync.RWMutex are not used as embedded fields. # Default: false forbid-mutex: true","err113#err113":"Check errors handling expressions.\nSince golangci-lint v1.26.0 Autofix Repository No settings available.","errcheck#errcheck":"Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases.\nSince golangci-lint v1.0.0 Repository linters: settings: errcheck: # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. # Such cases aren't reported by default. # Default: false check-type-assertions: true # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`. # Such cases aren't reported by default. # Default: false check-blank: true # To disable the errcheck built-in exclude list. # See `-excludeonly` option in https://github.com/kisielk/errcheck#excluding-functions for details. # Default: false disable-default-exclusions: true # List of functions to exclude from checking, where each entry is a single function to exclude. # See https://github.com/kisielk/errcheck#excluding-functions for details. exclude-functions: - io/ioutil.ReadFile - io.Copy(*bytes.Buffer) - io.Copy(os.Stdout) # Display function signature instead of selector. # Default: false verbose: true","errchkjson#errchkjson":"Checks types passed to the json encoding functions. Reports unsupported types and reports occurrences where the check for the returned error can be omitted.\nSince golangci-lint v1.44.0 Repository linters: settings: errchkjson: # With check-error-free-encoding set to true, errchkjson does warn about errors # from json encoding functions that are safe to be ignored, # because they are not possible to happen. # # if check-error-free-encoding is set to true and errcheck linter is enabled, # it is recommended to add the following exceptions to prevent from false positives: # # linters: # settings: # errcheck: # exclude-functions: # - encoding/json.Marshal # - encoding/json.MarshalIndent # # Default: false check-error-free-encoding: true # Issue on struct encoding that doesn't have exported fields. # Default: false report-no-exported: false","errname#errname":"Checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error.\nSince golangci-lint v1.42.0 Repository No settings available.","errorlint#errorlint":"Find code that can cause problems with the error wrapping scheme introduced in Go 1.13.\nSince golangci-lint v1.32.0 Autofix Repository linters: settings: errorlint: # Check whether fmt.Errorf uses the %w verb for formatting errors. # See the https://github.com/polyfloyd/go-errorlint for caveats. # Default: true errorf: false # Permit more than 1 %w verb, valid per Go 1.20 (requires `errorf: true`). # Default: true errorf-multi: false # Check for plain type assertions and type switches. # Default: true asserts: false # Check for plain error comparisons. # Default: true comparison: false # Allowed errors. # Default: [] allowed-errors: - err: \"io.EOF\" fun: \"example.com/pkg.Read\" # Allowed error \"wildcards\". # Default: [] allowed-errors-wildcard: - err: \"example.com/pkg.ErrMagic\" fun: \"example.com/pkg.Magic\"","exhaustive#exhaustive":"Check exhaustiveness of enum switch statements.\nSince golangci-lint v1.28.0 Repository linters: settings: exhaustive: # Program elements to check for exhaustiveness. # Default: [ switch ] check: - switch - map # Presence of \"default\" case in switch statements satisfies exhaustiveness, # even if all enum members are not listed. # Default: false default-signifies-exhaustive: true # Enum members matching the supplied regex do not have to be listed in # switch statements to satisfy exhaustiveness. # Default: \"\" ignore-enum-members: \"Example.+\" # Enum types matching the supplied regex do not have to be listed in # switch statements to satisfy exhaustiveness. # Default: \"\" ignore-enum-types: \"Example.+\" # Consider enums only in package scopes, not in inner scopes. # Default: false package-scope-only: true # Only run exhaustive check on switches with \"//exhaustive:enforce\" comment. # Default: false explicit-exhaustive-switch: true # Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment. # Default: false explicit-exhaustive-map: true # Switch statement requires default case even if exhaustive. # Default: false default-case-required: true","exhaustruct#exhaustruct":"Checks if all structure fields are initialized.\nSince golangci-lint v1.46.0 Repository linters: settings: exhaustruct: # List of regular expressions to match type names that should be processed. # Anonymous structs can be matched by '' alias. # # Each regular expression must match the full type name, including package path. # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`, # but not `http\\.Cookie`. # Default: [] include: - '.+\\.Test' - 'example\\.com/package\\.ExampleStruct[\\d]{1,2}' # List of regular expressions to match type names that should be excluded from processing. # Anonymous structs can be matched by '' alias. # Has precedence over `include`. # Each regular expression must match the full type name, including package path. # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`, # but not `http\\.Cookie`. # Default: [] exclude: - '.+/cobra\\.Command$' # Allows empty structures, effectively excluding them from the check. # Default: false allow-empty: true # List of regular expressions to match type names that should be allowed to be empty. # Anonymous structs can be matched by '' alias. # Each regular expression must match the full type name, including package path. # For example, to match type `net/http.Cookie` regular expression should be `.*/http\\.Cookie`, # but not `http\\.Cookie`. # Default: [] allow-empty-rx: - '.*/http\\.Cookie' # Allows empty structures in return statements. # Default: false allow-empty-returns: true # Allows empty structures in variable declarations. # Default: false allow-empty-declarations: true","exptostd#exptostd":"Detects functions from golang.org/x/exp/ that can be replaced by std functions.\nSince golangci-lint v1.63.0 Autofix Repository No settings available.","fatcontext#fatcontext":"Detects nested contexts in loops and function literals.\nSince golangci-lint v1.58.0 Autofix Repository linters: settings: fatcontext: # Check for potential fat contexts in struct pointers. # May generate false positives. # Default: false check-struct-pointers: true","forbidigo#forbidigo":"Forbids identifiers.\nSince golangci-lint v1.34.0 Repository linters: settings: forbidigo: # Forbid the following identifiers (list of regexp). # Default: [\"^(fmt\\\\.Print(|f|ln)|print|println)$\"] forbid: # Built-in bootstrapping functions. - pattern: ^print(ln)?$ # Optional message that gets included in error reports. - pattern: ^fmt\\.Print.*$ msg: Do not commit print statements. # Alternatively, put messages at the end of the regex, surrounded by `(# )?`. # Escape any special characters. Those messages get included in error reports. - pattern: 'fmt\\.Print.*(# Do not commit print statements\\.)?' # Forbid spew Dump, whether it is called as function or method. # Depends on analyze-types below. - pattern: ^spew\\.(ConfigState\\.)?Dump$ # The package name might be ambiguous. # The full import path can be used as additional criteria. # Depends on analyze-types below. - pattern: ^v1.Dump$ pkg: ^example.com/pkg/api/v1$ # Exclude godoc examples from forbidigo checks. # Default: true exclude-godoc-examples: false # Instead of matching the literal source code, # use type information to replace expressions with strings that contain the package name # and (for methods and fields) the type name. # This makes it possible to handle import renaming and forbid struct fields and methods. # Default: false analyze-types: true","forcetypeassert#forcetypeassert":"Find forced type assertions.\nSince golangci-lint v1.38.0 Repository No settings available.","funcorder#funcorder":"Checks the order of functions, methods, and constructors.\nSince golangci-lint v2.1.0 Repository linters: settings: funcorder: # Checks that constructors are placed after the structure declaration. # Default: true constructor: false # Checks if the exported methods of a structure are placed before the non-exported ones. # Default: true struct-method: false # Checks if the constructors and/or structure methods are sorted alphabetically. # Default: false alphabetical: true","funlen#funlen":"Checks for long functions.\nSince golangci-lint v1.18.0 Repository linters: settings: funlen: # Checks the number of lines in a function. # If lower than 0, disable the check. # Default: 60 lines: -1 # Checks the number of statements in a function. # If lower than 0, disable the check. # Default: 40 statements: -1 # Ignore comments when counting lines. # Default: true ignore-comments: false","ginkgolinter#ginkgolinter":"Enforces standards of using ginkgo and gomega.\nSince golangci-lint v1.51.0 Autofix Repository linters: settings: ginkgolinter: # Suppress the wrong length assertion warning. # Default: false suppress-len-assertion: true # Suppress the wrong nil assertion warning. # Default: false suppress-nil-assertion: true # Suppress the wrong error assertion warning. # Default: false suppress-err-assertion: true # Suppress the wrong comparison assertion warning. # Default: false suppress-compare-assertion: true # Suppress the function all in async assertion warning. # Default: false suppress-async-assertion: true # Suppress warning for comparing values from different types, like `int32` and `uint32`. # Default: false suppress-type-compare-assertion: true # Trigger warning for ginkgo focus containers like `FDescribe`, `FContext`, `FWhen` or `FIt`. # Default: false forbid-focus-container: true # Don't trigger warnings for HaveLen(0) # Default: false allow-havelen-zero: true # Force using `Expect` with `To`, `ToNot` or `NotTo`. # Reject using `Expect` with `Should` or `ShouldNot`. # Default: false force-expect-to: true # Best effort validation of async intervals (timeout and polling). # Ignored the `suppress-async-assertion` is true. # Default: false validate-async-intervals: true # Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`. # Default: false forbid-spec-pollution: true # Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values. # Default: false force-succeed: true # Force adding assertion descriptions to gomega matchers. # Default: false force-assertion-description: true # Force using `ToNot`, `ShouldNot` instead of `To(Not())`. # Default: false force-tonot: true","gocheckcompilerdirectives#gocheckcompilerdirectives":"Checks that go compiler directive comments (//go:) are valid.\nSince golangci-lint v1.51.0 Repository No settings available.","gochecknoglobals#gochecknoglobals":"Check that no global variables exist.\nSince golangci-lint v1.12.0 Repository No settings available.","gochecknoinits#gochecknoinits":"Checks that no init functions are present in Go code.\nSince golangci-lint v1.12.0 No settings available.","gochecksumtype#gochecksumtype":"Run exhaustiveness checks on Go \"sum types\".\nSince golangci-lint v1.55.0 Repository linters: settings: gochecksumtype: # Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed. # Default: true default-signifies-exhaustive: false # Include shared interfaces in the exhaustiveness check. # Default: false include-shared-interfaces: true","gocognit#gocognit":"Computes and checks the cognitive complexity of functions.\nSince golangci-lint v1.20.0 Repository linters: settings: gocognit: # Minimal code complexity to report. # Default: 30 (but we recommend 10-20) min-complexity: 10","goconst#goconst":"Finds repeated strings that could be replaced by a constant.\nSince golangci-lint v1.0.0 Repository linters: settings: goconst: # Minimal length of string constant. # Default: 3 min-len: 2 # Minimum occurrences of constant string count to trigger issue. # Default: 3 min-occurrences: 2 # Look for existing constants matching the values. # Default: true match-constant: false # Search also for duplicated numbers. # Default: false numbers: true # Minimum value, only works with `goconst.numbers`. # Default: 3 min: 2 # Maximum value, only works with `goconst.numbers`. # Default: 3 max: 2 # Ignore when constant is not used as function argument. # Default: true ignore-calls: false # Exclude strings matching the given regular expression. # Default: \"\" ignore-string-values: - 'foo.+' # Detects constants with identical values. # Default: false find-duplicates: true # Evaluates of constant expressions like Prefix + \"suffix\". # Default: false eval-const-expressions: true","gocritic#gocritic":"Provides diagnostics that check for bugs, performance and style issues. Extensible without recompilation through dynamic rules. Dynamic rules are written declaratively with AST patterns, filters, report message and optional suggestion.\nSince golangci-lint v1.12.0 Autofix Repository linters: settings: gocritic: # Disable all checks. # Default: false disable-all: true # Which checks should be enabled in addition to default checks; can't be combined with 'disabled-checks'. # By default, list of stable checks is used (https://go-critic.com/overview#checks-overview): # appendAssign, argOrder, assignOp, badCall, badCond, captLocal, caseOrder, codegenComment, commentFormatting, # defaultCaseOrder, deprecatedComment, dupArg, dupBranchBody, dupCase, dupSubExpr, elseif, exitAfterDefer, # flagDeref, flagName, ifElseChain, mapKey, newDeref, offBy1, regexpMust, singleCaseSwitch, sloppyLen, # sloppyTypeAssert, switchTrue, typeSwitchVar, underef, unlambda, unslice, valSwap, wrapperFunc # To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`. enabled-checks: # Detects suspicious append result assignments. # https://go-critic.com/overview.html#appendassign - appendAssign # Detects `append` chains to the same slice that can be done in a single `append` call. # https://go-critic.com/overview.html#appendcombine - appendCombine # Detects suspicious arguments order. # https://go-critic.com/overview.html#argorder - argOrder # Detects assignments that can be simplified by using assignment operators. # https://go-critic.com/overview.html#assignop - assignOp # Detects suspicious function calls. # https://go-critic.com/overview.html#badcall - badCall # Detects suspicious condition expressions. # https://go-critic.com/overview.html#badcond - badCond # Detects suspicious mutex lock/unlock operations. # https://go-critic.com/overview.html#badlock - badLock # Detects suspicious regexp patterns. # https://go-critic.com/overview.html#badregexp - badRegexp # Detects bad usage of sort package. # https://go-critic.com/overview.html#badsorting - badSorting # Detects bad usage of sync.OnceFunc. # https://go-critic.com/overview.html#badsynconcefunc - badSyncOnceFunc # Detects bool expressions that can be simplified. # https://go-critic.com/overview.html#boolexprsimplify - boolExprSimplify # Detects when predeclared identifiers are shadowed in assignments. # https://go-critic.com/overview.html#builtinshadow - builtinShadow # Detects top-level declarations that shadow the predeclared identifiers. # https://go-critic.com/overview.html#builtinshadowdecl - builtinShadowDecl # Detects capitalized names for local variables. # https://go-critic.com/overview.html#captlocal - captLocal # Detects erroneous case order inside switch statements. # https://go-critic.com/overview.html#caseorder - caseOrder # Detects malformed 'code generated' file comments. # https://go-critic.com/overview.html#codegencomment - codegenComment # Detects comments with non-idiomatic formatting. # https://go-critic.com/overview.html#commentformatting - commentFormatting # Detects commented-out code inside function bodies. # https://go-critic.com/overview.html#commentedoutcode - commentedOutCode # Detects commented-out imports. # https://go-critic.com/overview.html#commentedoutimport - commentedOutImport # Detects when default case in switch isn't on 1st or last position. # https://go-critic.com/overview.html#defaultcaseorder - defaultCaseOrder # Detects loops inside functions that use defer. # https://go-critic.com/overview.html#deferinloop - deferInLoop # Detects deferred function literals that can be simplified. # https://go-critic.com/overview.html#deferunlambda - deferUnlambda # Detects malformed 'deprecated' doc-comments. # https://go-critic.com/overview.html#deprecatedcomment - deprecatedComment # Detects comments that silence go lint complaints about doc-comment. # https://go-critic.com/overview.html#docstub - docStub # Detects suspicious duplicated arguments. # https://go-critic.com/overview.html#duparg - dupArg # Detects duplicated branch bodies inside conditional statements. # https://go-critic.com/overview.html#dupbranchbody - dupBranchBody # Detects duplicated case clauses inside switch or select statements. # https://go-critic.com/overview.html#dupcase - dupCase # Detects multiple imports of the same package under different aliases. # https://go-critic.com/overview.html#dupimport - dupImport # Detects suspicious duplicated sub-expressions. # https://go-critic.com/overview.html#dupsubexpr - dupSubExpr # Detects suspicious formatting strings usage. # https://go-critic.com/overview.html#dynamicfmtstring - dynamicFmtString # Detects else with nested if statement that can be replaced with else-if. # https://go-critic.com/overview.html#elseif - elseif # Detects suspicious empty declarations blocks. # https://go-critic.com/overview.html#emptydecl - emptyDecl # Detects fallthrough that can be avoided by using multi case values. # https://go-critic.com/overview.html#emptyfallthrough - emptyFallthrough # Detects empty string checks that can be written more idiomatically. # https://go-critic.com/overview.html#emptystringtest - emptyStringTest # Detects unoptimal strings/bytes case-insensitive comparison. # https://go-critic.com/overview.html#equalfold - equalFold # Detects unwanted dependencies on the evaluation order. # https://go-critic.com/overview.html#evalorder - evalOrder # Detects calls to exit/fatal inside functions that use defer. # https://go-critic.com/overview.html#exitafterdefer - exitAfterDefer # Detects exposed methods from sync.Mutex and sync.RWMutex. # https://go-critic.com/overview.html#exposedsyncmutex - exposedSyncMutex # Detects suspicious reassignment of error from another package. # https://go-critic.com/overview.html#externalerrorreassign - externalErrorReassign # Detects problems in filepath.Join() function calls. # https://go-critic.com/overview.html#filepathjoin - filepathJoin # Detects immediate dereferencing of `flag` package pointers. # https://go-critic.com/overview.html#flagderef - flagDeref # Detects suspicious flag names. # https://go-critic.com/overview.html#flagname - flagName # Detects hex literals that have mixed case letter digits. # https://go-critic.com/overview.html#hexliteral - hexLiteral # Detects nil usages in http.NewRequest calls, suggesting http.NoBody as an alternative. # https://go-critic.com/overview.html#httpnobody - httpNoBody # Detects params that incur excessive amount of copying. # https://go-critic.com/overview.html#hugeparam - hugeParam # Detects repeated if-else statements and suggests to replace them with switch statement. # https://go-critic.com/overview.html#ifelsechain - ifElseChain # Detects when imported package names shadowed in the assignments. # https://go-critic.com/overview.html#importshadow - importShadow # Detects strings.Index calls that may cause unwanted allocs. # https://go-critic.com/overview.html#indexalloc - indexAlloc # Detects non-assignment statements inside if/switch init clause. # https://go-critic.com/overview.html#initclause - initClause # Detects suspicious map literal keys. # https://go-critic.com/overview.html#mapkey - mapKey # Detects method expression call that can be replaced with a method call. # https://go-critic.com/overview.html#methodexprcall - methodExprCall # Finds where nesting level could be reduced. # https://go-critic.com/overview.html#nestingreduce - nestingReduce # Detects immediate dereferencing of `new` expressions. # https://go-critic.com/overview.html#newderef - newDeref # Detects return statements those results evaluate to nil. # https://go-critic.com/overview.html#nilvalreturn - nilValReturn # Detects old-style octal literals. # https://go-critic.com/overview.html#octalliteral - octalLiteral # Detects various off-by-one kind of errors. # https://go-critic.com/overview.html#offby1 - offBy1 # Detects if function parameters could be combined by type and suggest the way to do it. # https://go-critic.com/overview.html#paramtypecombine - paramTypeCombine # Detects expressions like []rune(s)[0] that may cause unwanted rune slice allocation. # https://go-critic.com/overview.html#preferdecoderune - preferDecodeRune # Detects concatenation with os.PathSeparator which can be replaced with filepath.Join. # https://go-critic.com/overview.html#preferfilepathjoin - preferFilepathJoin # Detects fmt.Sprint(f/ln) calls which can be replaced with fmt.Fprint(f/ln). # https://go-critic.com/overview.html#preferfprint - preferFprint # Detects w.Write or io.WriteString calls which can be replaced with w.WriteString. # https://go-critic.com/overview.html#preferstringwriter - preferStringWriter # Detects WriteRune calls with rune literal argument that is single byte and reports to use WriteByte instead. # https://go-critic.com/overview.html#preferwritebyte - preferWriteByte # Detects input and output parameters that have a type of pointer to referential type. # https://go-critic.com/overview.html#ptrtorefparam - ptrToRefParam # Detects append all its data while range it. # https://go-critic.com/overview.html#rangeappendall - rangeAppendAll # Detects expensive copies of `for` loop range expressions. # https://go-critic.com/overview.html#rangeexprcopy - rangeExprCopy # Detects loops that copy big objects during each iteration. # https://go-critic.com/overview.html#rangevalcopy - rangeValCopy # Detects redundant fmt.Sprint calls. # https://go-critic.com/overview.html#redundantsprint - redundantSprint # Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`. # https://go-critic.com/overview.html#regexpmust - regexpMust # Detects suspicious regexp patterns. # https://go-critic.com/overview.html#regexppattern - regexpPattern # Detects regexp patterns that can be simplified. # https://go-critic.com/overview.html#regexpsimplify - regexpSimplify # Detects suspicious http.Error call without following return. # https://go-critic.com/overview.html#returnafterhttperror - returnAfterHttpError # Runs user-defined rules using ruleguard linter. # https://go-critic.com/overview.html#ruleguard - ruleguard # Detects switch statements that could be better written as if statement. # https://go-critic.com/overview.html#singlecaseswitch - singleCaseSwitch # Detects slice clear loops, suggests an idiom that is recognized by the Go compiler. # https://go-critic.com/overview.html#sliceclear - sliceClear # Detects usage of `len` when result is obvious or doesn't make sense. # https://go-critic.com/overview.html#sloppylen - sloppyLen # Detects suspicious/confusing re-assignments. # https://go-critic.com/overview.html#sloppyreassign - sloppyReassign # Detects redundant type assertions. # https://go-critic.com/overview.html#sloppytypeassert - sloppyTypeAssert # Detects suspicious sort.Slice calls. # https://go-critic.com/overview.html#sortslice - sortSlice # Detects \"%s\" formatting directives that can be replaced with %q. # https://go-critic.com/overview.html#sprintfquotedstring - sprintfQuotedString # Detects issue in Query() and Exec() calls. # https://go-critic.com/overview.html#sqlquery - sqlQuery # Detects string concat operations that can be simplified. # https://go-critic.com/overview.html#stringconcatsimplify - stringConcatSimplify # Detects redundant conversions between string and []byte. # https://go-critic.com/overview.html#stringxbytes - stringXbytes # Detects strings.Compare usage. # https://go-critic.com/overview.html#stringscompare - stringsCompare # Detects switch-over-bool statements that use explicit `true` tag value. # https://go-critic.com/overview.html#switchtrue - switchTrue # Detects sync.Map load+delete operations that can be replaced with LoadAndDelete. # https://go-critic.com/overview.html#syncmaploadanddelete - syncMapLoadAndDelete # Detects manual conversion to milli- or microseconds. # https://go-critic.com/overview.html#timeexprsimplify - timeExprSimplify # Detects TODO comments without detail/assignee. # https://go-critic.com/overview.html#todocommentwithoutdetail - todoCommentWithoutDetail # Detects function with too many results. # https://go-critic.com/overview.html#toomanyresultschecker - tooManyResultsChecker # Detects potential truncation issues when comparing ints of different sizes. # https://go-critic.com/overview.html#truncatecmp - truncateCmp # Detects repeated type assertions and suggests to replace them with type switch statement. # https://go-critic.com/overview.html#typeassertchain - typeAssertChain # Detects method declarations preceding the type definition itself. # https://go-critic.com/overview.html#typedeffirst - typeDefFirst # Detects type switches that can benefit from type guard clause with variable. # https://go-critic.com/overview.html#typeswitchvar - typeSwitchVar # Detects unneeded parenthesis inside type expressions and suggests to remove them. # https://go-critic.com/overview.html#typeunparen - typeUnparen # Detects unchecked errors in if statements. # https://go-critic.com/overview.html#uncheckedinlineerr - uncheckedInlineErr # Detects dereference expressions that can be omitted. # https://go-critic.com/overview.html#underef - underef # Detects redundant statement labels. # https://go-critic.com/overview.html#unlabelstmt - unlabelStmt # Detects function literals that can be simplified. # https://go-critic.com/overview.html#unlambda - unlambda # Detects unnamed results that may benefit from names. # https://go-critic.com/overview.html#unnamedresult - unnamedResult # Detects unnecessary braced statement blocks. # https://go-critic.com/overview.html#unnecessaryblock - unnecessaryBlock # Detects redundantly deferred calls. # https://go-critic.com/overview.html#unnecessarydefer - unnecessaryDefer # Detects slice expressions that can be simplified to sliced expression itself. # https://go-critic.com/overview.html#unslice - unslice # Detects value swapping code that are not using parallel assignment. # https://go-critic.com/overview.html#valswap - valSwap # Detects conditions that are unsafe due to not being exhaustive. # https://go-critic.com/overview.html#weakcond - weakCond # Ensures that `//nolint` comments include an explanation. # https://go-critic.com/overview.html#whynolint - whyNoLint # Detects function calls that can be replaced with convenience wrappers. # https://go-critic.com/overview.html#wrapperfunc - wrapperFunc # Detects Yoda style expressions and suggests to replace them. # https://go-critic.com/overview.html#yodastyleexpr - yodaStyleExpr # Enable all checks. # Default: false enable-all: true # Which checks should be disabled; can't be combined with 'enabled-checks'. # Default: [] disabled-checks: - appendAssign - appendCombine - argOrder - assignOp - badCall - badCond - badLock - badRegexp - badSorting - badSyncOnceFunc - boolExprSimplify - builtinShadow - builtinShadowDecl - captLocal - caseOrder - codegenComment - commentFormatting - commentedOutCode - commentedOutImport - defaultCaseOrder - deferInLoop - deferUnlambda - deprecatedComment - docStub - dupArg - dupBranchBody - dupCase - dupImport - dupSubExpr - dynamicFmtString - elseif - emptyDecl - emptyFallthrough - emptyStringTest - equalFold - evalOrder - exitAfterDefer - exposedSyncMutex - externalErrorReassign - filepathJoin - flagDeref - flagName - hexLiteral - httpNoBody - hugeParam - ifElseChain - importShadow - indexAlloc - initClause - mapKey - methodExprCall - nestingReduce - newDeref - nilValReturn - octalLiteral - offBy1 - paramTypeCombine - preferDecodeRune - preferFilepathJoin - preferFprint - preferStringWriter - preferWriteByte - ptrToRefParam - rangeAppendAll - rangeExprCopy - rangeValCopy - redundantSprint - regexpMust - regexpPattern - regexpSimplify - returnAfterHttpError - ruleguard - singleCaseSwitch - sliceClear - sloppyLen - sloppyReassign - sloppyTypeAssert - sortSlice - sprintfQuotedString - sqlQuery - stringConcatSimplify - stringXbytes - stringsCompare - switchTrue - syncMapLoadAndDelete - timeExprSimplify - todoCommentWithoutDetail - tooManyResultsChecker - truncateCmp - typeAssertChain - typeDefFirst - typeSwitchVar - typeUnparen - uncheckedInlineErr - underef - unlabelStmt - unlambda - unnamedResult - unnecessaryBlock - unnecessaryDefer - unslice - valSwap - weakCond - whyNoLint - wrapperFunc - yodaStyleExpr # Enable multiple checks by tags in addition to default checks. # Run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic` to see all tags and checks. # See https://github.com/go-critic/go-critic#usage -\u003e section \"Tags\". # Default: [] enabled-tags: - diagnostic - style - performance - experimental - opinionated disabled-tags: - diagnostic - style - performance - experimental - opinionated # Settings passed to gocritic. # The settings key is the name of a supported gocritic checker. # The list of supported checkers can be found at https://go-critic.com/overview. settings: # Must be valid enabled check name. captLocal: # Whether to restrict checker to params only. # Default: true paramsOnly: false commentedOutCode: # Min length of the comment that triggers a warning. # Default: 15 minLength: 50 elseif: # Whether to skip balanced if-else pairs. # Default: true skipBalanced: false hugeParam: # Size in bytes that makes the warning trigger. # Default: 80 sizeThreshold: 70 ifElseChain: # Min number of if-else blocks that makes the warning trigger. # Default: 2 minThreshold: 4 nestingReduce: # Min number of statements inside a branch to trigger a warning. # Default: 5 bodyWidth: 4 rangeExprCopy: # Size in bytes that makes the warning trigger. # Default: 512 sizeThreshold: 516 # Whether to check test functions # Default: true skipTestFuncs: false rangeValCopy: # Size in bytes that makes the warning trigger. # Default: 128 sizeThreshold: 32 # Whether to check test functions. # Default: true skipTestFuncs: false ruleguard: # Enable debug to identify which 'Where' condition was rejected. # The value of the parameter is the name of a function in a ruleguard file. # # When a rule is evaluated: # If: # The Match() clause is accepted; and # One of the conditions in the Where() clause is rejected, # Then: # ruleguard prints the specific Where() condition that was rejected. # # The option is passed to the ruleguard 'debug-group' argument. # Default: \"\" debug: 'emptyDecl' # Determines the behavior when an error occurs while parsing ruleguard files. # If flag is not set, log error and skip rule files that contain an error. # If flag is set, the value must be a comma-separated list of error conditions. # - 'all': fail on all errors. # - 'import': ruleguard rule imports a package that cannot be found. # - 'dsl': gorule file does not comply with the ruleguard DSL. # Default: \"\" failOn: dsl,import # Comma-separated list of file paths containing ruleguard rules. # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed. # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`. # The placeholder '${config-path}' is substituted with a path relative to the configuration file. # Glob patterns such as 'rules-*.go' may be specified. # Default: \"\" rules: '${base-path}/ruleguard/rules-*.go,${base-path}/myrule1.go' # Comma-separated list of enabled groups or skip empty to enable everything. # Tags can be defined with # character prefix. # Default: \"\" enable: \"myGroupName,#myTagName\" # Comma-separated list of disabled groups or skip empty to enable everything. # Tags can be defined with # character prefix. # Default: \"\" disable: \"myGroupName,#myTagName\" tooManyResultsChecker: # Maximum number of results. # Default: 5 maxResults: 10 truncateCmp: # Whether to skip int/uint/uintptr types. # Default: true skipArchDependent: false underef: # Whether to skip (*x).method() calls where x is a pointer receiver. # Default: true skipRecvDeref: false unnamedResult: # Whether to check exported functions. # Default: false checkExported: true","gocyclo#gocyclo":"Computes and checks the cyclomatic complexity of functions.\nSince golangci-lint v1.0.0 Repository linters: settings: gocyclo: # Minimal code complexity to report. # Default: 30 (but we recommend 10-20) min-complexity: 10","godoclint#godoclint":"Checks Golang's documentation practice (godoc).\nSince golangci-lint v2.5.0 New Repository linters: settings: godoclint: # Default set of rules to enable. # Possible values are: `basic`, `all` or `none`. # Default: `basic` (enables `pkg-doc`, `single-pkg-doc`, `start-with-name`, and `deprecated`) default: all # List of rules to enable in addition to the default set. # Default: empty enable: # Check proper package-level godoc, if any. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#pkg-doc - pkg-doc # Assert at most one godoc per package. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#single-pkg-doc - single-pkg-doc # Require all packages to have a godoc. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-pkg-doc - require-pkg-doc # Assert symbol godocs start with the symbol name. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#start-with-name - start-with-name # Require godoc for all public symbols. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#require-doc - require-doc # Assert correct formatting of deprecation notes. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#deprecated - deprecated # Assert maximum line length for godocs. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#max-len - max-len # Assert no unused link in godocs. # https://github.com/godoc-lint/godoc-lint?tab=readme-ov-file#no-unused-link - no-unused-link # List of rules to disable. # Default: empty disable: - pkg-doc - single-pkg-doc - require-pkg-doc - start-with-name - require-doc - deprecated - max-len - no-unused-link # A map for fine-tuning individual rules. # All subkeys are optional. options: max-len: # Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens. # Default: 77 length: 127 require-doc: # Ignore exported (public) symbols when applying the `require-doc` rule. # Default: false ignore-exported: true # Ignore unexported (private) symbols when applying the `require-doc` rule. # Default: true ignore-unexported: false start-with-name: # Include unexported symbols when applying the `start-with-name` rule. # Default: false include-unexported: true","godot#godot":"Check if comments end in a period.\nSince golangci-lint v1.25.0 Autofix Repository linters: settings: godot: # Comments to be checked: `declarations`, `toplevel`, `noinline` or `all`. # Default: declarations scope: toplevel # List of regexps for excluding particular comment lines from check. # Default: [] exclude: # Exclude todo and fixme comments. - \"^fixme:\" - \"^todo:\" # Check that each sentence ends with a period. # Default: true period: false # Check that each sentence starts with a capital letter. # Default: false capital: true","godox#godox":"Detects usage of FIXME, TODO and other keywords inside comments.\nSince golangci-lint v1.19.0 Repository linters: settings: godox: # Report any comments starting with keywords, this is useful for TODO or FIXME comments that # might be left in the code accidentally and should be resolved before merging. # Default: [\"TODO\", \"BUG\", \"FIXME\"] keywords: - NOTE - OPTIMIZE # marks code that should be optimized before merging - HACK # marks hack-around that should be removed before merging","goheader#goheader":"Check if file header matches to pattern.\nSince golangci-lint v1.28.0 Autofix Repository linters: settings: goheader: # Supports two types 'const` and `regexp`. # Values can be used recursively. # Default: {} values: const: # Define here const type values in format k:v. # For example: COMPANY: MY COMPANY regexp: # Define here regexp type values. # for example: AUTHOR: .*@mycompany\\.com # The template used for checking. # Put here copyright header template for source code files. # Note: {{ YEAR }} is a builtin value that returns the year relative to the current machine time. # Default: \"\" template: |- {{ AUTHOR }} {{ COMPANY }} {{ YEAR }} SPDX-License-Identifier: Apache-2.0 Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. # As alternative of directive 'template', you may put the path to file with the template source. # Useful if you need to load the template from a specific file. # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed. # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`. # The placeholder '${config-path}' is substituted with a path relative to the configuration file. # Default: \"\" template-path: /path/to/my/template.tmpl","gomoddirectives#gomoddirectives":"Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.\nSince golangci-lint v1.39.0 Repository linters: settings: gomoddirectives: # Allow local `replace` directives. # Default: false replace-local: true # List of allowed `replace` directives. # Default: [] replace-allow-list: - launchpad.net/gocheck # Allow to not explain why the version has been retracted in the `retract` directives. # Default: false retract-allow-no-explanation: true # Forbid the use of the `exclude` directives. # Default: false exclude-forbidden: true # Forbid the use of the `ignore` directives (\u003e= go1.25). # Default: false ignore-forbidden: true # Forbid the use of the `toolchain` directive. # Default: false toolchain-forbidden: true # Defines a pattern to validate `toolchain` directive. # Default: '' (no match) toolchain-pattern: 'go1\\.23\\.\\d+$' # Forbid the use of the `tool` directives. # Default: false tool-forbidden: true # Forbid the use of the `godebug` directive. # Default: false go-debug-forbidden: true # Defines a pattern to validate `go` minimum version directive. # Default: '' (no match) go-version-pattern: '\\d\\.\\d+(\\.0)?'","gomodguard#gomodguard":"Allow and blocklist linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.\nSince golangci-lint v1.25.0 Repository linters: settings: gomodguard: allowed: # List of allowed modules. # Default: [] modules: - gopkg.in/yaml.v2 # List of allowed module domains. # Default: [] domains: - golang.org blocked: # List of blocked modules. # Default: [] modules: # Blocked module. - github.com/uudashr/go-module: # Recommended modules that should be used instead. (Optional) recommendations: - golang.org/x/mod # Reason why the recommended module should be used. (Optional) reason: \"`mod` is the official go.mod parser library.\" # List of blocked module version constraints. # Default: [] versions: # Blocked module with version constraint. - github.com/mitchellh/go-homedir: # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons. version: \"\u003c 1.1.0\" # Reason why the version constraint exists. (Optional) reason: \"testing if blocked version constraint works.\" # Set to true to raise lint issues for packages that are loaded from a local path via replace directive. # Default: false local-replace-directives: false","goprintffuncname#goprintffuncname":"Checks that printf-like functions are named with f at the end.\nSince golangci-lint v1.23.0 Repository No settings available.","gosec#gosec":"Inspects source code for security problems.\nSince golangci-lint v1.0.0 Repository linters: settings: gosec: # To select a subset of rules to run. # Available rules: https://github.com/securego/gosec#available-rules # Default: [] - means include all rules includes: - G101 # Look for hard coded credentials - G102 # Bind to all interfaces - G103 # Audit the use of unsafe block - G104 # Audit errors not checked - G106 # Audit the use of ssh.InsecureIgnoreHostKey - G107 # Url provided to HTTP request as taint input - G108 # Profiling endpoint automatically exposed on /debug/pprof - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32 - G110 # Potential DoS vulnerability via decompression bomb - G111 # Potential directory traversal - G112 # Potential slowloris attack - G114 # Use of net/http serve function that has no support for setting timeouts - G115 # Potential integer overflow when converting between integer types - G201 # SQL query construction using format string - G202 # SQL query construction using string concatenation - G203 # Use of unescaped data in HTML templates - G204 # Audit use of command execution - G301 # Poor file permissions used when creating a directory - G302 # Poor file permissions used with chmod - G303 # Creating tempfile using a predictable path - G304 # File path provided as taint input - G305 # File traversal when extracting zip/tar archive - G306 # Poor file permissions used when writing to a new file - G307 # Poor file permissions used when creating a file with os.Create - G401 # Detect the usage of MD5 or SHA1 - G402 # Look for bad TLS connection settings - G403 # Ensure minimum RSA key length of 2048 bits - G404 # Insecure random number source (rand) - G405 # Detect the usage of DES or RC4 - G406 # Detect the usage of MD4 or RIPEMD160 - G501 # Import blocklist: crypto/md5 - G502 # Import blocklist: crypto/des - G503 # Import blocklist: crypto/rc4 - G504 # Import blocklist: net/http/cgi - G505 # Import blocklist: crypto/sha1 - G506 # Import blocklist: golang.org/x/crypto/md4 - G507 # Import blocklist: golang.org/x/crypto/ripemd160 - G601 # Implicit memory aliasing of items from a range statement - G602 # Slice access out of bounds # To specify a set of rules to explicitly exclude. # Available rules: https://github.com/securego/gosec#available-rules # Default: [] excludes: - G101 # Look for hard coded credentials - G102 # Bind to all interfaces - G103 # Audit the use of unsafe block - G104 # Audit errors not checked - G106 # Audit the use of ssh.InsecureIgnoreHostKey - G107 # Url provided to HTTP request as taint input - G108 # Profiling endpoint automatically exposed on /debug/pprof - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32 - G110 # Potential DoS vulnerability via decompression bomb - G111 # Potential directory traversal - G112 # Potential slowloris attack - G114 # Use of net/http serve function that has no support for setting timeouts - G115 # Potential integer overflow when converting between integer types - G201 # SQL query construction using format string - G202 # SQL query construction using string concatenation - G203 # Use of unescaped data in HTML templates - G204 # Audit use of command execution - G301 # Poor file permissions used when creating a directory - G302 # Poor file permissions used with chmod - G303 # Creating tempfile using a predictable path - G304 # File path provided as taint input - G305 # File traversal when extracting zip/tar archive - G306 # Poor file permissions used when writing to a new file - G307 # Poor file permissions used when creating a file with os.Create - G401 # Detect the usage of MD5 or SHA1 - G402 # Look for bad TLS connection settings - G403 # Ensure minimum RSA key length of 2048 bits - G404 # Insecure random number source (rand) - G405 # Detect the usage of DES or RC4 - G406 # Detect the usage of MD4 or RIPEMD160 - G501 # Import blocklist: crypto/md5 - G502 # Import blocklist: crypto/des - G503 # Import blocklist: crypto/rc4 - G504 # Import blocklist: net/http/cgi - G505 # Import blocklist: crypto/sha1 - G506 # Import blocklist: golang.org/x/crypto/md4 - G507 # Import blocklist: golang.org/x/crypto/ripemd160 - G601 # Implicit memory aliasing of items from a range statement - G602 # Slice access out of bounds # Filter out the issues with a lower severity than the given value. # Valid options are: low, medium, high. # Default: low severity: medium # Filter out the issues with a lower confidence than the given value. # Valid options are: low, medium, high. # Default: low confidence: medium # Concurrency value. # Default: the number of logical CPUs usable by the current process. concurrency: 12 # To specify the configuration of rules. config: # Globals are applicable to all rules. global: # If true, ignore #nosec in comments (and an alternative as well). # Default: false nosec: true # Add an alternative comment prefix to #nosec (both will work at the same time). # Default: \"\" \"#nosec\": \"#my-custom-nosec\" # Define whether nosec issues are counted as finding or not. # Default: false show-ignored: true # Audit mode enables addition checks that for normal code analysis might be too nosy. # Default: false audit: true G101: # Regexp pattern for variables and constants to find. # Default: \"(?i)passwd|pass|password|pwd|secret|token|pw|apiKey|bearer|cred\" pattern: \"(?i)example\" # If true, complain about all cases (even with low entropy). # Default: false ignore_entropy: false # Maximum allowed entropy of the string. # Default: \"80.0\" entropy_threshold: \"80.0\" # Maximum allowed value of entropy/string length. # Is taken into account if entropy \u003e= entropy_threshold/2. # Default: \"3.0\" per_char_threshold: \"3.0\" # Calculate entropy for first N chars of the string. # Default: \"16\" truncate: \"32\" # Additional functions to ignore while checking unhandled errors. # Following functions always ignored: # bytes.Buffer: # - Write # - WriteByte # - WriteRune # - WriteString # fmt: # - Print # - Printf # - Println # - Fprint # - Fprintf # - Fprintln # strings.Builder: # - Write # - WriteByte # - WriteRune # - WriteString # io.PipeWriter: # - CloseWithError # hash.Hash: # - Write # os: # - Unsetenv # Default: {} G104: fmt: - Fscanf G111: # Regexp pattern to find potential directory traversal. # Default: \"http\\\\.Dir\\\\(\\\"\\\\/\\\"\\\\)|http\\\\.Dir\\\\('\\\\/'\\\\)\" pattern: \"custom\\\\.Dir\\\\(\\\\)\" # Maximum allowed permissions mode for os.Mkdir and os.MkdirAll. # Default: \"0750\" G301: \"0750\" # Maximum allowed permissions mode for os.OpenFile and os.Chmod. # Default: \"0600\" G302: \"0600\" # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile. # Default: \"0600\" G306: \"0600\"","gosmopolitan#gosmopolitan":"Report certain i18n/l10n anti-patterns in your Go codebase.\nSince golangci-lint v1.53.0 Repository linters: settings: gosmopolitan: # Allow and ignore `time.Local` usages. # # Default: false allow-time-local: true # List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\". # String literals inside call-like expressions to, or struct literals of those names, # are exempt from the writing system check. # # Default: [] escape-hatches: - 'github.com/nicksnyder/go-i18n/v2/i18n.Message' - 'example.com/your/project/i18n/markers.Raw' - 'example.com/your/project/i18n/markers.OK' - 'example.com/your/project/i18n/markers.TODO' - 'command-line-arguments.Simple' # List of Unicode scripts to watch for any usage in string literals. # https://pkg.go.dev/unicode#pkg-variables # # Default: [\"Han\"] watch-for-scripts: - Devanagari - Han - Hangul - Hiragana - Katakana","govet#govet":"Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes.\nSince golangci-lint v1.0.0 Autofix Repository linters: settings: govet: # Disable all analyzers. # Default: false disable-all: true # Enable analyzers by name. # (In addition to default: # appends, asmdecl, assign, atomic, bools, buildtag, cgocall, composites, copylocks, defers, directive, errorsas, # framepointer, httpresponse, ifaceassert, loopclosure, lostcancel, nilfunc, printf, shift, sigchanyzer, slog, # stdmethods, stringintconv, structtag, testinggoroutine, tests, timeformat, unmarshal, unreachable, unsafeptr, # unusedresult # ). # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers. # Default: [] enable: # Check for missing values after append. - appends # Report mismatches between assembly files and Go declarations. - asmdecl # Check for useless assignments. - assign # Check for common mistakes using the sync/atomic package. - atomic # Check for non-64-bits-aligned arguments to sync/atomic functions. - atomicalign # Check for common mistakes involving boolean operators. - bools # Check //go:build and // +build directives. - buildtag # Detect some violations of the cgo pointer passing rules. - cgocall # Check for unkeyed composite literals. - composites # Check for locks erroneously passed by value. - copylocks # Check for calls of reflect.DeepEqual on error values. - deepequalerrors # Report common mistakes in defer statements. - defers # Check Go toolchain directives such as //go:debug. - directive # Report passing non-pointer or non-error values to errors.As. - errorsas # Find structs that would use less memory if their fields were sorted. - fieldalignment # Find calls to a particular function. - findcall # Report assembly that clobbers the frame pointer before saving it. - framepointer # Check format of addresses passed to net.Dial. - hostport # Report using Go 1.22 enhanced ServeMux patterns in older Go versions. - httpmux # Check for mistakes using HTTP responses. - httpresponse # Detect impossible interface-to-interface type assertions. - ifaceassert # Check references to loop variables from within nested functions. - loopclosure # Check cancel func returned by context.WithCancel is called. - lostcancel # Check for useless comparisons between functions and nil. - nilfunc # Check for redundant or impossible nil comparisons. - nilness # Check consistency of Printf format strings and arguments. - printf # Check for comparing reflect.Value values with == or reflect.DeepEqual. - reflectvaluecompare # Check for possible unintended shadowing of variables. - shadow # Check for shifts that equal or exceed the width of the integer. - shift # Check for unbuffered channel of os.Signal. - sigchanyzer # Check for invalid structured logging calls. - slog # Check the argument type of sort.Slice. - sortslice # Check signature of methods of well-known interfaces. - stdmethods # Report uses of too-new standard library symbols. - stdversion # Check for string(int) conversions. - stringintconv # Check that struct field tags conform to reflect.StructTag.Get. - structtag # Report calls to (*testing.T).Fatal from goroutines started by a test. - testinggoroutine # Check for common mistaken usages of tests and examples. - tests # Check for calls of (time.Time).Format or time.Parse with 2006-02-01. - timeformat # Report passing non-pointer or non-interface values to unmarshal. - unmarshal # Check for unreachable code. - unreachable # Check for invalid conversions of uintptr to unsafe.Pointer. - unsafeptr # Check for unused results of calls to some functions. - unusedresult # Checks for unused writes. - unusedwrite # Check for misuses of sync.WaitGroup. - waitgroup # Enable all analyzers. # Default: false enable-all: true # Disable analyzers by name. # (In addition to default # atomicalign, deepequalerrors, fieldalignment, findcall, nilness, reflectvaluecompare, shadow, sortslice, # timeformat, unusedwrite # ). # Run `GL_DEBUG=govet golangci-lint run --enable=govet` to see default, all available analyzers, and enabled analyzers. # Default: [] disable: - appends - asmdecl - assign - atomic - atomicalign - bools - buildtag - cgocall - composites - copylocks - deepequalerrors - defers - directive - errorsas - fieldalignment - findcall - framepointer - hostport - httpmux - httpresponse - ifaceassert - loopclosure - lostcancel - nilfunc - nilness - printf - reflectvaluecompare - shadow - shift - sigchanyzer - slog - sortslice - stdmethods - stdversion - stringintconv - structtag - testinggoroutine - tests - timeformat - unmarshal - unreachable - unsafeptr - unusedresult - unusedwrite - waitgroup # Settings per analyzer. settings: # Analyzer name, run `go tool vet help` to see all analyzers. printf: # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`). # Default: [] funcs: - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Infof - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Warnf - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Errorf - (github.com/golangci/golangci-lint/v2/pkg/logutils.Log).Fatalf shadow: # Whether to be strict about shadowing; can be noisy. # Default: false strict: true unusedresult: # Comma-separated list of functions whose results must be used. # (In addition to default: # context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue, errors.New, fmt.Errorf, # fmt.Sprint, fmt.Sprintf, sort.Reverse # ). # Default: [] funcs: - pkg.MyFunc # Comma-separated list of names of methods of type func() string whose results must be used. # (In addition to default Error,String). # Default: [] stringmethods: - MyMethod","grouper#grouper":"Analyze expression groups.\nSince golangci-lint v1.44.0 Repository linters: settings: grouper: # Require the use of a single global 'const' declaration only. # Default: false const-require-single-const: true # Require the use of grouped global 'const' declarations. # Default: false const-require-grouping: true # Require the use of a single 'import' declaration only. # Default: false import-require-single-import: true # Require the use of grouped 'import' declarations. # Default: false import-require-grouping: true # Require the use of a single global 'type' declaration only. # Default: false type-require-single-type: true # Require the use of grouped global 'type' declarations. # Default: false type-require-grouping: true # Require the use of a single global 'var' declaration only. # Default: false var-require-single-var: true # Require the use of grouped global 'var' declarations. # Default: false var-require-grouping: true","iface#iface":"Detect the incorrect use of interfaces, helping developers avoid interface pollution.\nSince golangci-lint v1.62.0 Autofix Repository linters: settings: iface: # List of analyzers. # Default: [\"identical\"] enable: - identical # Identifies interfaces in the same package that have identical method sets. - unused # Identifies interfaces that are not used anywhere in the same package where the interface is defined. - opaque # Identifies functions that return interfaces, but the actual returned value is always a single concrete implementation. - unexported # Identifies interfaces that are not exported but are used in exported functions or methods. settings: unused: # List of packages path to exclude from the check. # Default: [] exclude: - github.com/example/log","importas#importas":"Enforces consistent import aliases.\nSince golangci-lint v1.38.0 Autofix Repository linters: settings: importas: # Do not allow unaliased imports of aliased packages. # Default: false no-unaliased: true # Do not allow non-required aliases. # Default: false no-extra-aliases: true # List of aliases # Default: [] alias: # Using `servingv1` alias for `knative.dev/serving/pkg/apis/serving/v1` package. - pkg: knative.dev/serving/pkg/apis/serving/v1 alias: servingv1 # Using `autoscalingv1alpha1` alias for `knative.dev/serving/pkg/apis/autoscaling/v1alpha1` package. - pkg: knative.dev/serving/pkg/apis/autoscaling/v1alpha1 alias: autoscalingv1alpha1 # You can specify the package path by regular expression, # and alias by regular expression expansion syntax like below. # See https://github.com/julz/importas#use-regular-expression for details. - pkg: knative.dev/serving/pkg/apis/(\\w+)/(v[\\w\\d]+) alias: $1$2 # An explicit empty alias can be used to ensure no aliases are used for a package. # This can be useful if `no-extra-aliases: true` doesn't fit your need. # Multiple packages can use an empty alias. - pkg: errors alias: \"\"","inamedparam#inamedparam":"Reports interfaces with unnamed method parameters.\nSince golangci-lint v1.55.0 Repository linters: settings: inamedparam: # Skips check for interface methods with only a single parameter. # Default: false skip-single-param: true","ineffassign#ineffassign":"Detects when assignments to existing variables are not used.\nSince golangci-lint v1.0.0 Repository linters: settings: ineffassign: # Check escaping variables of type error, may cause false positives. # Default: false check-escaping-errors: true","interfacebloat#interfacebloat":"A linter that checks the number of methods inside an interface.\nSince golangci-lint v1.49.0 Repository linters: settings: interfacebloat: # The maximum number of methods allowed for an interface. # Default: 10 max: 5","intrange#intrange":"Intrange is a linter to find places where for loops could make use of an integer range.\nSince golangci-lint v1.57.0 Autofix Repository No settings available.","iotamixing#iotamixing":"Checks if iotas are being used in const blocks with other non-iota declarations.\nSince golangci-lint v2.5.0 New Repository linters: settings: iotamixing: # Whether to report individual consts rather than just the const block. # Default: false report-individual: true","ireturn#ireturn":"Accept Interfaces, Return Concrete Types.\nSince golangci-lint v1.43.0 Repository linters: settings: ireturn: # List of interfaces to allow. # Lists of the keywords and regular expressions matched to interface or package names can be used. # `allow` and `reject` settings cannot be used at the same time. # # Keywords: # - `empty` for `interface{}` # - `error` for errors # - `stdlib` for standard library # - `anon` for anonymous interfaces # - `generic` for generic interfaces added in go 1.18 # # Default: [anon, error, empty, stdlib] allow: - anon # You can specify idiomatic endings for interface - (or|er)$ # List of interfaces to reject. # Lists of the keywords and regular expressions matched to interface or package names can be used. # `allow` and `reject` settings cannot be used at the same time. # # Keywords: # - `empty` for `interface{}` # - `error` for errors # - `stdlib` for standard library # - `anon` for anonymous interfaces # - `generic` for generic interfaces added in go 1.18 # # Default: [] reject: - github.com\\/user\\/package\\/v4\\.Type","lll#lll":"Reports long lines.\nSince golangci-lint v1.8.0 linters: settings: lll: # Max line length, lines longer will be reported. # '\\t' is counted as 1 character by default, and can be changed with the tab-width option. # Default: 120. line-length: 120 # Tab width in spaces. # Default: 1 tab-width: 1","loggercheck#loggercheck":"Checks key value pairs for common logger libraries (kitlog,klog,logr,slog,zap).\nSince golangci-lint v1.49.0 Repository linters: settings: loggercheck: # Allow check for the github.com/go-kit/log library. # Default: true kitlog: false # Allow check for the k8s.io/klog/v2 library. # Default: true klog: false # Allow check for the github.com/go-logr/logr library. # Default: true logr: false # Allow check for the log/slog library. # Default: true slog: false # Allow check for the \"sugar logger\" from go.uber.org/zap library. # Default: true zap: false # Require all logging keys to be inlined constant strings. # Default: false require-string-key: true # Require printf-like format specifier (%s, %d for example) not present. # Default: false no-printf-like: true # List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers. # For example: https://github.com/timonwong/loggercheck/blob/7395ab86595781e33f7afba27ad7b55e6956ebcd/testdata/custom-rules.txt # Default: empty rules: - k8s.io/klog/v2.InfoS # package level exported functions - (github.com/go-logr/logr.Logger).Error # \"Methods\" - (*go.uber.org/zap.SugaredLogger).With # Also \"Methods\", but with a pointer receiver","maintidx#maintidx":"Maintidx measures the maintainability index of each function.\nSince golangci-lint v1.44.0 Repository linters: settings: maintidx: # Show functions with maintainability index lower than N. # A high index indicates better maintainability (it's kind of the opposite of complexity). # Default: 20 under: 100","makezero#makezero":"Find slice declarations with non-zero initial length.\nSince golangci-lint v1.34.0 Repository linters: settings: makezero: # Allow only slices initialized with a length of zero. # Default: false always: true","mirror#mirror":"Reports wrong mirror patterns of bytes/strings usage.\nSince golangci-lint v1.53.0 Autofix Repository No settings available.","misspell#misspell":"Finds commonly misspelled English words.\nSince golangci-lint v1.8.0 Autofix Repository linters: settings: misspell: # Correct spellings using locale preferences for US or UK. # Setting locale to US will correct the British spelling of 'colour' to 'color'. # Default is to use a neutral variety of English. locale: US # Typos to ignore. # Should be in lower case. # Default: [] ignore-rules: - someword # Extra word corrections. # `typo` and `correction` should only contain letters. # The words are case-insensitive. # Default: [] extra-words: - typo: \"iff\" correction: \"if\" - typo: \"cancelation\" correction: \"cancellation\" # Mode of the analysis: # - default: checks all the file content. # - restricted: checks only comments. # Default: \"\" mode: restricted","mnd#mnd":"An analyzer to detect magic numbers.\nSince golangci-lint v1.22.0 Repository linters: settings: mnd: # List of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description. # Default: [\"argument\", \"case\", \"condition\", \"operation\", \"return\", \"assign\"] checks: - argument - case - condition - operation - return - assign # List of numbers to exclude from analysis. # The numbers should be written as string. # Values always ignored: \"1\", \"1.0\", \"0\" and \"0.0\". # Default: [] ignored-numbers: - '0666' - '0755' - '42' # List of file patterns to exclude from analysis. # Values always ignored: `.+_test.go`. # Default: [] ignored-files: - 'magic1_.+\\.go$' # List of function patterns to exclude from analysis. # Following functions are always ignored: `time.Date`, # `strconv.FormatInt`, `strconv.FormatUint`, `strconv.FormatFloat`, # `strconv.ParseInt`, `strconv.ParseUint`, `strconv.ParseFloat`. # Default: [] ignored-functions: - '^math\\.' - '^http\\.StatusText$'","musttag#musttag":"Enforce field tags in (un)marshaled structs.\nSince golangci-lint v1.51.0 Repository linters: settings: musttag: # A set of custom functions to check in addition to the builtin ones. # Default: json, xml, gopkg.in/yaml.v3, BurntSushi/toml, mitchellh/mapstructure, jmoiron/sqlx functions: # The full name of the function, including the package. - name: github.com/hashicorp/hcl/v2/hclsimple.DecodeFile # The struct tag whose presence should be ensured. tag: hcl # The position of the argument to check. arg-pos: 2","nakedret#nakedret":"Checks that functions with naked returns are not longer than a maximum size (can be zero).\nSince golangci-lint v1.19.0 Autofix Repository linters: settings: nakedret: # Make an issue if func has more lines of code than this setting, and it has naked returns. # Default: 30 max-func-lines: 31","nestif#nestif":"Reports deeply nested if statements.\nSince golangci-lint v1.25.0 Repository linters: settings: nestif: # Minimal complexity of if statements to report. # Default: 5 min-complexity: 4","nilerr#nilerr":"Find the code that returns nil even if it checks that the error is not nil.\nSince golangci-lint v1.38.0 Repository No settings available.","nilnesserr#nilnesserr":"Reports constructs that checks for err != nil, but returns a different nil value error. Powered by nilness and nilerr.\nSince golangci-lint v1.63.0 Repository No settings available.","nilnil#nilnil":"Checks that there is no simultaneous return of nil error and an invalid value.\nSince golangci-lint v1.43.0 Repository linters: settings: nilnil: # To check functions with only two return values (`return nil, nil`). # If disabled then returns like `return nil, nil, ..., nil` are supported. # Default: true only-two: false # In addition, detect opposite situation (simultaneous return of non-nil error and valid value). # E.g, `return clone, fh.indexer.Update(clone)` will be considered as invalid. # Default: false detect-opposite: true # List of return types to check. # Default: [\"chan\", \"func\", \"iface\", \"map\", \"ptr\", \"uintptr\", \"unsafeptr\"] checked-types: - chan - func - iface - map - ptr - uintptr - unsafeptr","nlreturn#nlreturn":"Checks for a new line before return and branch statements to increase code clarity.\nSince golangci-lint v1.30.0 Autofix Repository linters: settings: nlreturn: # Size of the block (including return statement that is still \"OK\"), # so no return split required. # Default: 1 block-size: 2","noctx#noctx":"Detects function and method with missing usage of context.Context.\nSince golangci-lint v1.28.0 Repository No settings available.","noinlineerr#noinlineerr":"Disallows inline error handling (if err := ...; err != nil {).\nSince golangci-lint v2.2.0 Repository No settings available.","nolintlint#nolintlint":"Reports ill-formed or insufficient nolint directives.\nSince golangci-lint v1.26.0 Autofix Repository linters: settings: nolintlint: # Disable to ensure that all nolint directives actually have an effect. # Default: false allow-unused: true # Exclude following linters from requiring an explanation. # Default: [] allow-no-explanation: [] # Enable to require an explanation of nonzero length after each nolint directive. # Default: false require-explanation: true # Enable to require nolint directives to mention the specific linter being suppressed. # Default: false require-specific: true","nonamedreturns#nonamedreturns":"Reports all named returns.\nSince golangci-lint v1.46.0 Repository linters: settings: nonamedreturns: # Report named error if it is assigned inside defer. # Default: false report-error-in-defer: true","nosprintfhostport#nosprintfhostport":"Checks for misuse of Sprintf to construct a host with port in a URL.\nSince golangci-lint v1.46.0 Repository No settings available.","paralleltest#paralleltest":"Detects missing usage of t.Parallel() method in your Go test.\nSince golangci-lint v1.33.0 Repository linters: settings: paralleltest: # Ignore missing calls to `t.Parallel()` and only report incorrect uses of it. # Default: false ignore-missing: true # Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are # still required to have `t.Parallel`, but subtests are allowed to skip it. # Default: false ignore-missing-subtests: true","perfsprint#perfsprint":"Checks that fmt.Sprintf can be replaced with a faster alternative.\nSince golangci-lint v1.55.0 Autofix Repository linters: settings: perfsprint: # Enable/disable optimization of integer formatting. # Default: true integer-format: false # Optimizes even if it requires an int or uint type cast. # Default: true int-conversion: false # Enable/disable optimization of error formatting. # Default: true error-format: false # Optimizes into `err.Error()` even if it is only equivalent for non-nil errors. # Default: false err-error: true # Optimizes `fmt.Errorf`. # Default: true errorf: false # Enable/disable optimization of string formatting. # Default: true string-format: false # Optimizes `fmt.Sprintf` with only one argument. # Default: true sprintf1: false # Optimizes into strings concatenation. # Default: true strconcat: false # Enable/disable optimization of bool formatting. # Default: true bool-format: false # Enable/disable optimization of hex formatting. # Default: true hex-format: false","prealloc#prealloc":"Find slice declarations that could potentially be pre-allocated.\nSince golangci-lint v1.19.0 Repository linters: settings: prealloc: # IMPORTANT: we don't recommend using this linter before doing performance profiling. # For most programs usage of prealloc will be a premature optimization. # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. # Default: true simple: false # Report pre-allocation suggestions on range loops. # Default: true range-loops: false # Report pre-allocation suggestions on for loops. # Default: false for-loops: true","predeclared#predeclared":"Find code that shadows one of Go's predeclared identifiers.\nSince golangci-lint v1.35.0 Repository linters: settings: predeclared: # List of predeclared identifiers to not report on. # Default: [] ignore: - new - int # Include method names and field names in checks. # Default: false qualified-name: true","promlinter#promlinter":"Check Prometheus metrics naming via promlint.\nSince golangci-lint v1.40.0 Repository linters: settings: promlinter: # Promlinter cannot infer all metrics name in static analysis. # Enable strict mode will also include the errors caused by failing to parse the args. # Default: false strict: true # Please refer to https://github.com/yeya24/promlinter#usage for detailed usage. # Default: [] disabled-linters: # Help detects issues related to the help text for a metric. - Help # MetricUnits detects issues with metric unit names. - MetricUnits # Counter detects issues specific to counters, as well as patterns that should only be used with counters. - Counter # HistogramSummaryReserved detects when other types of metrics use names or labels reserved for use by histograms and/or summaries. - HistogramSummaryReserved # MetricTypeInName detects when metric types are included in the metric name. - MetricTypeInName # ReservedChars detects colons in metric names. - ReservedChars # CamelCase detects metric names and label names written in camelCase. - CamelCase # UnitAbbreviations detects abbreviated units in the metric name. - UnitAbbreviations","protogetter#protogetter":"Reports direct reads from proto message fields when getters should be used.\nSince golangci-lint v1.55.0 Autofix Repository linters: settings: protogetter: # Skip files generated by specified generators from the checking. # Checks only the file's initial comment, which must follow the format: \"// Code generated by \". # Files generated by protoc-gen-go, protoc-gen-go-grpc, and protoc-gen-grpc-gateway are always excluded automatically. # Default: [] skip-generated-by: [\"protoc-gen-go-my-own-generator\"] # Skip files matching the specified glob pattern from the checking. # Default: [] skip-files: - \"*.pb.go\" - \"*/vendor/*\" - \"/full/path/to/file.go\" # Skip any generated files from the checking. # Default: false skip-any-generated: true # Skip first argument of append function. # Default: false replace-first-arg-in-append: true","reassign#reassign":"Checks that package variables are not reassigned.\nSince golangci-lint v1.49.0 Repository linters: settings: reassign: # Patterns for global variable names that are checked for reassignment. # See https://github.com/curioswitch/go-reassign#usage # Default: [\"EOF\", \"Err.*\"] patterns: - \".*\"","recvcheck#recvcheck":"Checks for receiver type consistency.\nSince golangci-lint v1.62.0 Repository linters: settings: recvcheck: # Disables the built-in method exclusions: # - `MarshalText` # - `MarshalJSON` # - `MarshalYAML` # - `MarshalXML` # - `MarshalBinary` # - `GobEncode` # Default: false disable-builtin: true # User-defined method exclusions. # The format is `struct_name.method_name` (ex: `Foo.MethodName`). # A wildcard `*` can use as a struct name (ex: `*.MethodName`). # Default: [] exclusions: - \"*.Value\"","revive#revive":"Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint.\nSince golangci-lint v1.37.0 Autofix Repository linters: settings: revive: # Maximum number of open files at the same time. # See https://github.com/mgechev/revive#command-line-flags # Defaults to unlimited. max-open-files: 2048 # Sets the default severity. # See https://github.com/mgechev/revive#configuration # Default: warning severity: error # Enable all available rules. # Default: false enable-all-rules: true # Enable validation of comment directives. # See https://github.com/mgechev/revive#comment-directives directives: - name: specify-disable-reason severity: error # Sets the default failure confidence. # This means that linting errors with less than 0.8 confidence will be ignored. # Default: 0.8 confidence: 0.1 # Revive handles the default rules in a way that can be unexpected: # - If there are no explicit rules, the default rules are used. # - If there is at least one explicit rule, the default rules are not used. # Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules. rules: # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#add-constant - name: add-constant severity: warning disabled: false exclude: [\"\"] arguments: - max-lit-count: \"3\" allow-strs: '\"\"' allow-ints: \"0,1,2\" allow-floats: \"0.0,0.,1.0,1.,2.0,2.\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#argument-limit - name: argument-limit severity: warning disabled: false exclude: [\"\"] arguments: [4] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#atomic - name: atomic severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#banned-characters - name: banned-characters severity: warning disabled: false exclude: [\"\"] arguments: [\"Ω\", \"Σ\", \"σ\", \"7\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bare-return - name: bare-return severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#blank-imports - name: blank-imports severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#bool-literal-in-expr - name: bool-literal-in-expr severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#call-to-gc - name: call-to-gc severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cognitive-complexity - name: cognitive-complexity severity: warning disabled: false exclude: [\"\"] arguments: [7] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comment-spacings - name: comment-spacings severity: warning disabled: false exclude: [\"\"] arguments: - mypragma - otherpragma # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#comments-density - name: comments-density severity: warning disabled: false exclude: [\"\"] arguments: [15] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-naming - name: confusing-naming severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#confusing-results - name: confusing-results severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#constant-logical-expr - name: constant-logical-expr severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-as-argument - name: context-as-argument severity: warning disabled: false exclude: [\"\"] arguments: - allow-types-before: \"*testing.T,*github.com/user/repo/testing.Harness\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#context-keys-type - name: context-keys-type severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#cyclomatic - name: cyclomatic severity: warning disabled: false exclude: [\"\"] arguments: [3] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#datarace - name: datarace severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#deep-exit - name: deep-exit severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#defer - name: defer severity: warning disabled: false exclude: [\"\"] arguments: - \"call-chain\" - \"loop\" - \"method-call\" - \"recover\" - \"immediate-recover\" - \"return\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#dot-imports - name: dot-imports severity: warning disabled: false exclude: [\"\"] arguments: - allowed-packages: [\"github.com/onsi/ginkgo/v2\", \"github.com/onsi/gomega\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#duplicated-imports - name: duplicated-imports severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#early-return - name: early-return severity: warning disabled: false exclude: [\"\"] arguments: - \"preserve-scope\" - \"allow-jump\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-block - name: empty-block severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#empty-lines - name: empty-lines severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-map-style - name: enforce-map-style severity: warning disabled: false exclude: [\"\"] arguments: - \"make\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-repeated-arg-type-style - name: enforce-repeated-arg-type-style severity: warning disabled: false exclude: [\"\"] arguments: - \"short\" # Or this parameter: - func-arg-style: \"full\" func-ret-val-style: \"short\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-slice-style - name: enforce-slice-style severity: warning disabled: false exclude: [\"\"] arguments: - \"make\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#enforce-switch-style - name: enforce-switch-style severity: warning disabled: false exclude: [\"\"] arguments: [\"allowNoDefault\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-naming - name: error-naming severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-return - name: error-return severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#error-strings - name: error-strings severity: warning disabled: false exclude: [\"\"] arguments: - \"xerrors.New\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#errorf - name: errorf severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#exported - name: exported severity: warning disabled: false exclude: [\"\"] arguments: - \"check-private-receivers\" - \"disable-stuttering-check\" - \"say-repetitive-instead-of-stutters\" - \"check-public-interface\" - \"disable-checks-on-constants\" - \"disable-checks-on-functions\" - \"disable-checks-on-methods\" - \"disable-checks-on-types\" - \"disable-checks-on-variables\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-header - name: file-header severity: warning disabled: false exclude: [\"\"] arguments: - This is the text that must appear at the top of source files. # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#file-length-limit - name: file-length-limit severity: warning disabled: false exclude: [\"\"] arguments: - max: 100 skip-comments: true skip-blank-lines: true # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#filename-format - name: filename-format severity: warning disabled: false exclude: [\"\"] arguments: - \"^[_a-z][_a-z0-9]*\\\\.go$\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#flag-parameter - name: flag-parameter severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-length - name: function-length severity: warning disabled: false exclude: [\"\"] arguments: [10, 0] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#function-result-limit - name: function-result-limit severity: warning disabled: false exclude: [\"\"] arguments: [3] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#get-return - name: get-return severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-branches - name: identical-branches severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-branches - name: identical-ifelseif-branches severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-ifelseif-conditions - name: identical-ifelseif-conditions severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-branches - name: identical-switch-branches severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#identical-switch-conditions - name: identical-switch-conditions severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#if-return - name: if-return severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-alias-naming - name: import-alias-naming severity: warning disabled: false exclude: [\"\"] arguments: - \"^[a-z][a-z0-9]{0,}$\" # Or this parameter: - allow-regex: \"^[a-z][a-z0-9]{0,}$\" deny-regex: '^v\\d+$' # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#import-shadowing - name: import-shadowing severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#imports-blocklist - name: imports-blocklist severity: warning disabled: false exclude: [\"\"] arguments: - \"crypto/md5\" - \"crypto/sha1\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#increment-decrement - name: increment-decrement severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#indent-error-flow - name: indent-error-flow severity: warning disabled: false exclude: [\"\"] arguments: - \"preserve-scope\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#line-length-limit - name: line-length-limit severity: warning disabled: false exclude: [\"\"] arguments: [80] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-control-nesting - name: max-control-nesting severity: warning disabled: false exclude: [\"\"] arguments: [3] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#max-public-structs - name: max-public-structs severity: warning disabled: false exclude: [\"\"] arguments: [3] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-parameter - name: modifies-parameter severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#modifies-value-receiver - name: modifies-value-receiver severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#nested-structs - name: nested-structs severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#optimize-operands-order - name: optimize-operands-order severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-comments - name: package-comments severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#package-directory-mismatch - name: package-directory-mismatch severity: warning disabled: false exclude: [\"\"] arguments: - ignore-directories: [\"testcases\", \"testinfo\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range - name: range severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-address - name: range-val-address severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#range-val-in-closure - name: range-val-in-closure severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#receiver-naming - name: receiver-naming severity: warning disabled: false exclude: [\"\"] arguments: - max-length: 2 # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redefines-builtin-id - name: redefines-builtin-id severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-build-tag - name: redundant-build-tag severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-import-alias - name: redundant-import-alias severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#redundant-test-main-exit - name: redundant-test-main-exit severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-format - name: string-format severity: warning disabled: false exclude: [\"\"] arguments: - - 'core.WriteError[1].Message' - '/^([^A-Z]|$)/' - must not start with a capital letter - - 'fmt.Errorf[0]' - '/(^|[^\\.!?])$/' - must not end in punctuation - - panic - '/^[^\\n]*$/' - must not contain line breaks # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#string-of-int - name: string-of-int severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#struct-tag - name: struct-tag severity: warning disabled: false exclude: [\"\"] arguments: - \"json,inline\" - \"bson,outline,gnu\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#superfluous-else - name: superfluous-else severity: warning disabled: false exclude: [\"\"] arguments: - \"preserve-scope\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-date - name: time-date severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-equal - name: time-equal severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#time-naming - name: time-naming severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unchecked-type-assertion - name: unchecked-type-assertion severity: warning disabled: false exclude: [\"\"] arguments: - accept-ignored-assertion-result: true # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unconditional-recursion - name: unconditional-recursion severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-naming - name: unexported-naming severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unexported-return - name: unexported-return severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unhandled-error - name: unhandled-error severity: warning disabled: false exclude: [\"\"] arguments: - \"^fmt.Printf\" - \"myFunction\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-format - name: unnecessary-format severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unnecessary-stmt - name: unnecessary-stmt severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unreachable-code - name: unreachable-code severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unsecure-url-scheme - name: unsecure-url-scheme severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-parameter - name: unused-parameter severity: warning disabled: false exclude: [\"\"] arguments: - allow-regex: \"^_\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#unused-receiver - name: unused-receiver severity: warning disabled: false exclude: [\"\"] arguments: - allow-regex: \"^_\" # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-any - name: use-any severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-errors-new - name: use-errors-new severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-fmt-print - name: use-fmt-print severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#use-waitgroup-go - name: use-waitgroup-go severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-break - name: useless-break severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#useless-fallthrough - name: useless-fallthrough severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-declaration - name: var-declaration severity: warning disabled: false exclude: [\"\"] # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#var-naming - name: var-naming severity: warning disabled: false exclude: [\"\"] arguments: - [\"ID\"] # AllowList - [\"VM\"] # DenyList - - skip-initialism-name-checks: true upper-case-const: true skip-package-name-checks: true extra-bad-package-names: - helpers - models # https://github.com/mgechev/revive/blob/HEAD/RULES_DESCRIPTIONS.md#waitgroup-by-value - name: waitgroup-by-value severity: warning disabled: false exclude: [\"\"]","rowserrcheck#rowserrcheck":"Checks whether Rows.Err of rows is checked successfully.\nSince golangci-lint v1.23.0 Repository linters: settings: rowserrcheck: # database/sql is always checked. # Default: [] packages: - github.com/jmoiron/sqlx","sloglint#sloglint":"Ensure consistent code style when using log/slog.\nSince golangci-lint v1.55.0 Autofix Repository linters: settings: sloglint: # Enforce not mixing key-value pairs and attributes. # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-mixed-arguments # Default: true no-mixed-args: false # Enforce using key-value pairs only (overrides no-mixed-args, incompatible with attr-only). # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-value-pairs-only # Default: false kv-only: true # Enforce using attributes only (overrides no-mixed-args, incompatible with kv-only). # https://github.com/go-simpler/sloglint?tab=readme-ov-file#attributes-only # Default: false attr-only: true # Enforce not using global loggers. # Values: # - \"\": disabled # - \"all\": report all global loggers # - \"default\": report only the default slog logger # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-global # Default: \"\" no-global: \"all\" # Enforce using methods that accept a context. # Values: # - \"\": disabled # - \"all\": report all contextless calls # - \"scope\": report only if a context exists in the scope of the outermost function # https://github.com/go-simpler/sloglint?tab=readme-ov-file#context-only # Default: \"\" context: \"all\" # Enforce using static values for log messages. # https://github.com/go-simpler/sloglint?tab=readme-ov-file#static-messages # Default: false static-msg: true # Enforce message style. # Values: lowercased, capitalized # https://github.com/go-simpler/sloglint?tab=readme-ov-file#message-style # Default: \"\" msg-style: capitalized # Enforce using constants instead of raw keys. # https://github.com/go-simpler/sloglint?tab=readme-ov-file#no-raw-keys # Default: false no-raw-keys: true # Enforce key naming convention. # Values: snake, kebab, camel, pascal # https://github.com/go-simpler/sloglint?tab=readme-ov-file#key-naming-convention # Default: \"\" key-naming-case: snake # Enforce not using specific keys. # https://github.com/go-simpler/sloglint?tab=readme-ov-file#forbidden-keys # Default: [] forbidden-keys: - time - level - msg - source - foo # Enforce putting arguments on separate lines. # https://github.com/go-simpler/sloglint?tab=readme-ov-file#arguments-on-separate-lines # Default: false args-on-sep-lines: true","spancheck#spancheck":"Checks for mistakes with OpenTelemetry/Census spans.\nSince golangci-lint v1.56.0 Repository linters: settings: spancheck: # Checks to enable. # Options include: # - `end`: check that `span.End()` is called # - `record-error`: check that `span.RecordError(err)` is called when an error is returned # - `set-status`: check that `span.SetStatus(codes.Error, msg)` is called when an error is returned # Default: [\"end\"] checks: - end - record-error - set-status # A list of regexes for function signatures that silence `record-error` and `set-status` reports # if found in the call path to a returned error. # https://github.com/jjti/go-spancheck#ignore-check-signatures # Default: [] ignore-check-signatures: - \"telemetry.RecordError\" # A list of regexes for additional function signatures that create spans. # This is useful if you have a utility method to create spans. # Each entry should be of the form `:`, where `telemetry-type` can be `opentelemetry` or `opencensus`. # https://github.com/jjti/go-spancheck#extra-start-span-signatures # Default: [] extra-start-span-signatures: - \"github.com/user/repo/telemetry/trace.Start:opentelemetry\"","sqlclosecheck#sqlclosecheck":"Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed.\nSince golangci-lint v1.28.0 Repository No settings available.","staticcheck#staticcheck":"It's the set of rules from staticcheck.\nSince golangci-lint v1.0.0 Autofix Repository linters: settings: staticcheck: # https://staticcheck.dev/docs/configuration/options/#dot_import_whitelist # Default: [\"github.com/mmcloughlin/avo/build\", \"github.com/mmcloughlin/avo/operand\", \"github.com/mmcloughlin/avo/reg\"] dot-import-whitelist: - fmt # https://staticcheck.dev/docs/configuration/options/#initialisms # Default: [\"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\"] initialisms: [\"ACL\", \"API\", \"ASCII\", \"CPU\", \"CSS\", \"DNS\", \"EOF\", \"GUID\", \"HTML\", \"HTTP\", \"HTTPS\", \"ID\", \"IP\", \"JSON\", \"QPS\", \"RAM\", \"RPC\", \"SLA\", \"SMTP\", \"SQL\", \"SSH\", \"TCP\", \"TLS\", \"TTL\", \"UDP\", \"UI\", \"GID\", \"UID\", \"UUID\", \"URI\", \"URL\", \"UTF8\", \"VM\", \"XML\", \"XMPP\", \"XSRF\", \"XSS\", \"SIP\", \"RTP\", \"AMQP\", \"DB\", \"TS\"] # https://staticcheck.dev/docs/configuration/options/#http_status_code_whitelist # Default: [\"200\", \"400\", \"404\", \"500\"] http-status-code-whitelist: [\"200\", \"400\", \"404\", \"500\"] # SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks # Example (to disable some checks): [ \"all\", \"-SA1000\", \"-SA1001\"] # Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks. # Default: [\"all\", \"-ST1000\", \"-ST1003\", \"-ST1016\", \"-ST1020\", \"-ST1021\", \"-ST1022\"] checks: # Invalid regular expression. # https://staticcheck.dev/docs/checks/#SA1000 - SA1000 # Invalid template. # https://staticcheck.dev/docs/checks/#SA1001 - SA1001 # Invalid format in 'time.Parse'. # https://staticcheck.dev/docs/checks/#SA1002 - SA1002 # Unsupported argument to functions in 'encoding/binary'. # https://staticcheck.dev/docs/checks/#SA1003 - SA1003 # Suspiciously small untyped constant in 'time.Sleep'. # https://staticcheck.dev/docs/checks/#SA1004 - SA1004 # Invalid first argument to 'exec.Command'. # https://staticcheck.dev/docs/checks/#SA1005 - SA1005 # 'Printf' with dynamic first argument and no further arguments. # https://staticcheck.dev/docs/checks/#SA1006 - SA1006 # Invalid URL in 'net/url.Parse'. # https://staticcheck.dev/docs/checks/#SA1007 - SA1007 # Non-canonical key in 'http.Header' map. # https://staticcheck.dev/docs/checks/#SA1008 - SA1008 # '(*regexp.Regexp).FindAll' called with 'n == 0', which will always return zero results. # https://staticcheck.dev/docs/checks/#SA1010 - SA1010 # Various methods in the \"strings\" package expect valid UTF-8, but invalid input is provided. # https://staticcheck.dev/docs/checks/#SA1011 - SA1011 # A nil 'context.Context' is being passed to a function, consider using 'context.TODO' instead. # https://staticcheck.dev/docs/checks/#SA1012 - SA1012 # 'io.Seeker.Seek' is being called with the whence constant as the first argument, but it should be the second. # https://staticcheck.dev/docs/checks/#SA1013 - SA1013 # Non-pointer value passed to 'Unmarshal' or 'Decode'. # https://staticcheck.dev/docs/checks/#SA1014 - SA1014 # Using 'time.Tick' in a way that will leak. Consider using 'time.NewTicker', and only use 'time.Tick' in tests, commands and endless functions. # https://staticcheck.dev/docs/checks/#SA1015 - SA1015 # Trapping a signal that cannot be trapped. # https://staticcheck.dev/docs/checks/#SA1016 - SA1016 # Channels used with 'os/signal.Notify' should be buffered. # https://staticcheck.dev/docs/checks/#SA1017 - SA1017 # 'strings.Replace' called with 'n == 0', which does nothing. # https://staticcheck.dev/docs/checks/#SA1018 - SA1018 # Using a deprecated function, variable, constant or field. # https://staticcheck.dev/docs/checks/#SA1019 - SA1019 # Using an invalid host:port pair with a 'net.Listen'-related function. # https://staticcheck.dev/docs/checks/#SA1020 - SA1020 # Using 'bytes.Equal' to compare two 'net.IP'. # https://staticcheck.dev/docs/checks/#SA1021 - SA1021 # Modifying the buffer in an 'io.Writer' implementation. # https://staticcheck.dev/docs/checks/#SA1023 - SA1023 # A string cutset contains duplicate characters. # https://staticcheck.dev/docs/checks/#SA1024 - SA1024 # It is not possible to use '(*time.Timer).Reset''s return value correctly. # https://staticcheck.dev/docs/checks/#SA1025 - SA1025 # Cannot marshal channels or functions. # https://staticcheck.dev/docs/checks/#SA1026 - SA1026 # Atomic access to 64-bit variable must be 64-bit aligned. # https://staticcheck.dev/docs/checks/#SA1027 - SA1027 # 'sort.Slice' can only be used on slices. # https://staticcheck.dev/docs/checks/#SA1028 - SA1028 # Inappropriate key in call to 'context.WithValue'. # https://staticcheck.dev/docs/checks/#SA1029 - SA1029 # Invalid argument in call to a 'strconv' function. # https://staticcheck.dev/docs/checks/#SA1030 - SA1030 # Overlapping byte slices passed to an encoder. # https://staticcheck.dev/docs/checks/#SA1031 - SA1031 # Wrong order of arguments to 'errors.Is'. # https://staticcheck.dev/docs/checks/#SA1032 - SA1032 # 'sync.WaitGroup.Add' called inside the goroutine, leading to a race condition. # https://staticcheck.dev/docs/checks/#SA2000 - SA2000 # Empty critical section, did you mean to defer the unlock?. # https://staticcheck.dev/docs/checks/#SA2001 - SA2001 # Called 'testing.T.FailNow' or 'SkipNow' in a goroutine, which isn't allowed. # https://staticcheck.dev/docs/checks/#SA2002 - SA2002 # Deferred 'Lock' right after locking, likely meant to defer 'Unlock' instead. # https://staticcheck.dev/docs/checks/#SA2003 - SA2003 # 'TestMain' doesn't call 'os.Exit', hiding test failures. # https://staticcheck.dev/docs/checks/#SA3000 - SA3000 # Assigning to 'b.N' in benchmarks distorts the results. # https://staticcheck.dev/docs/checks/#SA3001 - SA3001 # Binary operator has identical expressions on both sides. # https://staticcheck.dev/docs/checks/#SA4000 - SA4000 # '\u0026*x' gets simplified to 'x', it does not copy 'x'. # https://staticcheck.dev/docs/checks/#SA4001 - SA4001 # Comparing unsigned values against negative values is pointless. # https://staticcheck.dev/docs/checks/#SA4003 - SA4003 # The loop exits unconditionally after one iteration. # https://staticcheck.dev/docs/checks/#SA4004 - SA4004 # Field assignment that will never be observed. Did you mean to use a pointer receiver?. # https://staticcheck.dev/docs/checks/#SA4005 - SA4005 # A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?. # https://staticcheck.dev/docs/checks/#SA4006 - SA4006 # The variable in the loop condition never changes, are you incrementing the wrong variable?. # https://staticcheck.dev/docs/checks/#SA4008 - SA4008 # A function argument is overwritten before its first use. # https://staticcheck.dev/docs/checks/#SA4009 - SA4009 # The result of 'append' will never be observed anywhere. # https://staticcheck.dev/docs/checks/#SA4010 - SA4010 # Break statement with no effect. Did you mean to break out of an outer loop?. # https://staticcheck.dev/docs/checks/#SA4011 - SA4011 # Comparing a value against NaN even though no value is equal to NaN. # https://staticcheck.dev/docs/checks/#SA4012 - SA4012 # Negating a boolean twice ('!!b') is the same as writing 'b'. This is either redundant, or a typo. # https://staticcheck.dev/docs/checks/#SA4013 - SA4013 # An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either. # https://staticcheck.dev/docs/checks/#SA4014 - SA4014 # Calling functions like 'math.Ceil' on floats converted from integers doesn't do anything useful. # https://staticcheck.dev/docs/checks/#SA4015 - SA4015 # Certain bitwise operations, such as 'x ^ 0', do not do anything useful. # https://staticcheck.dev/docs/checks/#SA4016 - SA4016 # Discarding the return values of a function without side effects, making the call pointless. # https://staticcheck.dev/docs/checks/#SA4017 - SA4017 # Self-assignment of variables. # https://staticcheck.dev/docs/checks/#SA4018 - SA4018 # Multiple, identical build constraints in the same file. # https://staticcheck.dev/docs/checks/#SA4019 - SA4019 # Unreachable case clause in a type switch. # https://staticcheck.dev/docs/checks/#SA4020 - SA4020 # \"x = append(y)\" is equivalent to \"x = y\". # https://staticcheck.dev/docs/checks/#SA4021 - SA4021 # Comparing the address of a variable against nil. # https://staticcheck.dev/docs/checks/#SA4022 - SA4022 # Impossible comparison of interface value with untyped nil. # https://staticcheck.dev/docs/checks/#SA4023 - SA4023 # Checking for impossible return value from a builtin function. # https://staticcheck.dev/docs/checks/#SA4024 - SA4024 # Integer division of literals that results in zero. # https://staticcheck.dev/docs/checks/#SA4025 - SA4025 # Go constants cannot express negative zero. # https://staticcheck.dev/docs/checks/#SA4026 - SA4026 # '(*net/url.URL).Query' returns a copy, modifying it doesn't change the URL. # https://staticcheck.dev/docs/checks/#SA4027 - SA4027 # 'x % 1' is always zero. # https://staticcheck.dev/docs/checks/#SA4028 - SA4028 # Ineffective attempt at sorting slice. # https://staticcheck.dev/docs/checks/#SA4029 - SA4029 # Ineffective attempt at generating random number. # https://staticcheck.dev/docs/checks/#SA4030 - SA4030 # Checking never-nil value against nil. # https://staticcheck.dev/docs/checks/#SA4031 - SA4031 # Comparing 'runtime.GOOS' or 'runtime.GOARCH' against impossible value. # https://staticcheck.dev/docs/checks/#SA4032 - SA4032 # Assignment to nil map. # https://staticcheck.dev/docs/checks/#SA5000 - SA5000 # Deferring 'Close' before checking for a possible error. # https://staticcheck.dev/docs/checks/#SA5001 - SA5001 # The empty for loop (\"for {}\") spins and can block the scheduler. # https://staticcheck.dev/docs/checks/#SA5002 - SA5002 # Defers in infinite loops will never execute. # https://staticcheck.dev/docs/checks/#SA5003 - SA5003 # \"for { select { ...\" with an empty default branch spins. # https://staticcheck.dev/docs/checks/#SA5004 - SA5004 # The finalizer references the finalized object, preventing garbage collection. # https://staticcheck.dev/docs/checks/#SA5005 - SA5005 # Infinite recursive call. # https://staticcheck.dev/docs/checks/#SA5007 - SA5007 # Invalid struct tag. # https://staticcheck.dev/docs/checks/#SA5008 - SA5008 # Invalid Printf call. # https://staticcheck.dev/docs/checks/#SA5009 - SA5009 # Impossible type assertion. # https://staticcheck.dev/docs/checks/#SA5010 - SA5010 # Possible nil pointer dereference. # https://staticcheck.dev/docs/checks/#SA5011 - SA5011 # Passing odd-sized slice to function expecting even size. # https://staticcheck.dev/docs/checks/#SA5012 - SA5012 # Using 'regexp.Match' or related in a loop, should use 'regexp.Compile'. # https://staticcheck.dev/docs/checks/#SA6000 - SA6000 # Missing an optimization opportunity when indexing maps by byte slices. # https://staticcheck.dev/docs/checks/#SA6001 - SA6001 # Storing non-pointer values in 'sync.Pool' allocates memory. # https://staticcheck.dev/docs/checks/#SA6002 - SA6002 # Converting a string to a slice of runes before ranging over it. # https://staticcheck.dev/docs/checks/#SA6003 - SA6003 # Inefficient string comparison with 'strings.ToLower' or 'strings.ToUpper'. # https://staticcheck.dev/docs/checks/#SA6005 - SA6005 # Using io.WriteString to write '[]byte'. # https://staticcheck.dev/docs/checks/#SA6006 - SA6006 # Defers in range loops may not run when you expect them to. # https://staticcheck.dev/docs/checks/#SA9001 - SA9001 # Using a non-octal 'os.FileMode' that looks like it was meant to be in octal. # https://staticcheck.dev/docs/checks/#SA9002 - SA9002 # Empty body in an if or else branch. # https://staticcheck.dev/docs/checks/#SA9003 - SA9003 # Only the first constant has an explicit type. # https://staticcheck.dev/docs/checks/#SA9004 - SA9004 # Trying to marshal a struct with no public fields nor custom marshaling. # https://staticcheck.dev/docs/checks/#SA9005 - SA9005 # Dubious bit shifting of a fixed size integer value. # https://staticcheck.dev/docs/checks/#SA9006 - SA9006 # Deleting a directory that shouldn't be deleted. # https://staticcheck.dev/docs/checks/#SA9007 - SA9007 # 'else' branch of a type assertion is probably not reading the right value. # https://staticcheck.dev/docs/checks/#SA9008 - SA9008 # Ineffectual Go compiler directive. # https://staticcheck.dev/docs/checks/#SA9009 - SA9009 # Incorrect or missing package comment. # https://staticcheck.dev/docs/checks/#ST1000 - ST1000 # Dot imports are discouraged. # https://staticcheck.dev/docs/checks/#ST1001 - ST1001 # Poorly chosen identifier. # https://staticcheck.dev/docs/checks/#ST1003 - ST1003 # Incorrectly formatted error string. # https://staticcheck.dev/docs/checks/#ST1005 - ST1005 # Poorly chosen receiver name. # https://staticcheck.dev/docs/checks/#ST1006 - ST1006 # A function's error value should be its last return value. # https://staticcheck.dev/docs/checks/#ST1008 - ST1008 # Poorly chosen name for variable of type 'time.Duration'. # https://staticcheck.dev/docs/checks/#ST1011 - ST1011 # Poorly chosen name for error variable. # https://staticcheck.dev/docs/checks/#ST1012 - ST1012 # Should use constants for HTTP error codes, not magic numbers. # https://staticcheck.dev/docs/checks/#ST1013 - ST1013 # A switch's default case should be the first or last case. # https://staticcheck.dev/docs/checks/#ST1015 - ST1015 # Use consistent method receiver names. # https://staticcheck.dev/docs/checks/#ST1016 - ST1016 # Don't use Yoda conditions. # https://staticcheck.dev/docs/checks/#ST1017 - ST1017 # Avoid zero-width and control characters in string literals. # https://staticcheck.dev/docs/checks/#ST1018 - ST1018 # Importing the same package multiple times. # https://staticcheck.dev/docs/checks/#ST1019 - ST1019 # The documentation of an exported function should start with the function's name. # https://staticcheck.dev/docs/checks/#ST1020 - ST1020 # The documentation of an exported type should start with type's name. # https://staticcheck.dev/docs/checks/#ST1021 - ST1021 # The documentation of an exported variable or constant should start with variable's name. # https://staticcheck.dev/docs/checks/#ST1022 - ST1022 # Redundant type in variable declaration. # https://staticcheck.dev/docs/checks/#ST1023 - ST1023 # Use plain channel send or receive instead of single-case select. # https://staticcheck.dev/docs/checks/#S1000 - S1000 # Replace for loop with call to copy. # https://staticcheck.dev/docs/checks/#S1001 - S1001 # Omit comparison with boolean constant. # https://staticcheck.dev/docs/checks/#S1002 - S1002 # Replace call to 'strings.Index' with 'strings.Contains'. # https://staticcheck.dev/docs/checks/#S1003 - S1003 # Replace call to 'bytes.Compare' with 'bytes.Equal'. # https://staticcheck.dev/docs/checks/#S1004 - S1004 # Drop unnecessary use of the blank identifier. # https://staticcheck.dev/docs/checks/#S1005 - S1005 # Use \"for { ... }\" for infinite loops. # https://staticcheck.dev/docs/checks/#S1006 - S1006 # Simplify regular expression by using raw string literal. # https://staticcheck.dev/docs/checks/#S1007 - S1007 # Simplify returning boolean expression. # https://staticcheck.dev/docs/checks/#S1008 - S1008 # Omit redundant nil check on slices, maps, and channels. # https://staticcheck.dev/docs/checks/#S1009 - S1009 # Omit default slice index. # https://staticcheck.dev/docs/checks/#S1010 - S1010 # Use a single 'append' to concatenate two slices. # https://staticcheck.dev/docs/checks/#S1011 - S1011 # Replace 'time.Now().Sub(x)' with 'time.Since(x)'. # https://staticcheck.dev/docs/checks/#S1012 - S1012 # Use a type conversion instead of manually copying struct fields. # https://staticcheck.dev/docs/checks/#S1016 - S1016 # Replace manual trimming with 'strings.TrimPrefix'. # https://staticcheck.dev/docs/checks/#S1017 - S1017 # Use \"copy\" for sliding elements. # https://staticcheck.dev/docs/checks/#S1018 - S1018 # Simplify \"make\" call by omitting redundant arguments. # https://staticcheck.dev/docs/checks/#S1019 - S1019 # Omit redundant nil check in type assertion. # https://staticcheck.dev/docs/checks/#S1020 - S1020 # Merge variable declaration and assignment. # https://staticcheck.dev/docs/checks/#S1021 - S1021 # Omit redundant control flow. # https://staticcheck.dev/docs/checks/#S1023 - S1023 # Replace 'x.Sub(time.Now())' with 'time.Until(x)'. # https://staticcheck.dev/docs/checks/#S1024 - S1024 # Don't use 'fmt.Sprintf(\"%s\", x)' unnecessarily. # https://staticcheck.dev/docs/checks/#S1025 - S1025 # Simplify error construction with 'fmt.Errorf'. # https://staticcheck.dev/docs/checks/#S1028 - S1028 # Range over the string directly. # https://staticcheck.dev/docs/checks/#S1029 - S1029 # Use 'bytes.Buffer.String' or 'bytes.Buffer.Bytes'. # https://staticcheck.dev/docs/checks/#S1030 - S1030 # Omit redundant nil check around loop. # https://staticcheck.dev/docs/checks/#S1031 - S1031 # Use 'sort.Ints(x)', 'sort.Float64s(x)', and 'sort.Strings(x)'. # https://staticcheck.dev/docs/checks/#S1032 - S1032 # Unnecessary guard around call to \"delete\". # https://staticcheck.dev/docs/checks/#S1033 - S1033 # Use result of type assertion to simplify cases. # https://staticcheck.dev/docs/checks/#S1034 - S1034 # Redundant call to 'net/http.CanonicalHeaderKey' in method call on 'net/http.Header'. # https://staticcheck.dev/docs/checks/#S1035 - S1035 # Unnecessary guard around map access. # https://staticcheck.dev/docs/checks/#S1036 - S1036 # Elaborate way of sleeping. # https://staticcheck.dev/docs/checks/#S1037 - S1037 # Unnecessarily complex way of printing formatted string. # https://staticcheck.dev/docs/checks/#S1038 - S1038 # Unnecessary use of 'fmt.Sprint'. # https://staticcheck.dev/docs/checks/#S1039 - S1039 # Type assertion to current type. # https://staticcheck.dev/docs/checks/#S1040 - S1040 # Apply De Morgan's law. # https://staticcheck.dev/docs/checks/#QF1001 - QF1001 # Convert untagged switch to tagged switch. # https://staticcheck.dev/docs/checks/#QF1002 - QF1002 # Convert if/else-if chain to tagged switch. # https://staticcheck.dev/docs/checks/#QF1003 - QF1003 # Use 'strings.ReplaceAll' instead of 'strings.Replace' with 'n == -1'. # https://staticcheck.dev/docs/checks/#QF1004 - QF1004 # Expand call to 'math.Pow'. # https://staticcheck.dev/docs/checks/#QF1005 - QF1005 # Lift 'if'+'break' into loop condition. # https://staticcheck.dev/docs/checks/#QF1006 - QF1006 # Merge conditional assignment into variable declaration. # https://staticcheck.dev/docs/checks/#QF1007 - QF1007 # Omit embedded fields from selector expression. # https://staticcheck.dev/docs/checks/#QF1008 - QF1008 # Use 'time.Time.Equal' instead of '==' operator. # https://staticcheck.dev/docs/checks/#QF1009 - QF1009 # Convert slice of bytes to string when printing it. # https://staticcheck.dev/docs/checks/#QF1010 - QF1010 # Omit redundant type from variable declaration. # https://staticcheck.dev/docs/checks/#QF1011 - QF1011 # Use 'fmt.Fprintf(x, ...)' instead of 'x.Write(fmt.Sprintf(...))'. # https://staticcheck.dev/docs/checks/#QF1012 - QF1012","tagalign#tagalign":"Check that struct tags are well aligned.\nSince golangci-lint v1.53.0 Autofix Repository linters: settings: tagalign: # Align and sort can be used together or separately. # # Whether enable align. If true, the struct tags will be aligned. # E.g.: # type FooBar struct { # Bar string `json:\"bar\" validate:\"required\"` # FooFoo int8 `json:\"foo_foo\" validate:\"required\"` # } # will be formatted to: # type FooBar struct { # Bar string `json:\"bar\" validate:\"required\"` # FooFoo int8 `json:\"foo_foo\" validate:\"required\"` # } # Default: true. align: false # Whether enable tags sort. # If true, the tags will be sorted by name in ascending order. # E.g.: `xml:\"bar\" json:\"bar\" validate:\"required\"` -\u003e `json:\"bar\" validate:\"required\" xml:\"bar\"`. # Default: true sort: false # Specify the order of tags, the other tags will be sorted by name. # This option will be ignored if `sort` is false. # Default: [] order: - json - yaml - yml - toml - mapstructure - binding - validate # Whether enable strict style. # In this style, the tags will be sorted and aligned in the dictionary order, # and the tags with the same name will be aligned together. # Note: This option will be ignored if 'align' or 'sort' is false. # Default: false strict: true","tagliatelle#tagliatelle":"Checks the struct tags.\nSince golangci-lint v1.40.0 Repository linters: settings: tagliatelle: # Checks the struct tag name case. case: # Defines the association between tag name and case. # Any struct tag name can be used. # Supported string cases: # - `camel` # - `pascal` # - `kebab` # - `snake` # - `upperSnake` # - `goCamel` # - `goPascal` # - `goKebab` # - `goSnake` # - `upper` # - `lower` # - `header` rules: json: camel yaml: camel xml: camel toml: camel bson: camel avro: snake mapstructure: kebab env: upperSnake envconfig: upperSnake whatever: snake # Defines the association between tag name and case. # Important: the `extended-rules` overrides `rules`. # Default: empty extended-rules: json: # Supported string cases: # - `camel` # - `pascal` # - `kebab` # - `snake` # - `upperSnake` # - `goCamel` # - `goPascal` # - `goKebab` # - `goSnake` # - `header` # - `lower` # - `header` # # Required case: camel # Adds 'AMQP', 'DB', 'GID', 'RTP', 'SIP', 'TS' to initialisms, # and removes 'LHS', 'RHS' from initialisms. # Default: false extra-initialisms: true # Defines initialism additions and overrides. # Default: empty initialism-overrides: DB: true # add a new initialism LHS: false # disable a default initialism. # ... # Uses the struct field name to check the name of the struct tag. # Default: false use-field-name: true # The field names to ignore. # Default: [] ignored-fields: - Bar - Foo # Overrides the default/root configuration. # Default: [] overrides: - # The package path (uses `/` only as a separator). # Required pkg: foo/bar # Default: empty or the same as the default/root configuration. rules: json: snake xml: pascal # Default: empty or the same as the default/root configuration. extended-rules: # Same options as the base `extended-rules`. # Default: false (WARNING: it doesn't follow the default/root configuration) use-field-name: true # The field names to ignore. # Default: [] or the same as the default/root configuration. ignored-fields: - Bar - Foo # Ignore the package (takes precedence over all other configurations). # Default: false ignore: true","testableexamples#testableexamples":"Linter checks if examples are testable (have an expected output).\nSince golangci-lint v1.50.0 Repository No settings available.","testifylint#testifylint":"Checks usage of github.com/stretchr/testify.\nSince golangci-lint v1.55.0 Autofix Repository linters: settings: testifylint: # Enable all checkers (https://github.com/Antonboom/testifylint#checkers). # Default: false enable-all: true # Disable checkers by name # (in addition to default # suite-thelper # ). disable: - blank-import - bool-compare - compares - contains - empty - encoded-compare - equal-values - error-is-as - error-nil - expected-actual - float-compare - formatter - go-require - len - negative-positive - nil-compare - regexp - require-error - suite-broken-parallel - suite-dont-use-pkg - suite-extra-assert-call - suite-method-signature - suite-subtest-run - suite-thelper - useless-assert # Disable all checkers (https://github.com/Antonboom/testifylint#checkers). # Default: false disable-all: true # Enable checkers by name # (in addition to default # blank-import, bool-compare, compares, contains, empty, encoded-compare, equal-values, error-is-as, error-nil, # expected-actual, go-require, float-compare, formatter, len, negative-positive, nil-compare, regexp, require-error, # suite-broken-parallel, suite-dont-use-pkg, suite-extra-assert-call, suite-subtest-run, suite-method-signature, # useless-assert # ). enable: - blank-import - bool-compare - compares - contains - empty - encoded-compare - equal-values - error-is-as - error-nil - expected-actual - float-compare - formatter - go-require - len - negative-positive - nil-compare - regexp - require-error - suite-broken-parallel - suite-dont-use-pkg - suite-extra-assert-call - suite-method-signature - suite-subtest-run - suite-thelper - useless-assert bool-compare: # To ignore user defined types (over builtin bool). # Default: false ignore-custom-types: true expected-actual: # Regexp for expected variable name. # Default: (^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$) pattern: ^expected formatter: # To enable go vet's printf checks. # Default: true check-format-string: false # To require f-assertions (e.g. `assert.Equalf`) if format string is used, even if there are no variable-length # variables, i.e. it requires `require.NoErrorf` for both these cases: # - require.NoErrorf(t, err, \"unexpected error\") # - require.NoErrorf(t, err, \"unexpected error for sid: %v\", sid) # To understand this behavior, please read the # https://github.com/Antonboom/testifylint?tab=readme-ov-file#historical-reference-of-formatter. # Default: false require-f-funcs: true # To require that the first element of msgAndArgs (msg) has a string type. # For example, in such case assertion like `assert.True(t, b, tt.case)` will be considered as invalid. # Default: true require-string-msg: false go-require: # To ignore HTTP handlers (like http.HandlerFunc). # Default: false ignore-http-handlers: true require-error: # Regexp for assertions to analyze. If defined, then only matched error assertions will be reported. # Default: \"\" fn-pattern: ^(Errorf?|NoErrorf?)$ suite-extra-assert-call: # To require or remove extra Assert() call? # Default: remove mode: require","testpackage#testpackage":"Linter that makes you use a separate _test package.\nSince golangci-lint v1.25.0 Repository linters: settings: testpackage: # Regexp pattern to skip files. # Default: \"(export|internal)_test\\\\.go\" skip-regexp: (export|internal)_test\\.go # List of packages that don't end with _test that tests are allowed to be in. # Default: \"main\" allow-packages: - example - main","thelper#thelper":"Thelper detects tests helpers which do not start with the t.Helper() method.\nSince golangci-lint v1.34.0 Repository linters: settings: thelper: test: # Check *testing.T is first param (or after context.Context) of helper function. # Default: true first: false # Check *testing.T param has name t. # Default: true name: false # Check t.Helper() begins helper function. # Default: true begin: false benchmark: # Check *testing.B is first param (or after context.Context) of helper function. # Default: true first: false # Check *testing.B param has name b. # Default: true name: false # Check b.Helper() begins helper function. # Default: true begin: false tb: # Check *testing.TB is first param (or after context.Context) of helper function. # Default: true first: false # Check *testing.TB param has name tb. # Default: true name: false # Check tb.Helper() begins helper function. # Default: true begin: false fuzz: # Check *testing.F is first param (or after context.Context) of helper function. # Default: true first: false # Check *testing.F param has name f. # Default: true name: false # Check f.Helper() begins helper function. # Default: true begin: false","tparallel#tparallel":"Tparallel detects inappropriate usage of t.Parallel() method in your Go test codes.\nSince golangci-lint v1.32.0 Repository No settings available.","unconvert#unconvert":"Remove unnecessary type conversions.\nSince golangci-lint v1.0.0 Repository linters: settings: unconvert: # Remove conversions that force intermediate rounding. # Default: false fast-math: true # Be more conservative (experimental). # Default: false safe: true","unparam#unparam":"Reports unused function parameters.\nSince golangci-lint v1.9.0 Repository linters: settings: unparam: # Inspect exported functions. # # Set to true if no external program/library imports your code. # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: # if it's called for subdir of a project it can't find external interfaces. All text editor integrations # with golangci-lint call it on a directory with the changed file. # # Default: false check-exported: true","unqueryvet#unqueryvet":"Detects SELECT * in SQL queries and SQL builders, preventing performance issues and encouraging explicit column selection.\nSince golangci-lint v2.5.0 New Repository linters: settings: unqueryvet: # Enable SQL builder checking. # Default: true check-sql-builders: false # Regex patterns for acceptable SELECT * usage. # Default: # - \"SELECT \\\\* FROM information_schema\\\\..*\" # - \"SELECT \\\\* FROM pg_catalog\\\\..*\" # - \"SELECT COUNT\\\\(\\\\*\\\\)\" # - \"SELECT MAX\\\\(\\\\*\\\\)\" # - \"SELECT MIN\\\\(\\\\*\\\\)\" allowed-patterns: - \"SELECT \\\\* FROM temp_.*\" - \"SELECT \\\\* FROM.*-- migration\"","unused#unused":"Checks Go code for unused constants, variables, functions and types.\nSince golangci-lint v1.20.0 Repository linters: settings: unused: # Mark all struct fields that have been written to as used. # Default: true field-writes-are-uses: false # Treat IncDec statement (e.g. `i++` or `i--`) as both read and write operation instead of just write. # Default: false post-statements-are-reads: true # Mark all exported fields as used. # default: true exported-fields-are-used: false # Mark all function parameters as used. # default: true parameters-are-used: false # Mark all local variables as used. # default: true local-variables-are-used: false # Mark all identifiers inside generated files as used. # Default: true generated-is-used: false","usestdlibvars#usestdlibvars":"A linter that detect the possibility to use variables/constants from the Go standard library.\nSince golangci-lint v1.48.0 Autofix Repository linters: settings: usestdlibvars: # Suggest the use of http.MethodXX. # Default: true http-method: false # Suggest the use of http.StatusXX. # Default: true http-status-code: false # Suggest the use of time.Month in time.Date. # Default: false time-date-month: true # Suggest the use of time.Weekday.String(). # Default: true time-weekday: true # Suggest the use of time.Month.String(). # Default: false time-month: true # Suggest the use of time.Layout. # Default: false time-layout: true # Suggest the use of crypto.Hash.String(). # Default: false crypto-hash: true # Suggest the use of rpc.DefaultXXPath. # Default: false default-rpc-path: true # Suggest the use of sql.LevelXX.String(). # Default: false sql-isolation-level: true # Suggest the use of tls.SignatureScheme.String(). # Default: false tls-signature-scheme: true # Suggest the use of constant.Kind.String(). # Default: false constant-kind: true","usetesting#usetesting":"Reports uses of functions with replacement inside the testing package.\nSince golangci-lint v1.63.0 Autofix Repository linters: settings: usetesting: # Enable/disable `os.CreateTemp(\"\", ...)` detections. # Default: true os-create-temp: false # Enable/disable `os.MkdirTemp()` detections. # Default: true os-mkdir-temp: false # Enable/disable `os.Setenv()` detections. # Default: true os-setenv: false # Enable/disable `os.TempDir()` detections. # Default: false os-temp-dir: true # Enable/disable `os.Chdir()` detections. # Disabled if Go \u003c 1.24. # Default: true os-chdir: false # Enable/disable `context.Background()` detections. # Disabled if Go \u003c 1.24. # Default: false context-background: true # Enable/disable `context.TODO()` detections. # Disabled if Go \u003c 1.24. # Default: false context-todo: true","varnamelen#varnamelen":"Checks that the length of a variable's name matches its scope.\nSince golangci-lint v1.43.0 Repository linters: settings: varnamelen: # The longest distance, in source lines, that is being considered a \"small scope\". # Variables used in at most this many lines will be ignored. # Default: 5 max-distance: 6 # The minimum length of a variable's name that is considered \"long\". # Variable names that are at least this long will be ignored. # Default: 3 min-name-length: 2 # Check method receivers. # Default: false check-receiver: true # Check named return values. # Default: false check-return: true # Check type parameters. # Default: false check-type-param: true # Ignore \"ok\" variables that hold the bool return value of a type assertion. # Default: false ignore-type-assert-ok: true # Ignore \"ok\" variables that hold the bool return value of a map index. # Default: false ignore-map-index-ok: true # Ignore \"ok\" variables that hold the bool return value of a channel receive. # Default: false ignore-chan-recv-ok: true # Optional list of variable names that should be ignored completely. # Default: [] ignore-names: - err # Optional list of variable declarations that should be ignored completely. # Entries must be in one of the following forms (see below for examples): # - for variables, parameters, named return values, method receivers, or type parameters: # ( can also be a pointer/slice/map/chan/...) # - for constants: const # # Default: [] ignore-decls: - c echo.Context - t testing.T - f *foo.Bar - e error - i int - const C - T any - m map[string]int","wastedassign#wastedassign":"Finds wasted assignment statements.\nSince golangci-lint v1.38.0 Repository No settings available.","whitespace#whitespace":"Whitespace is a linter that checks for unnecessary newlines at the start and end of functions, if, for, etc.\nSince golangci-lint v1.19.0 Autofix Repository linters: settings: whitespace: # Enforces newlines (or comments) after every multi-line if statement. # Default: false multi-if: true # Enforces newlines (or comments) after every multi-line function signature. # Default: false multi-func: true","wrapcheck#wrapcheck":"Checks that errors returned from external packages are wrapped.\nSince golangci-lint v1.32.0 Repository linters: settings: wrapcheck: # An array of strings specifying additional substrings of signatures to ignore. # Unlike 'ignore-sigs', this option extends the default set (or the set specified in 'ignore-sigs') without replacing it entirely. # This allows you to add specific signatures to the ignore list # while retaining the defaults or any items in 'ignore-sigs'. # Default: [] extra-ignore-sigs: - .CustomError( - .SpecificWrap( # An array of strings that specify substrings of signatures to ignore. # If this set, it will override the default set of ignored signatures. # See https://github.com/tomarrell/wrapcheck#configuration for more information. # Default: [\".Errorf(\", \"errors.New(\", \"errors.Unwrap(\", \"errors.Join(\", \".Wrap(\", \".Wrapf(\", \".WithMessage(\", \".WithMessagef(\", \".WithStack(\"] ignore-sigs: - .Errorf( - errors.New( - errors.Unwrap( - errors.Join( - .Wrap( - .Wrapf( - .WithMessage( - .WithMessagef( - .WithStack( # An array of strings that specify regular expressions of signatures to ignore. # Default: [] ignore-sig-regexps: - \\.New.*Error\\( # An array of strings that specify globs of packages to ignore. # Default: [] ignore-package-globs: - encoding/* - github.com/pkg/* # An array of strings that specify regular expressions of interfaces to ignore. # Default: [] ignore-interface-regexps: - ^(?i)c(?-i)ach(ing|e) # Determines whether wrapcheck should report errors returned from inside the package. # Default: false report-internal-errors: true","wsl#wsl":"New major version. Use wsl_v5 instead.\nSince golangci-lint v1.20.0 Deprecated since v2.2.0 Repository No settings available.","wsl_v5#wsl_v5":"Add or remove empty lines.\nSince golangci-lint v2.2.0 Autofix Repository linters: settings: wsl_v5: # Allow cuddling a variable if it's used first in the immediate following block, # even if the statement with the block doesn't use the variable. # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration # Default: true allow-first-in-block: false # Same as above, # but allows cuddling if the variable is used anywhere in the following (or nested) block. # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration # Default: false allow-whole-block: true # If a block contains more than this number of lines, # the branch statement needs to be separated by whitespace. # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration # Default: 2 branch-max-lines: 4 # If set to a non-negative number, # case blocks need to end with whitespace if exceeding this number # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#configuration # Default: 0 case-max-lines: 2 # Default checks to use. # Can be `all`, `none`, `default` or empty. # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration # Default: \"\" default: all # Enabled checks. # Will be additive to any presets. # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration # Default: [] enable: - assign - branch - decl - defer - expr - for - go - if - inc-dec - label - range - return - select - send - switch - type-switch - append - assign-exclusive - assign-expr - err - leading-whitespace - trailing-whitespace # Disable checks. # Will be subtractive to any preset. # https://github.com/bombsimon/wsl/tree/main?tab=readme-ov-file#checks-and-configuration # Default: [] disable: - assign - branch - decl - defer - expr - for - go - if - inc-dec - label - range - return - select - send - switch - type-switch - append - assign-exclusive - assign-expr - err - leading-whitespace - trailing-whitespace","zerologlint#zerologlint":"Detects the wrong usage of zerolog that a user forgets to dispatch with Send or Msg.\nSince golangci-lint v1.53.0 Repository No settings available."},"title":"Settings"},"/docs/linters/false-positives/":{"data":{"":"False positives are inevitable, but we did our best to reduce their count.\nIf a false positive occurred, you have several choices.","exclude#Exclude":"","exclude-issue-by-text#Exclude Issue by Text":"You can use linters.exclusions.rules config option for per-path or per-linter configuration.\nIn the following example, all the reports from the linters (linters) that contains the text (text) are excluded:\nlinters: exclusions: rules: - linters: - mnd text: \"Magic number: 9\" In the following example, all the reports from the linters (linters) that originated from the source (source) are excluded:\nlinters: exclusions: rules: - linters: - lll source: \"^//go:generate \" In the following example, all the reports that contains the text (text) in the path (path) are excluded:\nlinters: exclusions: rules: - path: path/to/a/file.go text: \"string `example` has (\\\\d+) occurrences, make it a constant\"","exclude-issues-by-path#Exclude Issues by Path":"Exclude issues in path by linters.exclusions.paths or linters.exclusions.rules config options.\nIn the following example, all the reports from the linters (linters) that concerns the path (path) are excluded:\nlinters: exclusions: rules: - path: '(.+)_test\\.go' linters: - funlen - goconst The opposite, excluding reports except for specific paths, is also possible. In the following example, only test files get checked:\nlinters: exclusions: rules: - path-except: '(.+)_test\\.go' linters: - funlen - goconst In the following example, all the reports related to the files (paths) are excluded:\nlinters: exclusions: paths: - path/to/a/file.go In the following example, all the reports related to the directories (paths) are excluded:\nlinters: exclusions: paths: - path/to/a/dir/","exclusion-presets#Exclusion Presets":"Some exclusions are considered common. To help golangci-lint users, those common exclusions are provided through presets.\nlinters: exclusions: presets: - comments - common-false-positives - legacy - std-error-handling","nolint-directive#Nolint Directive":"To exclude issues from all linters use //nolint:all. For example, if it’s used inline (not from the beginning of the line) it excludes issues only for this line.\nvar bad_name int //nolint:all To exclude issues from specific linters only:\nvar bad_name int //nolint:wsl,unused To exclude issues for the block of code, use this directive at the beginning of a line:\n//nolint:all func allIssuesInThisFunctionAreExcluded() *string { // ... } //nolint:govet var ( a int b int ) Also, you can exclude all issues in a file by:\n//nolint:unparam package pkg You may add a comment explaining or justifying why a nolint directive is being used on the same line as the flag itself:\n//nolint:gocyclo // This legacy function is complex, but the team too busy to simplify it func someLegacyFunction() *string { // ... } You can see more examples of using nolint directives in our tests for it.","preset-comments#Preset \u003ccode\u003ecomments\u003c/code\u003e":"Linter Issue Text staticcheck (ST1000|ST1020|ST1021|ST1022) revive exported (.+) should have comment( \\(or a comment on this block\\))? or be unexported revive package comment should be of the form \"(.+)...\" revive comment on exported (.+) should be of the form \"(.+)...\" revive should have a package comment","preset-common-false-positives#Preset \u003ccode\u003ecommon-false-positives\u003c/code\u003e":"Linter Issue Text gosec G103: Use of unsafe calls should be audited gosec G204: Subprocess launched with variable gosec G304: Potential file inclusion via variable","preset-legacy#Preset \u003ccode\u003elegacy\u003c/code\u003e":"Linter Issue Text govet (possible misuse of unsafe.Pointer|should have signature) staticcheck SA4011 gosec G104 gosec (G301|G302|G307): Expect (directory permissions to be 0750|file permissions to be 0600) or less","preset-std-error-handling#Preset \u003ccode\u003estd-error-handling\u003c/code\u003e":"Linter Issue Text errcheck (?i)Error return value of .((os\\.)?std(out|err)\\..*|.*Close|.*Flush|os\\.Remove(All)?|.*print(f|ln)?|os\\.(Un)?Setenv). is not checked","specific-linter-excludes#Specific Linter Excludes":"Most of the linters have a configuration, sometimes false-positives can be related to a bad configuration of a linter. So it’s recommended to check the linter configurations.\nOtherwise, some linters have dedicated configuration to exclude or disable rules.\nAn example with staticcheck:\nlinters: settings: staticcheck: checks: - all - '-SA1000' # disable the rule SA1000 - '-SA1004' # disable the rule SA1004","syntax#Syntax":"nolint is not regular comment but a directive.\nA directive comment is a line matching the regular expression //(line |extern |export |[a-z0-9]+:[a-z0-9]). https://go.dev/doc/comment#syntax\nThis means that no spaces are allowed between:\n// and nolint nolint and : : and the name of the linter. Invalid syntax:\n// nolint // nolint:xxx //nolint :xxx //nolint: xxx Valid syntax:\n//nolint:xxx"},"title":"False Positives"},"/docs/plugins/":{"data":{"":"Module Plugin System Go Plugin System"},"title":"Plugins"},"/docs/plugins/go-plugins/":{"data":{"":"We recommend using Module Plugin System instead of the Go Plugin System. Private linters can be added through Go’s plugin system.\nFor a private linter (which acts as a plugin) to work properly, the plugin as well as the golangci-lint binary needs to be built for the same environment.\nCGO_ENABLED is another requirement.\nThis means that golangci-lint needs to be built for whatever machine you intend to run it on (cloning the golangci-lint repository and running a CGO_ENABLED=1 make build should do the trick for your machine).","configure-a-plugin#Configure a Plugin":"If you already have a linter plugin available, you can follow these steps to define its usage in a projects .golangci.yml file.\nAn example linter can be found at here.\nIf you’re looking for instructions on how to configure your own custom linter, they can be found further down.\nIf the project you want to lint does not have one already, copy the .golangci.yml to the root directory. Adjust the YAML to appropriate linters.settings.custom entries as so: .golangci.ymlversion: \"2\" linters: settings: custom: example: path: /example.so description: The description of the linter original-url: github.com/golangci/example-linter settings: # Settings are optional. one: Foo two: - name: Bar three: name: Bar That is all the configuration that is required to run a custom linter in your project.\nCustom linters are enabled by default, but abide by the same rules as other linters.\nIf the ‘disable all’ option is specified either on command line or in .golangci.yml files linters.default: none, custom linters will be disabled; they can be re-enabled by adding them to the linters.enable list, or providing the enabled option on the command line, golangci-lint run -Eexample.\nThe configuration inside the linters.settings field of linter have some limitations (there are NOT related to the plugin system itself): we use Viper to handle the configuration, but Viper put all the keys in lowercase, and . cannot be used inside a key.","create-a-plugin#Create a Plugin":"Your linter must provide one or more golang.org/x/tools/go/analysis.Analyzer structs.\nYour project should also use go.mod.\nAll versions of libraries that overlap golangci-lint (including replaced libraries) MUST be set to the same version as golangci-lint. You can see the versions by running go version -m golangci-lint.\nYou’ll also need to create a Go file like plugin/example.go.\nThis file MUST be in the package main, and MUST define an exposed function called New with the following signature:\nfunc New(conf any) ([]*analysis.Analyzer, error) { // ... } See plugin/example.go for more info.\nTo build the plugin, from the root project directory, run:\ngo build -buildmode=plugin plugin/example.go This will create a plugin *.so file that can be copied into your project or another well-known location for usage in golangci-lint."},"title":"Go Plugin System"},"/docs/plugins/module-plugins/":{"data":{"":"Tip\nAn example linter can be found at here.","configuration-example#Configuration Example":".custom-gcl.ymlversion: v2.5.0 plugins: # a plugin from a Go proxy - module: 'github.com/golangci/plugin1' import: 'github.com/golangci/plugin1/foo' version: v1.0.0 # a plugin from local source - module: 'github.com/golangci/plugin2' path: /my/local/path/plugin2 .golangci.ymlversion: \"2\" linters: default: none enable: - foo settings: custom: foo: type: \"module\" description: This is an example usage of a plugin linter. settings: message: hello","configuration-example-1#Configuration Example":".golangci.ymlversion: \"2\" linters: default: none enable: - foo settings: custom: foo: type: \"module\" description: This is an example usage of a plugin linter. settings: message: hello","reference#Reference":"The configuration file can be validated with the JSON Schema: custom-gcl.jsonschema.json\n.custom-gcl.yml# The golangci-lint version used to build the custom binary. # Required. version: v2.0.0 # The name of the custom binary. # Optional. # Default: custom-gcl name: custom-golangci-lint # The directory path used to store the custom binary. # Optional. # Default: . destination: ./my/path/ # The list of the plugins to integrate inside the custom binary. plugins: # a plugin from a Go proxy - module: 'github.com/example/plugin3' version: v1.2.3 # a plugin from a Go proxy (with a specific import path) - module: 'github.com/example/plugin4' import: 'github.com/example/plugin4/foo' version: v1.0.0 # a plugin from local source (with absolute path) - module: 'github.com/example/plugin2' path: /my/local/path/plugin2 # a plugin from local source (with relative path) - module: 'github.com/example/plugin1' path: ./my/local/path/plugin1 # a plugin from local source (with absolute path and a specific import path) - module: 'github.com/example/plugin2' import: 'github.com/example/plugin4/foo' path: /my/local/path/plugin2","the-automatic-way#The Automatic Way":"Define your building configuration into .custom-gcl.yml. Run the command golangci-lint custom (or golangci-lint custom -v to have logs). Define the plugin inside the linters.settings.custom section with the type module. Run the resulting custom binary of golangci-lint (./custom-gcl by default). Requirements:\nGo git","the-manual-way#The Manual Way":"Add a blank-import of your module inside cmd/golangci-lint/plugins.go. Run go mod tidy (the module containing the plugin will be imported). Run make build. Define the plugin inside the linters.settings.custom section with the type module. Run your custom version of golangci-lint."},"title":"Module Plugin System"},"/docs/product/":{"data":{"":"Thanks Migration Guide Changelog Roadmap"},"title":"Product"},"/docs/product/migration-guide/":{"data":{"":"","--disable-all-and---enable-all#\u003ccode\u003e--disable-all\u003c/code\u003e and \u003ccode\u003e--enable-all\u003c/code\u003e":"--disable-all has been replaced with --default=none.\n--enable-all has been replaced with --default=all.","--out-format#\u003ccode\u003e--out-format\u003c/code\u003e":"--out-format has been replaced with the following flags:\n# Previously 'colored-line-number' and 'line-number' --output.text.path --output.text.print-linter-name --output.text.print-issued-lines --output.text.colors # Previously 'json' --output.json.path # Previously 'colored-tab' and 'tab' --output.tab.path --output.tab.print-linter-name --output.tab.colors # Previously 'html' --output.html.path # Previously 'checkstyle' --output.checkstyle.path # Previously 'code-climate' --output.code-climate.path # Previously 'junit-xml' and 'junit-xml-extended' --output.junit-xml.path --output.junit-xml.extended # Previously 'teamcity' --output.teamcity.path # Previously 'sarif' --output.sarif.path","--print-issued-lines#\u003ccode\u003e--print-issued-lines\u003c/code\u003e":"--print-issued-lines has been replaced with --output.text.print-issued-lines.","--print-linter-name#\u003ccode\u003e--print-linter-name\u003c/code\u003e":"--print-linter-name has been replaced with --output.text.print-linter-name or --output.tab.print-linter-name.","alternative-linter-names#Alternative Linter Names":"The alternative linters has been removed.\nAlt Name v1 Name v2 gas gosec goerr113 err113 gomnd mnd logrlint loggercheck megacheck staticcheck vet govet vetshadow govet v1v2 linters: enable: - gas - goerr113 - gomnd - logrlint - megacheck - vet - vetshadow linters: enable: - gosec - err113 - mnd - loggercheck - staticcheck - govet","changes#Changes":"","command-line-flags#Command Line Flags":"The following flags have been removed:\n--disable-all --enable-all -p, --presets --fast -e, --exclude --exclude-case-sensitive --exclude-dirs-use-default --exclude-dirs --exclude-files --exclude-generated --exclude-use-default --go string --sort-order --sort-results --out-format --print-issued-lines --print-linter-name","command-migrate#Command \u003ccode\u003emigrate\u003c/code\u003e":"You can use golangci-lint to migrate your configuration with the migrate command:\ngolangci-lint migrate Be aware that comments inside a configuration file are not migrated. You need to add them manually after the migration.\nDeprecated options from v1 or unknown fields are not migrated.\nThe migration file format is based on the extension of the configuration file. The format can be overridden by using the --format flag:\ngolangci-lint migrate --format json Before the migration, the previous configuration file is copied and saved to a file named .bck..\nBy default, before the migration process, the configuration file is validated against the JSON Schema of configuration v1. If you want to skip this validation, you can use the --skip-validation flag:\ngolangci-lint migrate --skip-validation The migrate command enforces the following default values:\nrun.timeout: the existing value is ignored because, in v2, there is no timeout by default. issues.show-stats: the existing value is ignored because, in v2, stats are enabled by default. run.concurrency: if the existing value was 0, it is removed as 0 is the new default. run.relative-path-mode: if the existing value was cfg, it is removed as cfg is the new default. issues.exclude-generated has a new default value (v1 lax, v2 strict), so this field will be added during the migration to maintain the previous behavior.\nissues.exclude-dirs-use-default has been removed, so it is converted to linters.exclusions.paths and, if needed, formatters.exclusions.paths.\nOther fields explicitly defined in the configuration file are migrated even if the value is the same as the default value.\nThe migrate command automatically migrates linters.presets in individual linters to linters.enable.\n$ golangci-lint migrate -h Migrate configuration file from v1 to v2. Usage: golangci-lint migrate [flags] Flags: -c, --config PATH Read config from file path PATH --no-config Don't read config file --format string Output file format. By default, the format of the input configuration file is used. It can be 'yml', 'yaml', 'toml', or 'json'. --skip-validation Skip validation of the configuration file against the JSON Schema for v1. Global Flags: --color string Use color when printing; can be 'always', 'auto', or 'never' (default \"auto\") -h, --help Help for a command -v, --verbose Verbose output","deprecated-linters#Deprecated Linters":"The following deprecated linters have been removed:\ndeadcode execinquery exhaustivestruct exportloopref golint ifshort interfacer maligned nosnakecase scopelint structcheck tenv varcheck","examples#Examples":"Run only the govet linter, output results to stdout in JSON format, and sort results:\nv1v2 golangci-lint run --disable-all --enable=govet --out-format=json --sort-order=linter --sort-results golangci-lint run --default=none --enable=govet --output.json.path=stdout Do not print issued lines, output results to stdout without colors in text format, and to gl-code-quality-report.json file in Code Climate’s format:\nv1v2 golangci-lint run --print-issued-lines=false --out-format code-climate:gl-code-quality-report.json,line-number golangci-lint run --output.text.path=stdout --output.text.colors=false --output.text.print-issued-lines=false --output.code-climate.path=gl-code-quality-report.json","integration#Integration":"","issues#\u003ccode\u003eissues\u003c/code\u003e":"","issuesexclude#\u003ccode\u003eissues.exclude\u003c/code\u003e":"This property has been replaced with linters.exclusions.rules.\nv1v2 issues: exclude: - abcdef linters: exclusions: rules: - path: '(.+)\\.go$' text: abcdef","issuesexclude-case-sensitive#\u003ccode\u003eissues.exclude-case-sensitive\u003c/code\u003e":"This property has been removed.\nissues.exclude, issues.exclude-rules.text, and issues.exclude-rules.source are case-sensitive by default.\nTo ignore case, use (?i) at the beginning of a regex syntax.\nv1v2 issues: exclude-case-sensitive: false exclude: - 'abcdef' linters: exclusions: rules: - path: '(.+)\\.go$' text: (?i)abcdef","issuesexclude-dirs#\u003ccode\u003eissues.exclude-dirs\u003c/code\u003e":"This property has been replaced with linters.exclusions.paths and formatters.exclusions.paths.\nv1v2 issues: exclude-dirs: - src/external_libs - autogenerated_by_my_lib linters: exclusions: paths: - src/external_libs - autogenerated_by_my_lib","issuesexclude-dirs-use-default#\u003ccode\u003eissues.exclude-dirs-use-default\u003c/code\u003e":"This property has been removed.\nUse linters.exclusions.paths and formatters.exclusions.paths to exclude directories.\nv1v2 issues: exclude-dirs-use-default: true linters: exclusions: paths: - third_party$ - builtin$ - examples$","issuesexclude-files#\u003ccode\u003eissues.exclude-files\u003c/code\u003e":"This property has been replaced with linters.exclusions.paths and formatters.exclusions.paths.\nv1v2 issues: exclude-files: - '.*\\.my\\.go$' - lib/bad.go linters: exclusions: paths: - '.*\\.my\\.go$' - lib/bad.go","issuesexclude-generated#\u003ccode\u003eissues.exclude-generated\u003c/code\u003e":"This property has been replaced with linters.exclusions.generated.\nv1v2 linters: exclude-generated: lax linters: exclusions: generated: lax","issuesexclude-generated-strict#\u003ccode\u003eissues.exclude-generated-strict\u003c/code\u003e":"This property has been deprecated since v1.59.0 and has been replaced with linters.exclusions.generated: strict.\nv1v2 linters: exclude-generated-strict: true linters: exclusions: generated: strict","issuesexclude-rules#\u003ccode\u003eissues.exclude-rules\u003c/code\u003e":"This property has been replaced with linters.exclusions.rules.\nv1v2 issues: exclude-rules: - path: '_test\\.go' linters: - gocyclo - errcheck - dupl - gosec - path-except: '_test\\.go' linters: - staticcheck - path: internal/hmac/ text: \"weak cryptographic primitive\" linters: - gosec - linters: - staticcheck text: \"SA9003:\" - linters: - err113 source: \"foo\" linters: exclusions: rules: - path: '_test\\.go' linters: - dupl - errcheck - gocyclo - gosec - path-except: '_test\\.go' linters: - staticcheck - path: internal/hmac/ text: weak cryptographic primitive linters: - gosec - text: 'SA9003:' linters: - staticcheck - source: foo linters: - err113","issuesexclude-use-default#\u003ccode\u003eissues.exclude-use-default\u003c/code\u003e":"This property has been replaced with linters.exclusions.presets.\nv1v2 issues: exclude-use-default: true linters: exclusions: presets: - comments - common-false-positives - legacy - std-error-handling","issuesinclude#\u003ccode\u003eissues.include\u003c/code\u003e":"This property has been replaced with linters.exclusions.presets.\nv1v2 issues: include: - EXC0014 - EXC0015 linters: exclusions: presets: - common-false-positives - legacy - std-error-handling","linters#\u003ccode\u003elinters\u003c/code\u003e":"","linters-settings#\u003ccode\u003elinters-settings\u003c/code\u003e":"The linters-settings section has been split into linters.settings and formatters.settings.\nSettings for gci, gofmt, gofumpt, and goimports are moved to the formatters.settings section.\nv1v2 linters-settings: govet: enable-all: true gofmt: simplify: false linters: settings: govet: enable-all: true formatters: settings: gofmt: simplify: false","linters-settingsasasalintignore-test#\u003ccode\u003elinters-settings.asasalint.ignore-test\u003c/code\u003e":"This option has been removed.\nTo ignore test files, use linters.exclusions.rules.\nv1v2 linters-settings: asasalint: ignore-test: true linters: exclusions: rules: - path: '(.+)_test\\.go' linters: - asasalint","linters-settingscopyloopvarignore-alias#\u003ccode\u003elinters-settings.copyloopvar.ignore-alias\u003c/code\u003e":"This option has been deprecated since v1.58.0 and has been replaced with linters.settings.copyloopvar.check-alias.\nv1v2 linters-settings: copyloopvar: ignore-alias: false linters: settings: copyloopvar: check-alias: true","linters-settingscyclopskip-tests#\u003ccode\u003elinters-settings.cyclop.skip-tests\u003c/code\u003e":"This option has been removed.\nTo ignore test files, use linters.exclusions.rules.\nv1v2 linters-settings: cyclop: skip-test: true linters: exclusions: rules: - path: '(.+)_test\\.go' linters: - cyclop","linters-settingserrcheckexclude#\u003ccode\u003elinters-settings.errcheck.exclude\u003c/code\u003e":"This option has been deprecated since v1.42.0 and has been removed.\nTo exclude functions, use linters.settings.errcheck.exclude-functions instead.\nv1v2 linters-settings: errcheck: exclude: ./errcheck_excludes.txt linters: settings: errcheck: exclude-functions: - io.ReadFile - io.Copy(*bytes.Buffer) - io.Copy(os.Stdout)","linters-settingserrcheckignore#\u003ccode\u003elinters-settings.errcheck.ignore\u003c/code\u003e":"This option has been deprecated since v1.13.0 and has been removed.\nTo exclude functions, use linters.settings.errcheck.exclude-functions instead.\nv1v2 linters-settings: errcheck: ignore: 'io:.*' linters: settings: errcheck: exclude-functions: - 'io.ReadFile' - 'io.Copy(*bytes.Buffer)' - 'io.Copy(os.Stdout)'","linters-settingsexhaustivecheck-generated#\u003ccode\u003elinters-settings.exhaustive.check-generated\u003c/code\u003e":"This option has been removed.\nTo analyze generated files, use linters.exclusions.generated.\nv1v2 linters-settings: exhaustive: check-generated: true linters: exclusions: generated: disable","linters-settingsforbidigoforbidp#\u003ccode\u003elinters-settings.forbidigo.forbid[].p\u003c/code\u003e":"This field has been replaced with linters-settings.forbidigo.forbid[].pattern.\nv1v2 linters-settings: forbidigo: forbid: - p: '^fmt\\.Print.*$' msg: Do not commit print statements. linters: settings: forbidigo: forbid: - pattern: '^fmt\\.Print.*$' msg: Do not commit print statements.","linters-settingsforbidigoforbidpattern#\u003ccode\u003elinters-settings.forbidigo.forbid[]\u0026lt;pattern\u0026gt;\u003c/code\u003e":"The pattern has become mandatory for the forbid field.\nv1v2 linters-settings: forbidigo: forbid: - '^print(ln)?$' - '^spew\\.(ConfigState\\.)?Dump$' linters: settings: forbidigo: forbid: - pattern: '^print(ln)?$' - pattern: '^spew\\.(ConfigState\\.)?Dump$'","linters-settingsgcilocal-prefixes#\u003ccode\u003elinters-settings.gci.local-prefixes\u003c/code\u003e":"This option has been deprecated since v1.44.0 and has been removed.\nUse linters.settings.gci.sections instead.\nv1v2 linters-settings: gci: local-prefixes: 'github.com/example/pkg' linters: settings: gci: sections: - standard - default - prefix(github.com/example/pkg)","linters-settingsgciskip-generated#\u003ccode\u003elinters-settings.gci.skip-generated\u003c/code\u003e":"This option has been removed.\nTo analyze generated files, use linters.exclusions.generated.\nv1v2 linters: settings: gci: skip-generated: false linters: exclusions: generated: disable","linters-settingsgoconstignore-tests#\u003ccode\u003elinters-settings.goconst.ignore-tests\u003c/code\u003e":"This option has been removed.\nTo ignore test files, use linters.exclusions.rules.\nv1v2 linters-settings: goconst: ignore-tests: true linters: exclusions: rules: - path: '(.+)_test\\.go' linters: - goconst","linters-settingsgocriticsettingsruleguardrules#\u003ccode\u003elinters-settings.gocritic.settings.ruleguard.rules\u003c/code\u003e":"The special variable ${configDir} has been replaced with ${base-path}.\nv1v2 linters-settings: gocritic: settings: ruleguard: rules: '${configDir}/ruleguard/rules-*.go' linters: settings: gocritic: settings: ruleguard: rules: '${base-path}/ruleguard/rules-*.go'","linters-settingsgovetcheck-shadowing#\u003ccode\u003elinters-settings.govet.check-shadowing\u003c/code\u003e":"This option has been deprecated since v1.57.0 and has been removed.\nUse linters.settings.govet.enable: shadow instead.\nv1v2 linters-settings: govet: check-shadowing: true linters: settings: govet: enable: - shadow","linters-settingsmisspellignore-words#\u003ccode\u003elinters-settings.misspell.ignore-words\u003c/code\u003e":"This option has been replaced with linters.settings.misspell.ignore-rules.\nv1v2 linters-settings: misspell: ignore-words: - foo linters: settings: misspell: ignore-rules: - foo","linters-settingspredeclaredignore#\u003ccode\u003elinters-settings.predeclared.ignore\u003c/code\u003e":"This string option has been replaced with the slice option with the same name.\nv1v2 linters-settings: predeclared: ignore: \"new,int\" linters: settings: predeclared: ignore: - new - int","linters-settingspredeclaredq#\u003ccode\u003elinters-settings.predeclared.q\u003c/code\u003e":"This option has been replaced with linters.settings.predeclared.qualified-name.\nv1v2 linters-settings: predeclared: q: true linters: settings: predeclared: qualified-name: true","linters-settingsreviveignore-generated-header#\u003ccode\u003elinters-settings.revive.ignore-generated-header\u003c/code\u003e":"This option has been removed.\nUse linters.exclusions.generated instead.\nv1v2 linters-settings: revive: ignore-generated-header: true linters: exclusions: generated: strict","linters-settingssloglintcontext-only#\u003ccode\u003elinters-settings.sloglint.context-only\u003c/code\u003e":"This option has been deprecated since v1.58.0 and has been replaced with linters.settings.sloglint.context.\nv1v2 linters-settings: sloglint: context-only: true linters: settings: sloglint: context: all","linters-settingsstaticcheckgo#\u003ccode\u003elinters-settings.staticcheck.go\u003c/code\u003e":"This option has been deprecated since v1.47.0 and has been removed.\nUse run.go instead.\nv1v2 linters-settings: staticcheck: go: '1.22' run: go: '1.22'","linters-settingsunusedexported-is-used#\u003ccode\u003elinters-settings.unused.exported-is-used\u003c/code\u003e":"This option has been deprecated since v1.60.0 and has been removed.\nv1v2 linters-settings: unused: exported-is-used: true # Removed","linters-settingsusestdlibvarsos-dev-null#\u003ccode\u003elinters-settings.usestdlibvars.os-dev-null\u003c/code\u003e":"This option has been deprecated since v1.51.0 and has been removed.\nv1v2 linters-settings: usestdlibvars: os-dev-null: true # Removed","linters-settingsusestdlibvarssyslog-priority#\u003ccode\u003elinters-settings.usestdlibvars.syslog-priority\u003c/code\u003e":"This option has been deprecated since v1.51.0 and has been removed.\nv1v2 linters-settings: usestdlibvars: syslog-priority: true # Removed","linters-settingswrapcheckignoreinterfaceregexps#\u003ccode\u003elinters-settings.wrapcheck.ignoreInterfaceRegexps\u003c/code\u003e":"This option has been renamed to linters.settings.wrapcheck.ignore-interface-regexps.\nv1v2 linters-settings: wrapcheck: ignoreInterfaceRegexps: - '^(?i)c(?-i)ach(ing|e)' linters: settings: wrapcheck: ignore-interface-regexps: - '^(?i)c(?-i)ach(ing|e)'","linters-settingswrapcheckignorepackageglobs#\u003ccode\u003elinters-settings.wrapcheck.ignorePackageGlobs\u003c/code\u003e":"This option has been renamed to linters.settings.wrapcheck.ignore-package-globs.\nv1v2 linters-settings: wrapcheck: ignorePackageGlobs: - 'encoding/*' linters: settings: wrapcheck: ignore-package-globs: - 'encoding/*'","linters-settingswrapcheckignoresigregexps#\u003ccode\u003elinters-settings.wrapcheck.ignoreSigRegexps\u003c/code\u003e":"This option has been renamed to linters.settings.wrapcheck.ignore-sig-regexps.\nv1v2 linters-settings: wrapcheck: ignoreSigRegexps: - '\\.New.*Error\\(' linters: settings: wrapcheck: ignore-sig-regexps: - '\\.New.*Error\\('","linters-settingswrapcheckignoresigs#\u003ccode\u003elinters-settings.wrapcheck.ignoreSigs\u003c/code\u003e":"This option has been renamed to linters.settings.wrapcheck.ignore-sigs.\nv1v2 linters-settings: wrapcheck: ignoreSigs: - '.Errorf(' linters: settings: wrapcheck: ignore-sigs: - '.Errorf('","lintersdisable-all#\u003ccode\u003elinters.disable-all\u003c/code\u003e":"This property has been replaced with linters.default: none.\nv1v2 linters: disable-all: true linters: default: none","lintersenable-all#\u003ccode\u003elinters.enable-all\u003c/code\u003e":"This property has been replaced with linters.default: all.\nv1v2 linters: enable-all: true linters: default: all","lintersenableformatter_name#\u003ccode\u003elinters.enable[].\u0026lt;formatter_name\u0026gt;\u003c/code\u003e":"The linters gci, gofmt, gofumpt, and goimports have been moved to the formatters section.\nv1v2 linters: enable: - gci - gofmt - gofumpt - goimports formatters: enable: - gci - gofmt - gofumpt - goimports","lintersenablestylecheckgosimplestaticcheck#\u003ccode\u003elinters.enable[].{stylecheck,gosimple,staticcheck}\u003c/code\u003e":"The linters stylecheck, gosimple, and staticcheck has been merged inside the staticcheck.\nv1v2 linters: enable: - gosimple - staticcheck - stylecheck linters: enable: - staticcheck","lintersfast#\u003ccode\u003elinters.fast\u003c/code\u003e":"This property has been removed.\nThere are 2 new options (they are not strictly equivalent to the previous option):\nlinters.default: fast: set all “fast” linters as the default set of linters. linters: default: fast --fast-only: filters all enabled linters to keep only “fast” linters.","linterspresets#\u003ccode\u003elinters.presets\u003c/code\u003e":"This property has been removed.\nThe migrate command automatically migrates linters.presets in individual linters to linters.enable.\nv1v2 Presets:\nname linters bugs asasalint, asciicheck, bidichk, bodyclose, contextcheck, durationcheck, errcheck, errchkjson, errorlint, exhaustive, gocheckcompilerdirectives, gochecksumtype, gosec, gosmopolitan, govet, loggercheck, makezero, musttag, nilerr, nilnesserr, noctx, protogetter, reassign, recvcheck, rowserrcheck, spancheck, sqlclosecheck, staticcheck, testifylint, zerologlint comment dupword, godot, godox, misspell complexity cyclop, funlen, gocognit, gocyclo, maintidx, nestif error err113, errcheck, errorlint, wrapcheck format gci, gofmt, gofumpt, goimports import depguard, gci, goimports, gomodguard metalinter gocritic, govet, revive, staticcheck module depguard, gomoddirectives, gomodguard performance bodyclose, fatcontext, noctx, perfsprint, prealloc sql rowserrcheck, sqlclosecheck style asciicheck, canonicalheader, containedctx, copyloopvar, decorder, depguard, dogsled, dupl, err113, errname, exhaustruct, exptostd, forbidigo, forcetypeassert, ginkgolinter, gochecknoglobals, gochecknoinits, goconst, gocritic, godot, godox, goheader, gomoddirectives, gomodguard, goprintffuncname, gosimple, grouper, iface, importas, inamedparam, interfacebloat, intrange, ireturn, lll, loggercheck, makezero, mirror, misspell, mnd, musttag, nakedret, nilnil, nlreturn, nolintlint, nonamedreturns, nosprintfhostport, paralleltest, predeclared, promlinter, revive, sloglint, stylecheck, tagalign, tagliatelle, testpackage, tparallel, unconvert, usestdlibvars, varnamelen, wastedassign, whitespace, wrapcheck, wsl test exhaustruct, paralleltest, testableexamples, testifylint, testpackage, thelper, tparallel, usetesting unused ineffassign, unparam, unused # Removed","output#\u003ccode\u003eoutput\u003c/code\u003e":"","outputformat#\u003ccode\u003eoutput.format\u003c/code\u003e":"This property has been deprecated since v1.57.0 and has been replaced with output.formats.\nv1v2 output: format: 'checkstyle:report.xml,json:stdout,colored-line-number' output: formats: checkstyle: path: 'report.xml' json: path: stdout text: path: stdout color: true","outputformatsformat-colored-line-number#\u003ccode\u003eoutput.formats[].format: colored-line-number\u003c/code\u003e":"This format has been replaced by the format text with the option colors (true by default).\nv1v2 output: formats: - format: colored-line-number output: formats: text: path: stdout colors: true","outputformatsformat-colored-tab#\u003ccode\u003eoutput.formats[].format: colored-tab\u003c/code\u003e":"This format has been replaced by the format tab with the option colors (true by default).\nv1v2 output: formats: - format: colored-tab output: formats: tab: path: stdout colors: true","outputformatsformat-line-number#\u003ccode\u003eoutput.formats[].format: line-number\u003c/code\u003e":"This format has been replaced by the format text.\nv1v2 output: formats: - format: line-number output: formats: text: path: stdout","outputformatsformat-name#\u003ccode\u003eoutput.formats[].format: \u0026lt;name\u0026gt;\u003c/code\u003e":"The property output.formats[].format has been replaced with output.formats[]..\nv1v2 output: formats: - format: json path: stderr - format: checkstyle path: report.xml output: formats: json: path: stderr checkstyle: path: report.xml","outputprint-issued-lines#\u003ccode\u003eoutput.print-issued-lines\u003c/code\u003e":"This property has been removed.\nTo not print the lines with issues, use the text format with the option print-issued-lines: false.\nv1v2 output: formats: - format: line-number path: stdout print-issued-lines: false output: formats: text: path: stdout print-issued-lines: false","outputprint-linter-name#\u003ccode\u003eoutput.print-linter-name\u003c/code\u003e":"This property has been removed.\nTo not print the linter name, use the text format with the option print-linter-name: false.\nv1v2 output: formats: - format: line-number path: stdout print-linter-name: false output: formats: text: path: stdout print-linter-name: false","outputshow-stats#\u003ccode\u003eoutput.show-stats\u003c/code\u003e":"This property is true by default.","outputsort-order#\u003ccode\u003eoutput.sort-order\u003c/code\u003e":"This property has a new default value ['linter', 'file'] instead of ['file'].","outputsort-results#\u003ccode\u003eoutput.sort-results\u003c/code\u003e":"The property has been removed.\nThe output results are always sorted.","outputuniq-by-line#\u003ccode\u003eoutput.uniq-by-line\u003c/code\u003e":"This property has been deprecated since v1.63.0 and has been replaced by issues.uniq-by-line.\nv1v2 output: uniq-by-line: true issues: uniq-by-line: true","run#\u003ccode\u003erun\u003c/code\u003e":"","runconcurrency#\u003ccode\u003erun.concurrency\u003c/code\u003e":"This property value set to match Linux container CPU quota by default and fallback on the number of logical CPUs in the machine.","rungo#\u003ccode\u003erun.go\u003c/code\u003e":"The new fallback value for this property is 1.22 instead of 1.17.","runrelative-path-mode#\u003ccode\u003erun.relative-path-mode\u003c/code\u003e":"This property has a new default value of cfg instead of wd.\nv1v2 run: # When not specified, relative-path-mode is set to 'wd' by default run: relative-path-mode: 'cfg'","runshow-stats#\u003ccode\u003erun.show-stats\u003c/code\u003e":"This property has been deprecated since v1.57.0 and has been replaced by output.show-stats.\nv1v2 run: show-stats: true output: show-stats: true","runskip-dirs#\u003ccode\u003erun.skip-dirs\u003c/code\u003e":"This property has been deprecated since v1.57.0 and has been removed.\nUse linters.exclusions.paths and formatters.exclusions.paths to exclude directories.\nv1v2 run: skip-dirs: - src/external_libs - autogenerated_by_my_lib linters: exclusions: paths: - src/external_libs - autogenerated_by_my_lib","runskip-dirs-use-default#\u003ccode\u003erun.skip-dirs-use-default\u003c/code\u003e":"This property has been deprecated since v1.57.0 and has been replaced by issues.exclude-dirs-use-default.\nv1v2 run: skip-dirs-use-default: false issues: exclude-dirs-use-default: false","runskip-files#\u003ccode\u003erun.skip-files\u003c/code\u003e":"This property has been deprecated since v1.57.0 and has been removed.\nUse linters.exclusions.paths and formatters.exclusions.paths to exclude files.\nv1v2 run: skip-files: - '.*\\.my\\.go$' - lib/bad.go linters: exclusions: paths: - '.*\\.my\\.go$' - lib/bad.go","runtimeout#\u003ccode\u003erun.timeout\u003c/code\u003e":"This property value is disabled by default (0).","severity#\u003ccode\u003eseverity\u003c/code\u003e":"","severitydefault-severity#\u003ccode\u003eseverity.default-severity\u003c/code\u003e":"This property has been replaced with severity.default.\nv1v2 severity: default-severity: error severity: default: error","severityrulescase-sensitive#\u003ccode\u003eseverity.rules.case-sensitive\u003c/code\u003e":"severity.rules.text and severity.rules.source are case-sensitive by default.\nTo ignore case, use (?i) at the beginning of a regex syntax.\nv1v2 severity: case-sensitive: true rules: - severity: info linters: - foo text: 'Example.*' severity: rules: - severity: info linters: - foo text: '(?i)Example.*'","typecheck#\u003ccode\u003etypecheck\u003c/code\u003e":"This typecheck is not a linter, so it cannot be enabled or disabled:\nFAQ: Why do you have typecheck errors? FAQ: Why is it not possible to skip/ignore typecheck errors?","version#\u003ccode\u003eversion\u003c/code\u003e":"The version property has been added to the configuration file.\nversion: \"2\"","visual-studio-code#Visual Studio Code":"v1v2 \"go.lintTool\": \"golangci-lint\", \"go.lintFlags\": [ \"--fast\" ] \"go.lintTool\": \"golangci-lint\", \"go.lintFlags\": [ \"--fast-only\" ], \"go.formatTool\": \"custom\", \"go.alternateTools\": { \"customFormatter\": \"golangci-lint\" }, \"go.formatFlags\": [ \"fmt\", \"--stdin\" ]"},"title":"Migration guide"},"/docs/product/roadmap/":{"data":{"":"","-bugs#🐛 Bugs":"Please file an issue for bugs, missing documentation or unexpected behavior.\nSee Bugs","-feature-requests#💡 Feature Requests":"Please file an issue to suggest new features. Vote on feature requests by adding a 👍. This helps maintainers prioritize what to work on.\nSee Feature Requests","future-plans#Future Plans":"Upstream all changes of forked linters. Make it easy to write own linter/checker: it should take a minimum code, have perfect documentation, debugging and testing tooling. Speed up SSA loading: on-disk cache and existing code profiling-optimizing. Analyze (don’t only filter) only new code: analyze only changed files and dependencies, make incremental analysis, caches. Smart new issues detector: don’t print existing issues on changed lines. Minimize false-positives by fixing linters and improving testing tooling. Documentation for every issue type.","linter-deprecation-cycle#Linter Deprecation Cycle":"A linter can be deprecated for various reasons, e.g. the linter stops working with a newer version of Go or the author has abandoned its linter.\nThe deprecation of a linter will follow 3 phases:\nDisplay of a warning message: The linter can still be used (unless it’s completely non-functional), but it’s recommended to remove it from your configuration. Display of an error message: At this point, you should remove the linter. The original implementation is replaced by a placeholder that does nothing. The linter is NOT enabled when using default: all and should be removed from the disable option. Removal of the linter from golangci-lint. Each phase corresponds to a minor version:\nv1.0.0 -\u003e warning message v1.1.0 -\u003e error message v1.2.0 -\u003e linter removed We will provide clear information about those changes on different supports: changelog, logs, social network, etc.\nWe consider the removal of a linter as non-breaking changes for golangci-lint itself. No major version will be created when a linter is removed.","versioning-policy#Versioning Policy":"golangci-lint follows semantic versioning. However, due to the nature of golangci-lint as a code quality tool, it’s not always clear when a minor or major version bump occurs. To help clarify this for everyone, we’ve defined the following semantic versioning policy:\nPatch release (intended to not break your lint build) A patch version update in a specific linter that results in golangci-lint reporting fewer errors. A bug fix to the CLI or core (packages loading, runner, postprocessors, etc). Improvements to documentation. Non-user-facing changes such as refactoring code, adding, deleting, or modifying tests, and increasing test coverage. Re-releasing after a failed release (i.e., publishing a release that doesn’t work for anyone). Minor release (might break your lint build because of newly found issues) A major or minor version update of a specific linter that results in golangci-lint reporting more errors. A new linter is added. An existing configuration option or linter is deprecated. A new CLI command is created. Backward incompatible change of configuration. Major release (likely to break your lint build) Backward incompatible change of configuration with huge impact. According to our policy, any minor update may report more errors than the previous release (ex: from a bug fix). As such, we recommend using the fixed minor version and fixed or the latest patch version to guarantee the results of your builds.\nFor example, in our GitHub Action we require users to explicitly set the minor version of golangci-lint and we always use the latest patch version."},"title":"Roadmap"},"/docs/product/thanks/":{"data":{"":"","heading#❤️":"","special-thanks#Special thanks":"Thanks to alecthomas/gometalinter for inspiration and amazing work.\nThanks to bradleyfalzon/revgrep for cool diff tool.\nThe golangci-lint logo is inspired by the Go gopher designed by Renee French CC BY 3.0.","thanks-to-all-contributors#Thanks to all contributors":"","thanks-to-developers-and-authors-of-used-linters#Thanks to developers and authors of used linters":"4meepotagalign Abirdcflydupword AdminBenniiotamixing alecthomasgochecksumtype alexkohlerdogsled\nnakedret\nprealloc alingseasasalint\nnilnesserr AlwxSinnoinlineerr Antonboomerrname\nnilnil\ntestifylint ashanbrownforbidigo\nmakezero babakksgodoclint bkielbasacyclop blizzy78varnamelen bombsimonwsl\nwsl_v5 bosidecorder bremlbidichk\nerrchkjson butuzovireturn\nmirror catenacyberperfsprint charithedurationcheck chokoswitchreassign ckaznochaintrange client9misspell Crocmagnonarangolint\nfatcontext daixiang0gci denis-tingaikingoheader dixonwilledepguard Djarvurerr113 dominikhstaticcheck\nunused firefartnonamedreturns fzippgocyclo ghostiamprotogetter go-criticgocritic golanggofmt\ngoimports\ngovet gordonklausineffassign jgautherongoconst jingyugaorowserrcheck jjtispancheck julzimportas karamaru-alphacopyloopvar kisielkerrcheck kkHAIKEcontextcheck kultithelper kunwardeepparalleltest lasiarcanonicalheader ldezexptostd\ngomoddirectives\ntagliatelle\nusetesting leighmccullochgocheckcompilerdirectives\ngochecknoglobals leonklingelegrouper macabuinamedparam manuelarteembeddedstructfieldcheck\nfuncorder maratoritestableexamples\ntestpackage matoousgodox mdempskyunconvert mgechevrevive mibkdupl MirrexOneunqueryvet morichotparallel mvdangofumpt\nunparam nakabonnenestif nishanthsexhaustive\npredeclared nunnatsaginkgolinter polyfloyderrorlint raeperdrecvcheck ryancurrahgomodguard ryanroldssqlclosecheck sanposhihowastedassign sashamelentyevinterfacebloat\nusestdlibvars securegogosec segmentiogolines sivcharicontainedctx sonatardnoctx ssgregnlreturn stbenjamnosprintfhostport swaggoswaggo tenntennforcetypeassert\nnilerr tetafrogodot timakinbodyclose timonwongloggercheck tmzanemusttag\nsloglint tomarrellwrapcheck tommy-muehlemnd ultrawarefunlen\nwhitespace uudashrgocognit\niface xen0ngosmopolitan xobotyiexhaustruct yagipymaintidx yeya24promlinter ykadowakzerologlint"},"title":"Thanks"},"/docs/welcome/":{"data":{"":"This quickstart guide provides step-by-step instructions to help you install, configure, and begin using golangci-lint efficiently.\nLocal Installation CI Installation Integrations Quick Start: Linting Quick Start: Formatting FAQ"},"title":"Welcome"},"/docs/welcome/faq/":{"data":{"":"","golangci-lint-doesnt-work#golangci-lint doesn\u0026rsquo;t work":"Please ensure you are using the latest binary release. Run it with -v option and check the output. If it doesn’t help, create a GitHub issue with the output from the error and #2 above.","how-do-you-add-a-custom-linter#How do you add a custom linter?":"You can integrate it yourself, see this manual. Or you can create a GitHub Issue and we will integrate when time permits.","how-to-integrate-golangci-lint-into-a-large-project-with-thousands-of-issues#How to integrate golangci-lint into a large project with thousands of issues":"We are sure that every project can easily integrate golangci-lint, even the large one.\nThe idea is to not fix all existing issues. Fix only newly added issue: issues in new code.\nTo do this, set up the CI to run golangci-lint with options --new-from-merge-base=main or --new-from-rev=HEAD~1.\nAlso, take a look at option --new, but consider that CI scripts that generate unstaged files will make --new only point out issues in those files and not in the last commit. In that regard --new-from-merge-base=main or --new-from-rev=HEAD~1 are safer.\nBy doing this you won’t create new issues in your code and can choose fix existing issues (or not).","how-to-use-golangci-lint-in-ci#How to use golangci-lint in CI":"Run golangci-lint in CI and check the exit code. If it’s non-zero - fail the build.\nSee how to properly install golangci-lint in CI","which-go-versions-are-supported#Which Go versions are supported?":"The same as the Go team (the 2 latest minor versions).\nBasically, golangci-lint supports Go versions lower or equal to the Go version used to compile it.\nNew versions of Go are not automatically supported because, in addition of the Go version used to build it, some linters and/or internal pieces of golangci-lint could need to be adapted to support this new Go version.","why---new-from-xxx-dont-seem-to-be-working-in-some-cases#Why \u003ccode\u003e--new-from-xxx\u003c/code\u003e don\u0026rsquo;t seem to be working in some cases?":"The options --new-from-merge-base, --new-from-rev, and --new-from-patch work by comparing git diff output and issues.\nIf an issue is not reported as the same line as the changes then the issue will be skipped. This is the line of the issue is not inside the lines changed.\nTo fix that, you have to use the option --whole-files.\nThe side effect is the issues inside the file that contain changes but not directly related to the changes themselves will be reported.","why-do-you-have-typecheck-errors#Why do you have \u003ccode\u003etypecheck\u003c/code\u003e errors?":"typecheck is like a front-end for the Go compiler errors. Compilation errors are identified/labeled as reports of typecheck but they are not produced by a linter called typecheck.\ntypecheck is not a linter, it doesn’t perform any analysis, it’s just a way to identify, parse, and display compiling errors (produced by the types.Checker) and some linter errors.\nIt cannot be disabled because of that.\nOf course, this is just as good as the compiler itself, and a lot of compilation issues will not properly show where in the code your error lies.\nAs a consequence, the code to analyze should compile. It means that if you try to run an analysis on a single file or a group of files or a package or a group of packages, with dependencies on other files or packages of your project, as it doesn’t compile (because of the missing pieces of code), it also cannot be analyzed.\nIf there are typecheck errors, golangci-lint will not be able to produce other reports because that kind of error doesn’t allow it to perform any analysis.\nHow to troubleshoot:\nEnsure the version of golangci-lint is built with a compatible version of Go (golangci-lint version). Ensure dependencies are up to date with go mod tidy. Ensure building works with go run ./.../go build ./... - whole package. Ensure you are not running an analysis on code that depends on files/packages outside the scope of the analyzed elements. If using CGO, ensure all required system libraries are installed. If you are using private repositories/dependencies, ensure the Go proxy (GOPROXY) and checksum database (GOSUMDB) are right and/or your git configuration.","why-is-it-not-possible-to-skipignore-typecheck-errors#Why is it not possible to skip/ignore \u003ccode\u003etypecheck\u003c/code\u003e errors?":"For mainly the same reasons that you cannot compile when you have a compiler error.\ntypecheck errors are reported in the same style as linter reports/issues, but are completely different because they are related to problems that block the analysis (typecheck is not a linter).\nWhen there are typecheck errors, most linters are not able to perform the analysis, and they simply do not produce any reports, so it’s not possible to skip/ignore typecheck errors.","why-running-with---fast-only-can-be-slow-on-the-first-run#Why running with \u003ccode\u003e--fast-only\u003c/code\u003e can be slow on the first run?":"Because the first run caches type information. All subsequent runs will be faster. Usually this option is used during development on a local machine and compilation was already performed."},"title":"FAQ"},"/docs/welcome/install/":{"data":{"":"","binaries#Binaries":"# binary will be $(go env GOPATH)/bin/golangci-lint curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.5.0 golangci-lint --version On Windows, you can run the above commands with Git Bash, which comes with Git for Windows.","chocolatey#Chocolatey":"You can install a binary on Windows using chocolatey.\nchoco install golangci-lint","ci-installation#CI installation":"Most installations of golangci-lint are performed for CI.\nIt’s important to have reproducible CI: don’t start to fail all builds at the same time. With golangci-lint this can happen if you use option linters.default: all and a new linter is added or even without linters.default: all when one upstream linter is upgraded.\nImportant\nIt’s highly recommended installing a specific version of golangci-lint available on the releases page.","docker#Docker":"docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run Colored output:\ndocker run -t --rm -v $(pwd):/app -w /app golangci/golangci-lint:v2.5.0 golangci-lint run Preserving caches between consecutive runs:\ndocker run --rm -t -v $(pwd):/app -w /app \\ --user $(id -u):$(id -g) \\ -v $(go env GOCACHE):/.cache/go-build -e GOCACHE=/.cache/go-build \\ -v $(go env GOMODCACHE):/.cache/mod -e GOMODCACHE=/.cache/mod \\ -v ~/.cache/golangci-lint:/.cache/golangci-lint -e GOLANGCI_LINT_CACHE=/.cache/golangci-lint \\ golangci/golangci-lint:v2.5.0 golangci-lint run","github-actions#GitHub Actions":"We recommend using our GitHub Action for running golangci-lint in CI for GitHub projects.\nIt’s fast and uses smart caching inside, and it can be much faster than the simple binary installation.\nAlso, the action creates GitHub annotations for found issues (you don’t need to dig into build log to see found by golangci-lint issues).","gitlab-ci#GitLab CI":"GitLab provides a guide for integrating golangci-lint into the Code Quality widget. A simple quickstart is their CI component, which can be used like this:\n.gitlab-ci.ymlinclude: - component: $CI_SERVER_FQDN/components/code-quality-oss/codequality-os-scanners-integration/golangci@1.0.1 Note that you can only reference components in the same GitLab instance as your project","homebrew#Homebrew":"Note: Homebrew can use an unexpected version of Go to build the binary, so we recommend either using our binaries or ensuring the version of Go used to build.\nYou can install a binary release on macOS using brew:\nbrew install golangci-lint brew upgrade golangci-lint Note: Previously, we used a Homebrew tap. We recommend using the official formula instead of the tap, but sometimes the most recent release isn’t immediately available via Homebrew core due to manual updates that need to occur from Homebrew core maintainers. In this case, the tap formula, which is updated automatically, can be used to install the latest version of golangci-lint:\nbrew tap golangci/tap brew install golangci/tap/golangci-lint","install-from-sources#Install from Sources":"Warning\nUsing go install/go get, “tools pattern”, and tool command/directives installations aren’t guaranteed to work.\nWe recommend using binary installation.\nThese installations aren’t recommended because of the following points:\nThese installations compile golangci-lint locally. The Go version used to build will depend on your local Go version. Some users use the -u flag for go get, which upgrades our dependencies. The resulting binary was not tested and is not guaranteed to work. When using the “tools pattern” or tool command/directives, the dependencies of a tool can modify the dependencies of another tool or your project. The resulting binary was not tested and is not guaranteed to work. We’ve encountered issues with Go module hashes due to the unexpected recreation of dependency tags. go.mod replacement directives don’t apply transitively. It means a user will be using a patched version of golangci-lint if we use such replacements. It allows installation from the main branch, which can’t be considered stable. It’s slower than binary installation. go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0 go tool usage recommendations Warning\nWe don’t recommend using go tool.\nBut if you want to use go tool to install and run golangci-lint (once again we don’t recommend that), the best approach is to use a dedicated module or module file to isolate golangci-lint from other tools or dependencies.\nThis approach avoids modifying your project dependencies and the golangci-lint dependencies.\nCaution\nYou should never update golangci-lint dependencies manually.\nMethod 1: dedicated module file\n# Create a dedicated module file go mod init -modfile=golangci-lint.mod /golangci-lint # Example: go mod init -modfile=golangci-lint.mod github.com/org/repo/golangci-lint # Add golangci-lint as a tool go get -tool -modfile=golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0 # Run golangci-lint as a tool go tool -modfile=golangci-lint.mod golangci-lint run # Update golangci-lint go get -tool -modfile=golangci-lint.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest Method 2: dedicated module\n# Create a dedicated directory mkdir golangci-lint # Create a dedicated module file go mod init -modfile=tools/go.mod /golangci-lint # Example: go mod init -modfile=golangci-lint/go.mod github.com/org/repo/golangci-lint # Setup a Go workspace go work init . golangci-lint # Add golangci-lint as a tool go get -tool -modfile=golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint # Run golangci-lint as a tool go tool golangci-lint run # Update golangci-lint go get -tool -modfile=golangci-lint/go.mod github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest","linux#Linux":"Golangci-lint is available inside the majority of the package managers.","local-installation#Local Installation":"","macos#macOS":"","macports#MacPorts":"It can also be installed through MacPorts The MacPorts installation mode is community-driven and not officially maintained by the golangci team.\nsudo port install golangci-lint","other-ci#Other CI":"Here is the other way to install golangci-lint:\n# binary will be $(go env GOPATH)/bin/golangci-lint curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.5.0 # or install it into ./bin/ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s v2.5.0 # In Alpine Linux (as it does not come with curl by default) wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s v2.5.0 golangci-lint --version It is advised that you periodically update the version of golangci-lint as the project is under active development and is constantly being improved. For any problems with golangci-lint, check out recent GitHub issues and update if needed.","scoop#Scoop":"You can install a binary on Windows using scoop.\nscoop install main/golangci-lint The scoop package is not officially maintained by golangci team.","windows#Windows":""},"title":"Install"},"/docs/welcome/integrations/":{"data":{"":"","ci-integration#CI Integration":"Check out our documentation for CI integrations.","editor-integration#Editor Integration":"","gnu-emacs#GNU Emacs":"There are available plugins:\nSpacemacs Flycheck checker","goland#GoLand":"Starting from version 2025.1, GoLand has built-in support of golangci-lint. For IntelliJ IDEA with the Go plugin, please install the plugin.\nBoth v1 and v2 versions are supported.","lsp-server#LSP Server":"golangci-lint-langserver (NeoVim, Vim, Emacs, …)","shell-completion#Shell Completion":"Golangci-lint can generate Bash, fish, PowerShell, and Zsh completion files.\nSee the instructions on golangci-lint completion --help (replace with your favorite one).\nBash \u0026 macOS There are two versions of bash-completion, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+.\nThe golangci-lint completion script doesn’t work correctly with bash-completion v1 and Bash 3.2. It requires bash-completion v2 and Bash 4.1+.\nThus, to be able to correctly use golangci-lint completion on macOS, you have to install and use Bash 4.1+ (instructions).\nThe following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).\nInstall bash-completion v2:\nbrew install bash-completion@2 echo 'export BASH_COMPLETION_COMPAT_DIR=\"/usr/local/etc/bash_completion.d\"' \u003e\u003e~/.bashrc echo '[[ -r \"/usr/local/etc/profile.d/bash_completion.sh\" ]] \u0026\u0026 . \"/usr/local/etc/profile.d/bash_completion.sh\"' \u003e\u003e~/.bashrc exec bash # reload and replace (if it was updated) shell type _init_completion \u0026\u0026 echo \"completion is OK\" # verify that bash-completion v2 is correctly installed Add golangci-lint bash completion:\necho 'source \u003c(golangci-lint completion bash)' \u003e\u003e~/.bashrc source ~/.bashrc","sublime-text#Sublime Text":"There is a plugin for SublimeLinter.","vim#Vim":"The following plugins support golangci-lint:\nvim-go ALE","visual-studio-code#Visual Studio Code":"Install the extension.\nRecommended settings for those who installed golangci-lint manually \"go.lintTool\": \"golangci-lint\", \"go.lintFlags\": [ \"--path-mode=abs\", \"--fast-only\" ], \"go.formatTool\": \"custom\", \"go.alternateTools\": { \"customFormatter\": \"golangci-lint\" }, \"go.formatFlags\": [ \"fmt\", \"--stdin\" ] Using it in an editor without --fast-only can freeze your editor. Golangci-lint automatically discovers the .golangci.yml config for the edited file, so you don’t need to configure it in VS Code settings.\nRecommended settings for those who installed golangci-lint via extension Install golangci-lint-v2 via the Go: Install/Update Tools command after setting these configs. This will enable golangci-lint v1 to co-exist with v2. And use the following settings:\n\"go.lintTool\": \"golangci-lint-v2\", \"go.lintFlags\": [ \"--path-mode=abs\", \"--fast-only\" ], \"go.formatTool\": \"custom\", \"go.alternateTools\": { \"customFormatter\": \"golangci-lint-v2\" }, \"go.formatFlags\": [ \"fmt\", \"--stdin\" ] Using it in an editor without --fast-only can freeze your editor. Golangci-lint automatically discovers the .golangci.yml config for the edited file, so you don’t need to configure it in VS Code settings."},"title":"Integrations"},"/docs/welcome/quick-start/":{"data":{"":"","formatting#Formatting":"To format your code:\ngolangci-lint fmt You can choose which directories or files to analyze:\ngolangci-lint fmt dir1 dir2/... golangci-lint fmt file1.go More information about available formatters can be found in the formatters page.","linting#Linting":"To run golangci-lint:\ngolangci-lint run It’s an equivalent of:\ngolangci-lint run ./... You can choose which directories or files to analyze:\ngolangci-lint run dir1 dir2/... golangci-lint run file1.go Directories are NOT analyzed recursively. To analyze them recursively append /... to their path. It’s not possible to mix files and packages/directories, and files must come from the same package.\nGolangci-lint can be used with zero configuration. By default, the following linters are enabled:\n$ golangci-lint help linters Enabled by default linters: errcheck: Errcheck is a program for checking for unchecked errors in Go code. These unchecked errors can be critical bugs in some cases. govet: Vet examines Go source code and reports suspicious constructs. It is roughly the same as 'go vet' and uses its passes. [auto-fix] ineffassign: Detects when assignments to existing variables are not used. [fast] staticcheck: It's the set of rules from staticcheck. [auto-fix] unused: Checks Go code for unused constants, variables, functions and types. Pass -E/--enable to enable linter and -D/--disable to disable:\ngolangci-lint run --default=none -E errcheck More information about available linters can be found in the linters page."},"title":"Quick Start"}} \ No newline at end of file diff --git a/en.search.min.097e3a24da0aba2ac82ef0f53e82e1500343a7126260a0203f3a45bbe0876093.js b/en.search.min.097e3a24da0aba2ac82ef0f53e82e1500343a7126260a0203f3a45bbe0876093.js new file mode 100644 index 000000000000..e91cefdb3f7e --- /dev/null +++ b/en.search.min.097e3a24da0aba2ac82ef0f53e82e1500343a7126260a0203f3a45bbe0876093.js @@ -0,0 +1,8 @@ +document.addEventListener("DOMContentLoaded",function(){if(/iPad|iPhone|Macintosh/.test(navigator.userAgent)){const e=document.querySelectorAll(".hextra-search-wrapper kbd");e.forEach(e=>{e.innerHTML='K'})}}),function(){const h="/en.search-data.json",u=document.querySelectorAll(".hextra-search-input");for(const e of u)e.addEventListener("focus",o),e.addEventListener("keyup",p),e.addEventListener("keydown",n),e.addEventListener("input",m);const d=document.querySelectorAll(".hextra-search-wrapper kbd");function a(e){d.forEach(t=>{t.style.opacity=e})}function m(e){const t=e.target.value.length>0?0:100;a(t)}function e(){const e=Array.from(document.querySelectorAll(".hextra-search-wrapper")).filter(e=>e.clientHeight>0);return e.length===1?{wrapper:e[0],inputElement:e[0].querySelector(".hextra-search-input"),resultsElement:e[0].querySelector(".hextra-search-results")}:0[0]}const l=["input","select","button","textarea"];document.addEventListener("keydown",function(t){const{inputElement:n}=e();if(!n)return;const s=document.activeElement,o=s&&s.tagName;if(n===s||!o||l.includes(o)||s&&s.isContentEditable)return;t.key==="/"||t.key==="k"&&(t.metaKey||t.ctrlKey)?(t.preventDefault(),n.focus()):t.key==="Escape"&&n.value&&n.blur()}),document.addEventListener("mousedown",function(n){const{inputElement:o,resultsElement:s}=e();if(!o||!s)return;n.target!==o&&n.target!==s&&!s.contains(n.target)&&(a(100),t())});function r(){const{resultsElement:n}=e();if(!n)return{result:0[0],index:-1};const t=n.querySelector(".hextra-search-active");if(!t)return{result:0[0],index:-1};const s=parseInt(t.dataset.index,10);return{result:t,index:s}}function s(t){const{resultsElement:s}=e();if(!s)return;const{result:o}=r();o&&o.classList.remove("hextra-search-active");const n=s.querySelector(`[data-index="${t}"]`);n&&(n.classList.add("hextra-search-active"),n.focus())}function c(){const{resultsElement:t}=e();return t?t.dataset.count:0}function i(){const{inputElement:n}=e();if(!n)return;t(),n.value="",n.blur()}function t(){const{resultsElement:t}=e();if(!t)return;t.classList.add("hx:hidden")}function n(n){const{inputElement:o}=e();if(!o)return;const d=c(),{result:l,index:a}=r();switch(n.key){case"ArrowUp":n.preventDefault(),a>0&&s(a-1);break;case"ArrowDown":n.preventDefault(),a+1(""+e).toLowerCase().match(o)??[];window.pageIndex=new FlexSearch.Document({tokenize:n,encode:s,cache:100,document:{id:"id",store:["title","crumb"],index:"content"}}),window.sectionIndex=new FlexSearch.Document({tokenize:n,encode:s,cache:100,document:{id:"id",store:["title","content","url","display","crumb"],index:"content",tag:[{field:"pageId"}]}});const i=await fetch(h),e=await i.json();let t=0;for(const n in e){let a="";++t;const i=n.split("/").filter(e=>e!=""&&!e.startsWith("#"));let s="",o="/";for(let t=0;te).join(" ")),s+=a,t ")}for(const c in e[n].data){const[l,u]=c.split("#"),o=n.trimEnd("/")+(l?"#"+l:""),i=u||e[n].title,d=e[n].data[c]||"",r=d.split(` +`).filter(Boolean);sectionIndex.add({id:o,url:o,title:i,crumb:s,pageId:`page_${t}`,content:i,...r[0]&&{display:r[0]}});for(let e=0;ee._page_rk===t._page_rk?e._section_rk-t._section_rk:s[e._page_rk]!==s[t._page_rk]?s[t._page_rk]-s[e._page_rk]:e._page_rk-t._page_rk).map(e=>({id:`${e._page_rk}_${e._section_rk}`,route:e.route,prefix:e.prefix,children:e.children}));g(c,i)}function g(t,s){const{resultsElement:o}=e();if(!o)return;if(!t.length){o.innerHTML=`No results found.`;return}function r(e,t){const n=t.replace(/[-\\^$*+?.()|[\]{}]/g,"\\$&"),s=new RegExp(n,"gi");return e.replace(s,e=>`${e}`)}function c(e){const t=document.createElement("div");return t.innerHTML=e.trim(),t.firstChild}function l(e){const t=e.target.closest("a");if(t){const e=o.querySelector("a.hextra-search-active");e&&e.classList.remove("hextra-search-active"),t.classList.add("hextra-search-active")}}const a=document.createDocumentFragment();for(let o=0;o${e.prefix}`));let d=c(` +
  • + +
    `+r(e.children.title,s)+`
    `+(e.children.content?`
    `+r(e.children.content,s)+`
    `:"")+` +
    +
  • `);d.addEventListener("mousemove",l),d.addEventListener("keydown",n),d.querySelector("a").addEventListener("click",i),a.appendChild(d)}o.appendChild(a),o.dataset.count=t.length}}() \ No newline at end of file diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b2437f4b13405da915ecd1c57d14c76a6876b97d GIT binary patch literal 691 zcmV;k0!;mhP)h$g_u+@ zCa$VPR~k3EGD>JDB_!&~sI_*kB55tycJ6ej0)36tLZhv1fzlSDVgWbB&)k8Q@~9{I zZYG)g{c_Hib2)BP@kBbv6Kdi`8s$ZKaaA-b5V=dRdk=86s=?vdB@k*62wf3~j2bHO zL^e0RitgNE=0(}_AL9n`M0Rh02t@9!{1hb|A`skL|u*5pJszhLr#?btJxF(=giQw>n7G$aJjohg1g3dbl z>|P?TUAP|pre$!&7uvo9MO|y3nkt*f)^eZd3EqySaYIeOActVitp``FOT(X8ctc!Y zV8@2{z#vE8QKcgk-`2>)0&Vh)xwn|Bt3~~)H%?}Q_cK5Lm~zFxOzhh@nGLi?(kC|? Z{sC9Dc{26sblm^|002ovPDHLkV1oA5MIrzI literal 0 HcmV?d00001 diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d19d5d2e221d30d25d5e36159604107d93c55982 GIT binary patch literal 1561 zcmV+!2Il#RP)F7h zsn%XuY5bBmIXT}s-}Ah;=X-g)5Z7E~?VEg>6;L#r&X=bs}#*%q-b_JRA7H2 z(P5LLZfobv&TENo8DGj8!Uy&vQZuiBnI9T>p>BmMzb^~?Sz4rQKfj2L4Z(BfrGtBt zh!ATd1A<50*3O}%Ov{XiNVHfiRNy_K468&+tjpJ6oum|N^Ho@xqd<&Mj`|BzrB zNPYPcph&^_{!pNEnM8~Cg)(fD>u|<0h_um%_#=Q_9=waAwI-~|mSaJ#8qt|DEXkCE zq8Zn*rC*8qeO%CImJjFxQmp2C(d;a;`+#>7x1NiCr&k(akkNn z1j_(N@DrI9$7&5Y-!p<0!Xn>DOnRk)FJ*3dey}LJ1m87vBEF;&8$}9S8NQFidIKtY zZRm5}MUJTp38p>{Jh|77Y-1OmJbenXOpbA!YqD^AoAQ*{kX3|Zb!Jc^m2VW%IB=K3 zd5cW6P=O154#WuyIS+_u&PR{%@bNUBuS`P+es@eEso8>d#~6(EQTJY1uZ@e=MVk{l z3d^ytv<_5WnU7ep4>-l-E26kX~*@E2i(8g=)uzyxUaA1?xLXB2VX5s#lAkk~g00n@};ysi;DRaN+cZNz6v z21jINI8my{ew7}{*0F#Dh<-#1-WU%1p zmac%{#I6kA!?Iumq+AMK6rnGH)IldcE!IJxZSW&NqI9W$0>9bDgMxD{Y@bAoP!_xh zDKbX+5J(-Ez@hRwY{^q%yF`t+Y#BbvpdrvTx(Un#>S;ul-^~a@fM);Xkr^&f1PF=E z`6`?++ptH$VBfPS%$5ML<^FeptJP`!9$ti4`#O_J&^?4r;u4O)E}0g)G}U28;A4>-hxN@^oL}LY z{~KPD5E&rdH841VZ)y$LtJLE_*&S@9%Mh0%51YUWkrE3%E+f+Ve2IRk*GxdB*FbGZ zgeXuO&W6D1TyG`hOWE@QN3!|3s@C1=>KS!_)J1}a)`wyr=6T(Q)$b^kuLPV6BgEQB zzPNO7eZHFOUrz$03pR_DNa`D%6}XGQvtfj02ItDF7tS~t^NZNn2#IcBwXld28bV-q zSsk{~8cy?P3r=iRu7Xs(jW5-GzzbzXirENCsBG9RtH8mEdhFMDr)9RbJge9ibQ}-1 zNKI_hHk6(27zi7f3?)Yl*6P^I%-49~uJ{^D>~YJG@k)^UK9G@bf9M=GA84{|2pias zNSmEHY_wiJ-eEVLv5rrs4BdM|JS0Y*$-D0@!=}&Mtf}PNP!IkOC%vR8WdK(J00000 LNkvXXu0mjf3%2D2 literal 0 HcmV?d00001 diff --git a/favicon-dark.svg b/favicon-dark.svg new file mode 100644 index 000000000000..153e7fff73d9 --- /dev/null +++ b/favicon-dark.svg @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd48ab323592220b9b463b1cce44f72a17690898 GIT binary patch literal 372526 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/favicons.zip b/favicons.zip new file mode 100644 index 0000000000000000000000000000000000000000..fda4f50159f4396b13ff78c3a794fd883e244824 GIT binary patch literal 168123 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%0D5Q4oS!p zPZ*djiZmWa|EK5Xd}}NIektbCL}(|*Hjv8Snsl)Cn9#@(?)D0iO&7;DA)g%hjo-8f z6%R$|1S<%olTh5;r%z8)5mJbiJ>NI}2UfRn_Ku*NnHd~Z zoDd_lY+_&)MK!`I9IeAl&oHGf%8^iE`9L-pc2k_zP>094BKi!+_Fs1VR4o}-f{78Z z(9k37Ip+g}FfzJ7D4`;kP%6ART#IM~Vr@D)BVfI~LzBpLZP|FI&C$r3XH+V2ny9Nh ziN^#&4}rG2b*2Zbdv*V`L{HN4>lY)%dBl7k+79hbkBMZ}>mJS!h5}VrP%G(?hA7fT zp2m2R*LWD^RI&ooqD1a$n$V~AvH;XYm=x=`{6PCiGa#4*64OkUzBZzJg7_7Z*g z_71s9O6q(y1fuq&XT@A5;;~KNRkyCFX!+)qq@S>oB%rJ%N<;;1Gz=6Z@r8&*LGxN= zz@u8+dIoN#YCZWyo6UK}5xadQ2IOhB4gQ3_2X)J^L&dr;P9rez`arKH^ zRR#Hpv)}>{VngC<`>$@3zg;~BYk*goK|KsiE74F@0L|+|eO#US0K*H(o?m``fG&LI zun)}Cf&DG1zQ3M+G3FGP6kuN0?x7kp-%}^U_aA0lbpX?02q1T9pktup9(<4OId*4> zU3huGw;;=m_CYqeuX~llwtM4-nkfR9?FXvZ`xTzdJor7#H6$;&ib0$}?de7VFr^f< zDL#RA0uYn3!iCT0lcjFF+Uy*5}157ZES?c5;s;Q2gp6y-Kpg1qiV%cyz$SAA3b|p1lI-sw?=lg~{B4rm?i-)A6+^zS# zS{5UuQaWLxQ-i5~tKkFE{&n&aPoXne%CjhxOaZKbeVc%Ir6^&9pdz?Js*Yxnw6D~+ zf&dtDo@Fi)0VFX6Sa=l>c18TrA~$u4-XHGSe)77uJX%zzHY4|W$`5#)uhaHjashE% zYt?bdr8D~?e42jp!4;xQsyL+&()VfiC5&I_oueADXKy3QErQy5mAD_B`4&G$o~duW zb?|rB^xU2_ubLpwFu+ct zbsZoktvU-37;E{>@2qp#$Sy+~Frul-4>}i~w15p=+nl^du5XKDInL9ew5Qe+Tr4T! za|Py8Z$N$3^b(F3p1Eo*WxCQm43B`{y;R>qE-rng-pWemw1qW7%w?{c`&!PHM@zNW zKR;i2mFG+RN>7QMuU#MA47mukdzg!s*=`>375FNqlLp!ylYjqZk(P#}DhE1u>B7p_ zZ^Og-yTDX_%li$O|89;1yhUGuXNI|Zm0?v;1v=RCh}vec3Oas zHb0>cfGt%IzFx-y9;N^#V}ZDjeid=agb9|ER)%n9W_#A{7|tm+@BrQF(OHiYi1)`$ zqi>pKU9ni&uWRsJQDSzd@_aJLkH-t7E$tdZ1juD1wy_RmX^GA!@2ah8VvdcMr6ldW zK6|op!qO5r#SKfU7)|@pk&;6F`mLYN)4vqPSHF4d0$@=8FOd?z?o_Xz{O6<;ZtZq5 zpb7`yX@-_ABuEg=(|z0@I}~JOhcgosZPCkF1s6jL5Ne%*+E&|fHN4YZ%+r|d<~+nQmnvDP(UvYV+5V+xaMzqkbQd4jV%K(I(pLC z@!i0#cWp)>PLoW%qqfoqjZ>_At9%_pwz*qy6%C~0SJG_KKrPL@P(^xyMH!b+>}s;W zpO9cd4Befq&%Z}pG!J)` z+%2^?UXW)bu8wzmm-Hn9Mt4q)%f%h;Dl!tI5d{I=rO48Vf!6TvU-BTL$1-+PJ%WWz z&hLF1y|T-QfgiXj$O2zM&ALRp2;i&764qjMfN3S{#r&$HEPB_r0oj+@yAUOg*OhzF z)hW0612BzlL{-%nu3Scn{NC?7a0C#VXzY=LhcdDhq1kY}6Y{4H_;V!UHbHz&9iXJR z0XxfNfbfgUw#p0<*MxMVjs1le=0CP4yk`8x9K(p6DGMLd;l-;TmIpB5j1Z{Z9nYFTQ#}V+@wPo&QPP22rKMd}((8+JysHIE zxCX0=xjki4VTm#A*d|{~rmP$@98d4hi_?JKVHwA6kg4|Hse`VDR8XFjjhMgA=# z{Z_g1HM75zIMT@$FTPkX06T6RLCgn?Opi;5bj24Gc zxfLz{&oSKXctvVdG+SWo(?Xu6S9010mH`zbXOM!IWl`cDKV+Ah%=kgJ!xU50)72EK z7S1U(OGn`(M&M|veXu1~U04#@;9KFaeP+PAf8W@lM@yGZ8HHiVX2NU*w1@N#XqNXS zXb{iwd&d$k!c_$~?X{NaeQ6C4O|PK?C>O(PndXkJozh`8@r>|Ub@E1D!g_kjL?%!T zt{O}Re5bZ`QbxS?G(Ik^=||NITyivGsfYP)yus0Ame_|Cy7muaaBB_>+HEiNOg4%T zpk)MtH96f}kwQp?eafgZV4Z{aKWA&h7ZGep&d{75wvL zeOB^F=#+_cLv^he%{;IsM7V}hbL{$&26Q=>?crld=}1@$=hlpA2k3CKHBQtr09W%) zH&CqejzNCWP^Qf@$trn*+%odxfl7s*=9#dF4+%fD8lqMi^s3?fgw?WSy!uVmOaonD z`O#!iQwsL28yw`rZ|EEZLp!LETq_WGyw^mo#((B#;;1d-I4`Vv*El|3yUCxu_}e_>0=gc-FFE8=jHKgk>}H%FyFsaiO-nIiP0pTimQ$``28+<1 z`_$0mt*53R4d0lbkyq7YH^z@z@Dn+%BfUAkG@K|8GgdipZ`?v@+6PITI0pTS`j>G` z$WQ)c=TUP}%b8H|Ep+*W3ucCbfp1$GU)!-WjZit@;Jxwpi0eP(+~^Ox%l`L-tAn7j zi`u{7@|(l1OXU1%9fK|H6R(Sjy!wBy)ylK3S{Dp;4%KgayKCpnbV}2NdTQTKdtW1~ z>t-yq)Mqn0KbkL5U}iCy1a-CI(%UD`CR@8_zIMmFv>#85evJ0+S$ZNF#O(B6`hV3q z_~*5Bop63x~ z;4$%Y?8N^9k0+A*ZT}lQLVy7P2rv-z5F!WwkO2N0JgQ@y-0!#=czap1LRfXMc*)35 z$-SRVr)FTM@S~glmb)DHiHZ`8YcLWK7EbI5E|%7qKqOI+FoLd+!E7MY#8}jpkzaff z>UBiuoMd7+Kc6A)F}#zbv1>1>el1c6&!*DtSfSMC8)Moru#Wp_lj? zBv$c=tPjAsuu)4(@rVcx$FK%nJHFX^I>x*=J)JvBSo8Nx%2oKH?bO^~{!0uVI!e3A zrRklCa)D)@K=4v=U=JLK@&&ByL(<}`9J~JDnJsfi?;vgcZNt=hgJh7p@1?SR460A` zW3WGh@`470`KbHk@tcV%3pkTFsJr+MhWR{NMX}F;;c)c;mpH>fg z#=`tM0e9mg&j@!@U=tF2Nq4Xf)gC&Vv@`5@6F5G;NZ+}SY>+s>qas-Sd`!=n1=*g3 zT?(%2y6GVzp_LajIST0_q5N0utNAz1T~O|XTSd3;NV8`bm>e>6qKSAYQ7QYTprJrF zz8(A;3nQIJ!Bl>uqL?_jxGmgjEJAnWdL+d!{5!DLu)di~O(WRN;7-An3#;T`E{(aj zrPj_lFqv|=t|t@yupyTuPt))FW-gET7?d^p@)QI`oa6zeCep6BSKK=OufN)fTvx%j zP6<%+TUj|w^W`|+ftHkfF|#hg?3lKdXEKK=U;Q(revd`Vk}Fo9)}6r(olF#X+YzqO zwj^me97$y(@V=4ACOMGYGdrd4GjpefH^LjFrdRg134}tmKL^v2U(cjn9z%L%{Ek^4 z{CpyB$D)15>0Yae>0(mHIuz;-jV8tOpkfwzj*z+; zyZEY@L*8BNtQC@lezdb_K!Gwz7*qjeuYl)4))rI$D3C+#fdFtVb{pbq{jC_s_k|b1 zQ)IjLzSvXyf*=yIod{^4(I1l7PCdZjVfb0E`}2o23j1Vb5A4kDIqN&-w!m-C!=wXaz*R{*&6z0N)Ira#5IQp7tTz6I5c3jK_MNAsE}J0yK%P zfD%Fi314M~>msIqH2K%qr=i(tazRtlq)^ zH_LDA-fxP}{t}FSnmyUubg9-xxhT*afqgkax z)Mmf)yPxxY=Z%{3P2x@gbGQ+v=F#J3xhFLt1ZPD2?Cx zk3ZGfMLcJ(mjAQemZP!{;WuBbuYEHjN?uPAT_h`Q{RxXKvAbtc7CFv_cC3EN9l62y z*%~mh%h017t#e~PH_oya`ENL(RNdgO*N&D0s+2`u`8~sihsv?}RuC{s?i8(YMR(GF z7Xk zM)UDXX*|78QXg0dpUT?gkeID4IIr1`QHcvG+1ODd8eSRn%@`W}QHgU>ra49INvsGD z_iS5Kdm}ZiCx%PD2-%ml>)t1nY?KZEQb;#26K20|k|=#RIz(#M=!phKVwbv=<8(Jz z55bJAx`&1AM;2sBY _A^$P#rFTJ&(`^;Ii(8=^LxqW-|Az}@(cAlp=-=cR%(o4y zqX@CPsCpIqEE^+x{+JZ*t0riv+tkpg^I5xrmex z#c6$7PF%8;(?v3}5XzZ7`w-NTdY0I~C{L9i>WKVKLU#yHiYn%vF~E65j*&ie-jHFJ z^_SPjX`j=y+%PxGw!dR+kNFi8(E1d&FSyP~O6Ts}*yyTg2VZQHhOCllM;v29I^2~OVc{P|ARdw#51t7=zu zt?KUmboX;#_p{2Gn`>U7lcd{E(wL&Sqr<_PRn^>+smY(kuo zoKU%%>AW9M)d>Aiow+H4!KyO-YZ%YGOo;y_p7JtdN`m_0(?<)Dhlkw?)y8eC*D z6yC&G#CT;eDL0*&jV@g;mq`|)s~BYyo4EMmR#N0B!3+FFd?&HcUk_xf-2H4aJ z$C4sr`y1ahWs*WX%g6ubW_*#bRD9TfOGgr}&hW*;)PR@^$GwPpH8DZ(^80+7jo=m1pc`{Icq7VG2LxDsSUgNNEx1lw_-6C6w$)yyh)D$ zr&95bZP6K=dqmqE#{o1pv+n{m1ED}fv}`|Qlnzd-vJDk8nUV_2Cr!-(l`hK@ zE{E`ywyTr1UkB&3SAj2EiB#RevdwRN#n@V6!5GQgzmI`xJxdL5z#Pk>%i)BV`?%sS znvGRaGya@JE699Cyc)ZoJkeQ!h81Uv7Q^g+XPr(?d&Y!K$Fw@1*q1KWx&<{efOWLJ zjL-O}C~PWfFickgpzC{-o&Pu{=EZ3 zeVpywtp@H#`miM{)>e-$zT$hsuVZpI==}TQre=T;hWC@Sm*XxqNI!7_*#KgE(*tUn zo&thLGM|HFxU$o&7fJ;dhl@`(+e*PUElG+6a-^FB3--By19FSG%U4t21zth=Cx=_D z6rOsQ3;91pD?w3rpSoWrxcpw1Z98YVe}mc1u||BZ3XbV?_)X6&?+~KT7(|~+x|UDP z)64iCMx3-elKPC2h4fZc^)AOq$#w8k+&&W?+QvAiN*Uf?Zc=SnM6+#%f5&I`nY9w} zS!(}nQ-r93bXR_?q_f$bA?aOj{w?2h@0w};ZoS#a%2u?+PfKwHd{nYxYv>gd{=*CC z$7CsQNVsTSm|P>PSsBHp#{N1}_KhZ34n6iV)4_ItNj5v3Wb|E5Ga_aSUfE4p(_{&9 zA4x*e?5>+XhJ1p{=~vb=gF&&41IVTx*QyocIk)x*G?qk7FN5J9~%zgt{Q z2LinZ;*GVhO;EuYG{FvtU^KLufkMKY+fC8%RndAJmVI-&9@fw(<-3J;bJF+Z+bX9= z4oYrl(brQsA9{+|nXMlVoww`=V22uJdQ|Q3!P+8XjH+mxL5+4Q6-~2i&MX%m+7JLS zSu$P8YpZ3gX6R_|k^;b1sEf9NTXBOUy>y5CS`pjJu)rviYQJNp-cC!-7nPuDmy@^d zbfG^j?mKyU_sph!8nAgZ_4}HChZu>0rl~4bGUH0i16{gM!PfMu2Eq2{cfUjbcUc-V zO@q*XQTKHd&EqPAy$s>9(Fvaa%zSs+|Ki*UVDU8SR#L=tmHHtV*#enQK-Z0OI4b0P z&AU1Kgb8m_^|F~rfMDIwpz%@G<|*(u)Rll&R7|#Q?j=MqjSYER)mv?MCWtNOrMV?* ziWJhWfKOp$9)oNB4v)D{;ma7wUmh|@n7MYmq@$-O2YS>0zE}ZuSlyWTk8AjC5Y3?O*|;XU=oY%!c#H&+?3mGGjBtAgWs|%j-)gKG|gb1KRsMg{(U^*&e-&O zSGG7o?4hXLiiNbERueX$>hT~=W<5i43dF8B%j-VQ(tPnQN`SY?o#$kn4#y=4k^P96wwnR+lr52!&1By^N=BvUxM?$!VK7%*dW2}ONkL>{+rGG+R53C`eKZ;Wcgnau`Ws0M5*wokhNaez49dg5iN~<6Od6XPW$h z0urfoJ}IVm1?J9`)>{?2Pih|GQNn3aqJkB*tUBHYxv|dwgG*}+1rbi7{emPYjr(QV zaLbg+x);k}E#!*uuwDU5{K|_S|N4FRi9yD_!`BcN2XPl`3pwvWil$(!gx_PtVP|AW zm4MTp)g%X>_{|L(7Z66nKwmPa*^mV4N@$$nvuYy=GGZzT28O)|h^L4H@i(miBi>4S z&$-;w5<1X0(92Hp zH=y@xQ%>_Yal&0%{jDH5XJ6PXkP>x~RE~|W|A(QsdPi_aOTvYy+L@tg2>MLw!+rsbCZ$VJ^rN`pR$BI4H=jp@@$jG)7nDk?{k!g8flrDzpd zKqa#9X6eN6qg+FQjmK1|=Q&oPNuP(MD<*F`Lmb_k0nMv)y69KSy#6UPKLbgOhwvb+ zG6f_VU{T(uWBaY;lCWk?W^l#YM3l7>#IHeN@=BVG)ME+m*My6_L6|ZKvhTwo^qal` z>lPYg6i65mk@-#@syV12OpadD1p$z+4_rghhuTCg34nq`iy^Y*-kwNV9rYs zp5vMKG8BNtMbe7;wz(p)I#!)APWJ;GOg?baX6>qW)qi|fv%HdSaO zR;2_F<|;uT&{?@?s3BQf701JbZvOUtc#*m&*s}zE-lfU$G_xJPgNr7iHXUCgEeHR6W!njFHliSgcEIWk1IC% zq+69U%GSu+g-PB7bj!7 z6B9wC?hKF9)+%+-4=Dc&U!xUE?of=}zF+~&N(wZ$o#~aM^=CYa*}{X2uLL0$Q%MIAkffJZ11u7fAeq1t0|3BbppGAf zC*ovdk@{6?MZ<%JDhRdVWZjl5{cNt?Hq71*R~5P87o!S*ML*Q`4u+dUlnleQnj925 zTAb&WcUJEenO&kNf>O_%q9!$z+7YMVKPrE4D(UM`ZvG zHi+=lM+51iww$K6#gnG|tDvy*QMH)AYu2Z)bfYzaE(FbQEjJ;6BX5Z{NvZ_bm&!j?iVqc$sDFi?c3_~(s zNVoLV&JvoPm1ZAtotq1>R{R-hjlaHQ{E6p~G+pyu|?bf@YJ2rz9*5@Ev*)M7Kv zt1md+);o;g66Qr1NHcAf*}x_KJ6O;#SaZq{;l&gPa$E$7UrXoS@;Ifj9@slty&ZrG~qRnQd-}*6Zv|4>U&cIQ9Fl zl*18Ii$l=2m|)PvuVcB57P?I>PH$_7tyA^o#lUWW+ud!f5(hbF^`}IZgT4jqkxaa0 z*_3qTySMbk(UX&Vlqlx?(@7ztKOHDdvut398Q8vnc_Rx~3#g|J#sQF6Y93wnrd#Mf zX<*{XM(eS!SA_(J;aH)KYVWj?^4|l1w{Liy(ydaeWJJi`Gwi)c5SwJ50h^>}14axV zcMSgOrUq(m?u(;ja+6$ljVu7E1=DRv2x!4xfjF7%a8&)tVCXW}?yIkIWHr7Rl-J=OY%CXU{T;;@gNZX(Q96KxCr6;E%zq$&6lP!fW5s@ z^AK}SmMS0W8QH^*J`}<6tC`;%Oxc%o&ei&)%3R>U>ORa(8PVFv}?dCB~ z+W6p<%M7d}!>`8>;qg1}KQmDDc8!9VFLG_gSM(S#+f;JcMFS=19i|I9b9kRRNdP}W z46I#A>)AGjS{Wy^520tlgEt_18|-VSI+U!c|(J^tn8sdh&oAVDHG zZR7<01aP!Qg0CFBtD{b5G1UxB8Iq(ERcX#2|;JCr(^bLMQ36t!dgUClY=rBMm z1M(eOI;VBTl5q!rddkI+`P#0Ox!D);=q+g6O{C`8WBM~}AARggdNR;uNaTANC4IMX z)!*Pe9_Kq{?&~hg)~!kG;b<_;h1BMfDGtw^EmPLs&Cwg~O>)dp+T%z?wB#Hz=TT1T zAFuL^Tjw;qm$G%rpW{s)^1XJxPXlpM0ie6`&j-vNTsrKwl@9HTj|aa`Ysj9CM(C9B z#5XnvzDwD74tfhUA2O3=63R{)w#KoGE^sh#hoc>l>3||73As93ufh@YQ2GQNoQ5(A zPLaSZ5!D1+7{2@yJAq{bc{seJ>F^#BCQ;v3Z%&^6_~X9nevZZ0GzwN;xA*ReUl&Wl zz(@_f_PVOPWrZkCgdbAi5X{8|yQvHK0SR6al&CWK{3bS2S|uu5`Xef>4P@?X+1kL5 zy-yPMARrk2S4?h>-f9uqTsLFr52aVcfRZheoDTSW?bn2-N{lOrIbM{AhqwptEHgb2 z0bMkqvzQR67{EZELpghwZAJrB5p<25ezVSN100S3(zNqPH1S!sTYS!AIV>HY8j!40OJY)tr)G_k(4MVaR?4*ZU!bk zz5Q}MRfo;RY#*NYvsG>wI%Z#4*B6C;jFk}Z$4SSz618=fOXmGNDg_F8)3d?S-=sTU z478;jF~1-rk;!E~@VzWf{WX6iBlsYf7vM8hsC?1aK|s4Ug6R zi!EkNz#QCJ4G$V-wMz7Lp&R9zSwp&t_&}dm?4poUK{G~?@B|FHlBTY!uAllK7`B6n zAvOS-pm;e}L=jCuuH>l6mkGU2X3at1aeA360Kv@V?}C}zk_rD&mX=GIRG$%e!mvSi zeF!q+2r>j&tg#}f0Mbn6>@`fHScI43bB8%!wG|m&w)$<4D8jdnxcne$&oxWN|B7;h zHL;$)1d41Z)+QHarifDZLP3VHmC_q;`RFHnfeXQn-oewL&xo)ncepbST; zy3j@>K3wP`mn)0%!xp>2P^s+sqlv|U=r<2i-h?V%>6|%fOMj*n(3-W4JpL87+QFjJ3>UOQ2-_XucRuQBIg#98q#7jqw8CmTV5}+6Q3xP`eIM0 z{YMtx!paRxj6KN_o+k55q0AP(w)JA;^~)LhE>GL`2ru(mAU$t1;?6FWA2jS%_elyF zZ!c=lp%a!EeNm77S9mQx<2qm#wK&`= zNYFNT0_mX8EwgSSznJ=XS-G1=aVItLq7TMhSm#TjZX~%;bmz69gZ(k+B~?rTfusIS z8w>Yml?h2>8}y6PWH^9_o=>Be=ULj*44qE8e{x$r z17kttvtIs-Ksx)MxN_NFrLJ~-%hFdqPTZb;!^pEazHfz09?|l(YmUhiReAnHV zKL#%U)O^*OPHkNQSt*{*Ygy&kMJ*$a?Xt}dU~LPII}7q7G+)i{j58k%Mx zrT_LAnH6X{$Y}rT&RpkS)P+K#6qm=dkKx~G=RW4odZH(6sA;f$cq$d`4Lv@H*JPL* zM9Su{!^IGLz^dz?3t_?8ne)c?V>Z+>+H!08hq>3e%j#2aJ6XeP)AUKSbWQtt?`}T! z|L0cV>wXo!kpKXX-`9WPR#?9c^Q`~ZF#kvbyZK+ZmDKOHQ~!rs;Q?{j|6kn7cdcqL zMG#~FspS8|t$Z8ipJqSRR<1iFk0FHTMRXJvRlqSeI%=(SI<3Hzo#$Ojps9G1gM(3l zNfP4p@t?Y|WDtp6X~A<^r{LlgFh8i4)c4+dcXARl#=l+j_omyV8UK7v(3tJEyEvcO zzsph2++<%IEoni`-?W3?s?y25bC0UU9J^c4jYd&Y32M&37}Ao9|5FKk$%(}3Rl5ax z$i_nl`Ze{!?7Ou?t~5UXHH&p^)KbUBrLvoo+q;0?MK00%ZL)-%AU)Q{~zj!mQKP4n{L2`>&^c-31V z%CO*mIqSi&Xlz)%nPkc1)&W$STG2kZ z1KT?~d%F7yG<~iDjN$5|h?SkP<`=ImF-`t{i8}`UNAZg=H7V88)-V}O^d3%ZjBlVj znr}@vj=VM$ir=0)BL+VkQcnkm?O0upD4942mEfDgYlO3$0^?Tr=U;YSKoc1*T{w|r z;9~K^kPF`4@WFN<3lOcco}ugYJm9;Fi(Z6XloW0g7unnPW#b-!F_Do{%7HA?O_vg} zK~l&Y90it4&g)emp#+HJ;VP0}>t31V;1)i0GFTR%*+9+`@`6!V`dot^H9H)zL@GKl zX-S9SXUx6f#m_aXy1(bI4wM$%`xDnT15#R^)|+rsU>Ni*RJDh?R8)f23P&oumrF^Z zZNxnVYYh~2yW2EW#te7GZe5-O@-Qh$9J*cQ&5FD~EnJ9o0>#li_m2RcW4^#71 zZ}+|HY%?|uZdwkfa!b^Xj0iq8Nx`Ve=Quzr|*{Na=%lyhJsML2W! z=C;DKG?j}OLHWzXt?o64_e*74{eiruAYsDgVt_k{!4G;jTzq;&rQ3a^T#2jgK2;cC zTs8c(4mNCVxThRw+A6TE{@j#ZoFWP@MKyFG1S?{)#ylX2DpSA`x4gm^7uOS+#{^I+XL&$9$x$X7F-@mdxhtHDG*+4jG zRPFUTi`kb@jh7W(ll^q~rb5W>hD2yd=tvu!cE^5zBn&~2BbUt()0LEOsPo>uS1Qm! zq)@e;&*IbPs=P&Qkk(_v@HiBVXTr2Hyz==PJfzJDds6%e%N^I0sKZd1gF3=HjdJ0( zklgx_*?oikdd)XrygoDd@c8X49 zV^vgNz)@^#9j8*DJsGd-$@pxmjn$>EEH1d!Se(Ug|BV_hMYs6kD0wj>tQ^?fPwl!; zB0Gu!OO*WCcq~Fn*CO6@m@d6p6J>a|cB%4U@yM3x_BZ$va2^@Vo>x-WdRdkh%!J$S z9&y`5CvTN%;dVdn?hvUYxD=LlZQpB&o6uhTj<^h?dbSkknAy`5P$>7APm#WuO0zyr zggurkJz3WCxd#b|ntvBZU$NnioAf9#5$<*B?C4!Q8lsJ4y-TVelG$v`lgR}3DYyxO zBDKspaSku8%+bS1kkM3i7T7?M5{W`&+FM}=_BUs)YHtGws?o)(O%vTafQP%gu zhv{8DHF^6Yswd9mLur$5#`EvfVEUSq=-_Yt;2vDdYdnY_zQDrgllYp_T&rcKNx2)H zdOxIDOI$G+ZRO$-sRImosZ~#fpH163%kY5V`Opp%&tCmuKUG94^41{QRzlILM!wAVFgnTd}*rg z6QYyp4Ek-{$qa!*^)P*u^QGCqGH^1$^y+QP$eWNl`(9rl#dLONGO3Y|I{z?tpwmXU z436^BkAh3hqwk9zGeK4OieW`*BSnC5y)B2c;i~W+YV%++Z~3Nmsd$VeNGP{waePg} z7I0yA266eh$|<|v*t_uDHI&v`mRwJnXhS%xhfn37(v40i+m1;}qFQ&M%t$i1d{!qG zIlSHyh1+Xnks`QvwfuKxSn8DM7Ux0JlCV2BRV+@p3@8(jImZ5T7g~mR<_J1pC^paF zxu2IPPNJ-E3+i-K&#z==WPZWS!oY-f3k`MFwZ(qKf!-<)LWoL^&|KBgqzDq-YvY8 zkzZ^U3y5!5`y%J(9MAW&hgwwgG50@Ddrnz2S6^zDX0=!U(rz_Uh=Qg58JWDqn;b@5 z=}lJy_DChWa3=fS&D8!q44 zQY}9cekEF6n%fp^U=7dJzf{XIL+R_MFW_i{4qhBz^KXB8+WzTMm5T4VQY7-cG7!Bh z#AC$hW%z~;*H5DkR$zz*vl9ix8V*-BaWVzmpho9okCPguEf+GJ9#-mwO&NuKd=%U4E*r`Le}a5^W<^H(a>6 z{!MzoCj&D>KjdKg$xw#di-*a2YBa01;jw+-cH~8@fFrov`HF%>A+2#AC#y6Z%{X5m zf|$W_ix1vfTGndt-%b`Tx$=VSYL_2v9L(m)*(ZT~(oxOH-|p*1dAp_&a~B1-`%`=zlFUI-=NApCEA8?#r7jH4S9l(Y)ov{sD3aGz z<`2beoNdRuYyN55E|7Tq#v-d-1dx^3-Epq%Rh{F;nEREwUCG+46JSs$M? zq5^gPO>+$*E5GfweAMhTSZU3+&C}j*j7L5P56x%fv3zbBT6D|6SV;L2nzN6ExI)r| z)1l0SOk|;5M!rA;PY43Y!bRx(u#?U+XMmL9@jZ)!uTh01{gvB9}akT^>Kzb+FZYyO&utH)D zApbZ8u?0yDG79C_H8IiV&^K7_2!4=y)0yvcaN%HPNZXa%qj&mJuW{>2jJM$a7MeQU zD@XUCK@bSn?98|ZF2ihN;m*3NKOr6xIplrSZW%Dwmo5>wYRb;33aNNE9$;nMIxJrRTu zOSyaUd_Q6mPJA60e)1QTM<1PW9fuov=JvK5QBU#3FF zZB?5Kj1VhIB+1{N%+Ml4pU?GBBbw-dso!%b7uAqbf$zT-$kRI{L88(~yANWUuFyT= zA5z}(b=9cs>LEs-aC_$Nc%OzVrD-ABb=v46&m0$!hcY0=N*mKRR|6F-xi(tFxfSJn ztt!`Sv4*iz!(&=8of-6}qm<#*@#%965xb6)l|l$X_aJS+;%cc-l2J$_8Gr274MyCY z3z+{D*PMl=xki-x<(Jfs@gl#wz@JN1ZzgQQLePydefi@0IqApDT=Pi~+|fu^qQc?7+v3S>Y3*59hlfAmQI{xc z-F-aBwoK=8q4`#&B-U7dHpOFj=099u(%z$e;xi!~|9pRf-nV@_(Ne9(uJ^thCeQx; zyH%wR1t=R&0t*4>65fhVFmuB_d8e_62O{}*Phlmk@lUMEp#KSY6(~dCMo6U9!oU8V zruCRvfvF`f(eE9Phv*B>*O+#{5GB$OO^Jbn#)GjZNVlrIEE?N&Llsj8^Ss*Me490U2GZ;k;kl?svugZ@|Hx<`m%AMmL?FweM>_-|xr<-*y0=9O$7{L3#c zM6`(&yOntl?gW1N$dZEFwYRS@rJHEo(sR1-T-M0t-3gGYIZh1DR>}0z6_C}U(23VV zSEvt%Mt&V8Tdoh^&F{^YRmmXtFR8$soZ76(!3a*z%!%~Mn(FL{MbG|cp<3kbAI{Bt zcCAYb-3pmRFsXa`NiqJ^5S>a-)%tN1taV+=2i}f(tn;op{j#u0ve zS?@yT6S1Bhyd1F~{3o69BjH&!bY@S`u6|r}>70?UmhcTRVhre)aDzJe1;mI@J=jvg zqb8Kg&(4RLkL$!1*^YgvLq20@trSqz;EDwqqKb4|c&TGFiz!K_3wRJ#*dDaaukhW} zwgqKQlBaJtaM*py%vf`HAy(Eu`__K0mKglRw?Qnl`%|o=$X|2qSu2M)e>^RX5xT|#Y2TRPd3IqeVf=LwJhTe}xAT3O1_ z*@q7>p`fpcKdoz+ERVB8{vIjF&K07O+2T*%A1pMclpoY}>7uF2b68exbBkAxELJNh zcii^b#{}l4Upao|B40Re-|<4x2jaACl6!Rwhm>(`1KT0131lZ52Hs;ELlhI1FNi(0J#1w*MU4k zv#0l8aP@T02!%aOSPS8axWDq0Z4G0ef*(7v{V%7NH$Z8e?p%j|d6u+ieo|JO=6hLN z{NPQbnyWwL>7f3Z0b;d3!h6ZQn@qA3p2%XK->3LdZ%A?hzDnQ6@n+lcd&q;6Lhbhn z-XUB=(j^hLNsCl$6GVXC2QycLc#D$$cmq19x*J_=ijKq+=w#+QN!t*#I`YE#IKC z2T-g=LoR3_(Olg9=ar=etEBdG9+sfqVH);_jG8YS4`m#o5S)m239&j_5n>Rb%efD%`YA%t?Wipc zRumva$^Tyer>g3TE=a9YJYG>TlWVZD@QA~!o?L@QcvmI>A{Gn(xi7Ls)DMaP2hBXz zvq)7OS$!GI>WnIcCRH85bNeSo-M1g5$!d1TJ) zi2UJ+TJL;Sr6)UMP;yVv_FZ3`BOQSDw5%Aw`me7sobUE@)0&d8MpgWw%)bDlgGp-7 zTBCfN7e*Z!AG5@$K*)X(ITZq%L5q}t+7eSp1 zgnVle_eWU-Dx+JIqUCS>vrLEsYq6t9N__gS^NPOnTE`+pb=XIH{Ubd`^y&$O>hR;H z2VVya-rQuFxMJuB+2LPE^_n&-M0Y8Y8Z?+L?B*yMS9E=E`PQ^Lw>m%F!rG4r5ID$XM6|BC@mT&xg9BnsWWpgMU0eg@#GbRw*f_Y;kj&4W5 zFB4TDEjDi^+&49~{p5b~Y`741R&jN`lwVl@M_&RZwC`;dqpyRUCZIMC(|ib(b;?19 zQ{gu#J_CLBHVsXg92GmzN(kpMt2_PUW1{W^xPgJk?SGP@!Ww-OQi&56x3sL=oVo9* z@9+u~^VENwu4!Mu=mTZHxTE(u3n-86-ptd`>|4#JXzvo7v|CY#w?hawMmK)vPcIVP zt=N=ie+yeMLG#9GS_G?R8=+kQOg=8n`8ZPBvD;vH0N45gyK;LoK@LC1j6K~elH=(50x(|8Yx^wou#GVN69IIrTo?4?If#tSg2l!&``xNvQ}(0_Ek z>9(~5RDInCFAIH0vAY?ZPjyo z4=%1ndx0)SY~?@P=}I|O^X3Gl&sb$bem0Au-#dcyX8ciAfK1$LDo_%x8d(kOqN%b5o?`Z>t^r2f$m(MCarQ99(|^fQx9l{%$igJ~ zfGcWPN)R*Ph&Fss2Z3f0n+Z-?(+aH~xv}q&;_ObnnyraT#0gEtC|+1blYHZKiHpx8 zJChQy*+Oe}8Q+IaiDZXU@BoNecPqT;)89 zXX!cD!D;6qF?hgowk!vh=CD*)HDPdt4q{L?M73H7lZ@5Rq{>675m{z9Sf@Ur#cgd9 z=4);i#!)n48=InDdTQV^!S5j5W}r7+Tl(8va zr?rsR2EJO}=7Y?onUwEa@H6yb>ffpq9f4zJT6s6AIAvBAbqYEE8+`maoSXuM>Kyh< zvpZkv^OV|HLK@{B)YsTbXwL z6>1wYh}x)O)IPp(VIgcm`v}%O!f3SwTfGWTbLDt?Q#r;>L9aey9n+=9y|#nqVb@Zv zh51E<$5-^~t6K&NufIXeyi>N{4;F>1zpPnjG{FW1Dz%gCj^CY##yhenw979&Y zweKIbQ>ndKX!CSwYi|!>wP@4o1w)5STsi9B|6CfLLs`av#jGiJJtVoghRCG_4EGI7 zIXHsB&2V#FZ(S0VBJui5g?#bpndfZz&-h(>g1LeLJnWo1!nWotKb5^+6etYvauY|_ zSqm69W#A0OF_QMuTlPz^>Ak|_Y^MP!#Gf?e_1ju1(}3Hwe05J13KLmgnlwtHN&Nc0 z(T-y){x`Q*QO_QI1cZpmLSNs4Oa@Wd8<=>@M;0eFBd-iz&_c?PZ}KeTZ6>O?2L$C1 zEkP9D&M#j%C?Znp5;C^t6 zb$XcKy6K|+iiXZdwENW);$pbVvDF%E^^f@q=PP!nn9Rv@(!*8C4&Tbqv`0;e8kG9? zi>y_v6*(kh8)9z9?W(i8h$i#zqH)6)HG84?Bs+KyV^j$^%7z;VuS*~Jkg2rX!dd~3 zOQ}9A!;)sHcHim&^>^SxutWh6C^ZG~sq0J%K%}0*iKJkH1aYjwg{11;$n-@zTT+v7 zy9TNrXm+hqgvBjoNN>CPw=A(ufmNE)mtxrfVrYSQ{v~YHp{Wh#DrDkfe-aa`x(@OG zqp@N10YfnK*F;m6n8>#@uV=p_Y7-ZJId?R(L{D&&WV!dO)KdZFu-^BYaW=HjSukz8 zRUknRrW(l8<%U6@;wBl>;O38ISL@RTrG8ERY%WKV6qFmy`Fvaj<;m$}FSKNgRKKZ5 zIG59mOAf}Hfz|uu_*P!t4t_G9p;^t1IqV!&f=nLq2zlb89{A)xvq~f87OM2!s$8JxdX3%yf#aba8j%0XWwD?;Os;!nJfAao3LVtX z*(t!CxX8g5%X$kPop==g^N;_dyd#|smoH>g+>gk*hvF)oF)z2>Ifs@s#e>!qYI-FY zAmkv_o02!74p)C#Z62<`caT#=R}c3?h+V{o;Nf5qoNvlpqDw7H#au_A$wrI)^Qh?f zKwI6h_P~?NXF+}1SoeV)aC3id6A8GOX1#cXz%&>7`K$rFru)uWuD7Az?Ze0*DX?Qx zs17L@h9aGQf5b3NPER~7Ikq1WIb)aao44yZm8KjO@3Y>R_yS2DjulPFQkPi!5I3hhLu%S|Sl$#coc&OD!cb}pqz-(bN_QM ze+#5>Lh{wI#?;|5fOP0-mFt-9tK5`+u3W%zzd?++QIYLf59CQ5*ns~&?8!WzBmN$a zx}Ww5z)OT%qkK}^XqR3Ct!`Vk&d+L*eM6Jr?4FTO(?Z6ND?8&z+KMPi6zb|&*adfp z{X-8VFG{D&LlyAD<_}7E!3V+QdV9Rp8Par@Yk%?hh61ww!>#l-2`PFrZAn~5iqALV z(Xi`%>!YA$jF{Rv^`?3hZP~TyXoW}+>XKj@V3(F% zRc_B`ejm)?-C(-Nek?Tw;!IeExw-nwqctE7PcAsK9 zYJR8aJ!V>DM~x@qza2ch(jWwL4SIYdXaOZoz)=}9YuIm<+Y@w4K`2W$ix(>sWB6~% z*VDPg?-aF1`!L-*^O6HB(Kd)-;F8{~!B&z3O(ds&w@Oa{BsRyHPE5q(FBqOhAYyej zlaFxD!LWfYuS2~eldg6d6ehmZcWNI$MY5+8cMXS&;|ZL=96lgK(ep+lNzND{XvUyqY`#auVU!ijCG{+}^#wx0_oq-{JI}7>6E&8nfhFceC-S&}HVASVAJn zg4@sKP^{4_&K}$T2Blsq1V}NH&+muW4X0|?!_+sdWMG+DI=poo|E7cc!%MeJ7HDkl zn}$VvxlOWv(asl-@6ByYQR}kbVaB2@gQzX%-Jw}$oUv?$odv9|BT=5U!$Jm}(z#Y_ z+}c_?qvd@8dGd0S83zY)3SrZ|`9N^DjLY{+mHp0~(RF4E7y7;l3*+ZS%svT^c#UH> z*zEi!va!O3BFE{RmiU*2BwfMpVW>LTX4W8V@QkzR{A9Qq;pB}|4H=2)--sbm^}9X4-CCI?fiHp1ppqtum1)NF?|C=O#kzR zjR#V=jsF4+rGK}b{y)GF_5ksZ{{;-`e#Zt~kV&_156J&6bfb=L_I5(oEhcALPx_0I zmy`ADA>ETQZL&m~!sH@FT@-OK(4j$r(H%f0v)(luiB|j7p@Z z7az~2!1`O*9E)}2^G!@1gP(EB#{2DyWc0nT|C3IZJ;2qT^d%7=@1pqkx9|amd}7vd zEv0SOuKXk2))CU81>qaPFLQs>0UA5~w2_=CvtDNv!IFBB`>_5%BJv(x>}@G^90haDHr3x zQT?+wJTl9sxKYMKM?Cad6@ATS&CYb%sw&ST-kFI|geI4qrUL-TC0NhYbmJ9YvhTc> za=!?ra)pi#q!}@b;VkLfEosEDI25QJrc%Yqy9s$iU$kEhWRvey^t9EC1T~LRly39a zFBWWI5ao5_!I!XrDH`!~e*?3pPbAo@x^=fgU-tK_+!ZpXBkpD^>Gj!x^WWv9&$QY< zHCt9@OCn|yK4)O=P+G96@$Mbu3if4MR_2ewC#m-`Qi?x8AEA$hDSPcc*8?o;s-%$9 zv|b^}$6_q$CFP7{fW%kp)cNe?-N?MT5R}78TD~n}c0cJ0_UUAkt(5cL zbqBJERglJXe8R-+i0Rt)RdkbQ%X!bbV<9TWsnvWZi^QNxAja#|y!J)X{$@>IIS4*z z!NJiVh;Yh0!npn)y52E3l0R%0p4ixUV{B~OcCxW;+cr10lZm;p?PNE$ZEegm|L6Vi z)~R~Vhpy_W>glQO`QgR|RwHCC^s>z<$8O}{DM8Loye?E&eJq^8HaXYl-tQtONPbe#Y6G9iT5&VEOKZLaC1 zI|u6?>2F*i*()TFx25vw*8P^0QS))$preIgQJ!$6wxFYJ_h58HfoNk}AH)Q~?3Xup z^9jd-UHes1J_~8uPzx>0Zuo7CqyEy62>3zWj(ZJ_9-`Kb{}7-{eNOnXC;HPh_Dizl zoQoy-c?F~;6FEeAeD0s!9PL?H)cIE&oy9;E4BI)j!)*d7Fhxtu*O>5DSvC?yfz;n0 z<5r+>=q;3L^dH+0WBfAMH^3B?`qwINzhl~yLCcFw83ZEm)mqTE%+u=ot@LE%uQ6hO zqgeSJ91K)pj|lR4Q73J0|8Zw;>avVmgJ$u2Id6geG7tuSHx$UmMjB?XhXK-v9H<6O zU0oPUDM`DiR~M61pw#iXUZr3YQkN;_EwgNt0mkx`@ir4<(pAi#0_=3GSs3zjE0INk zyH$_a;9t2U@+L0nTqh^r?<)9(L2TTzU$iYVc#{*SvqQGHd$RItMv%gxr zv3vrQBRG0o5dvkpl;5#hpcVnWj^0e}aNU^(!uuSHN`3t*7^~u_ZmE9OiZcNvG~OJI zf%e*{i{7yb{=26g*n^7z3K=AY)5Lzbxu4BMOQa@MK`izy;z(K;qKszP^BURKR0l&S z3Q)--@Dcg1Q6n0c#l6-V^_MGL_S;H(WOI?rX_bO?HJTHSRBfKZ{#qXqY$mp}^?UVH zuTUW2e1*Rjn7@Z(EV-(964*HGtBBI7%hrSCelY4|+2&sI^ZwAY2D^=FAEG?`mai=4 zt04ZgL8HtbD`8a$F_F@MDPpw5I5v$?befA%*SvUr5cP5k&@|ka8>U(ZDy%A%^1Fn2;S`ranyk-XR@3-NL7QqtbuR zNp%L6cyBHorWf5#E7O$j96dfcbayZ?uidS*^Vw6#W@?0pgdA&&z@dAMGuSVwa+6LP`O%g5b%$2d1=?J6cFP(G99i zk0v>wXympa+{d}tO{M7{m@E~6=S1*|MT|qFbJcZ4Kwj%|M@4%2Z57#Byq39z zB6#l~q*`T9FA?)q#!-6V;36WNP$1Uqz>;lge!y3*EzrPUP%?A9(#p~i-$y-mcuh9c zA`E##Ulsj}2*<_H|6?IHLc3OZ#c$S(Iy`oz>1OmhS4mczL7M$j?oR3CcY zr;Q?aK%r&vZ{N2vf8(FXKdo-MU@5p;hy=~%_pZJkd9#$1WFS5UEFBBN!8#gua2xF@ z-#%1ktyBX_qdH{dd*5Y}5hhpukp|k!BLz0GbTCb=%(-k>F=ZsEmozb?(Qa>A1v&-i zl(*%}ezo}ZcvMY?%RL2pg>M2sv~KN^un$%g zWa`*+_WbJ(%tq+PbwM8M1^h%SD@dJm3Ji1#C9?pGTfElQ?s|)Ww>W``xgg)BRfL(m z1AMH^ftHr*tN;pfYUf;g0VYO*I4~DS9i^DT)jmc9+I8I+fZ&?|m9SG_KV!JF_&ONH z#5Ps@T{&HGO#l1t^{-j#Px|U)*ZPq)KcBGF3;DlW?UD^)AD8c5-u&d*cCG#}3hr%f z2Gy&7Mlv+If2EWnh~58nO^k#1PDBuIav8q_J=Gt@4%b)KSJnQEn2f-?57nJc~{wj@Ka#|dOH2+Z&|85 z0bq_wd1rsw8o2v7R%W^C<4E)6IW3IXymV@Y&n0l^q)nH2APwgTvuP3?>r=>}4FNds zTt_G<=bNq$U_iYrZ{`?+)NMd;FeCZ+T|9_BkvAENPs8hsZT1#oQrP* zx(c>kIgJ7y5dm&Fvh$J0)<}`@nYSK`Eu?;_wdoU^7vwz2!gtypSM-LNZD7X?SPV(Ua&c->AX(AyMd1Wv6XB zry~1h+UkJ6RyI)IaVn-ok8Co&#!_~UakE>K1g5D=hNgK>IC+8V+vv@&pUD>O5xAIZw8dhfI}+~9h2Y|z1n9GbSKf-U#mh-`41?W8uL zX{5$UxOy=8+xIbNnmmusN6Vcl1TYS1b57}@J71*fmYWzCotzK zH=R;)XsHev>1;P|q^_f*eWB=oHwlpY&Af^nO}x-sl%e8i9WqaJ@n$Y2NQN1*gB&mF zL1G{)&8Ao|;z8s+L&sCi=&N$+x_wslhYlQ1OR-9ZvWi{0$=p$kn~7G=C?$0#q<1lB zZ%)x;%jO{uhFEio01enHn2kZuV@+Pghs}=I#5^@i8DRC?!WEizJ~6}bn2ERRjQ|D| zm*}J+vU#iG{2960bHN#o(5qS_8QlXrlA-%q)E<%$U;87)y5TO-MO^6VEF}SW-&WU# zZ%tKkF9jaxYpQr9Jm{lO?;e{>*X`W}Lu=?x4PjB(ze;1cMOHZp25)ve_x&C@^30#k z;K2&owmXMyY{79zf7GBM?Tbrclm$(Wd8Ixzf#EPpspRs&Lh3QYm7-B{6%N9M3WUfY&Mf2ca)xy3Z^jGemEuSP?-U1-0@MGPj#ngl|@BiyvQ99t?# z1BYYbbu6cMy>peD8rCQRN&IbcVh~3U4%P?qir8k+`qa7on8uI>bxIYZ8!`5njypxr zPLhF>I>T3TV2=_q$jNk?3s&N2ZmB&}^yW@VvR>LGqXC9O`O0+7;Dd2syLK%TO_h3j zgo8teK)SkW)ac3A9c;x zQUqQu;@~TUC<`wQJ(4j#&8UF!F$WKPDU2bm9{zRGT=!gCQ+qVq`D?SI@8r4~t&%5R zN=tT7*f`uS$m52W`1xR^vCn7eI!+)FQejq9ex~Z-FT{3@Bj&#U07F`7za)Ol-z0b* zp@@!^RhcTSO*ab2eZPdN$0Qvd`F5bw5iTus;Oqu%I8qKvC;0%705Kgc(7)38B%1qA zYGhRZto$7LMb&pH>~ycITPnI2*mi7S%yLpYBc|@PIjfm~Z&`;ofYvW1j6e7Du7Ex7 z_r6dJn@7>Z3bbJ`+nU%{l8G8bhJZv=FtiS(Q>?%v^snx@CL!&=SNvL^e>_QA)L%Lmb``2Ump6u52s`~3aMHbQ^VFOa z-|5x3VIDT~xO&ZlGUQL`=AaWjOv~JbOzE6}XPuTf;cpW7Gy2h*tzkh2K^ar-^Nl0~ zJ29+`b%PH|uUes`EMcdPxvM>($nU@F%+L_AQ1w zit@KZ352`Jhcs3VUSlp{2LpV`koQ3?CrJ%gmJ-?C+}e4FeCfY75P4ec4|Hs%Q&!8^ z+8fxZ3fCAlr3EJR43HS$5ch3IJu{H-R0gth{bcw1b$0U=iBK^Be%)`J)ANgjea4W1 zmtfd9`(`HMlZx!iSc}^r;-pI@5};q>qX@)zt(Q%XvM!)h5i7ozTK%1@l}hjpzgYA6 zZy2UrrbIss3)YmMKCF&#r5lDt7cEm+S&#KK}1s@6iMY9>xdD7xXeU5%!{4H6%P#zTX|s;aa;zzHeA14)&|aMz?q;g(R@a+q?|7cBP^#n4-?pRy#Cq4)=c7}Jv- zT&vI?AP4r_Dm=qJ77o5*e%;m?8q)RAvfnxjhwGfWl^?gTOdnReE_)yl6PI#8H%o}f zo4qU}Jd9ksrdm1p1C)Jj7V@OSCEZ^k%l<~v6u!OJJ#sc#qN*&-Vb+hs{K{#d(hxVm zp_H0jcnI3vMbbj0a1g+5G+T9}tu^{Iz^BncoP?Fvd=P=e! zAed!iFJWUF{`5(uF~N2JC2r7kfcHB@e)VumaW8QKFZPX#!;X+HKSfY^*imw2TX=#R zETOCY%G1Zzm`g=BpEuh#pIwK-yjOmqIAf&`3__Z-)yA%wj(-kOJ73{ibEzklhb@TE zf&5;38P;^et?jv|-^viLHgss%+PD~`Cbp!t7Q=R`0vbs$Wc5vHhTaVH>9tv05n!i( zNp9IJ>Och2)|#{}>TR*XV%C$pI*W$uYfTLC{1m&A0+Vgp-#7{S0B%=o@+%8V&WCWM z_WO8aQ-rGAmcf`iI8~>7r$?frv^3@X72A$A&IMRp+b|T%pH|UYyHtS3TGioaB2bod zlOfmP{+sa)$)A^xFKSDRVK!DT!uG7e>`ys&XfHfM(Lq|wh=WH2MFn&{mcu97B47k= z&LhEa`f*#X$Ujq@K1W|HKxVv5ket3)fElDjRIl1$ZiKJL%$dRPHImNoy6p;`AlsWI z>_Hb>SArqhVdL~U)`xflcoE>-|7_vup(oku9y~tp z)tM^=T!-BYnbLG8sfg`!s5ee2*`S-j86LgM7?JZQ(aq$N+%9ZWuCy(>52gF@Pp+iC z_H*eCkaiGfefgazk0FGFV4%T~kZDHW07*EflNQ)g68N(+YH<5vcZ-x@T<05d|58KL zi{IML3Q*|}da90lzsju*(DhcVqs(-Ll+i6=gNQDGDYRa_jwpS7hWUTow5L(AAblXe z@BBF_@+jnoGx9-+wq4NF;mARnvAn_Pnlz|@;358dmlKD%SzKE}o&krQ)Cf$t7_?g{ zDF)lldAk$M6RHt}f*8q4L?-eUDTqFNW@SAnO-bJXTXovNpuz;5I~OFRXtHZH7Q1Re z1yHJ@m5Cp`yhgxYy|UCbSO6Akd0(Xrr&~InP`#pcNIz#!-b)EUM2rd%KrWy46-i#B zK!V-0nMoM>8N?u>LbWc5MN_%32$?RieJ%=954o7?+qsFs4`m1)F3v5ZGed!35@rqJDe7!mE11h*>hNFt8El_wc{+XUEjb6KK1X#I&+7kd48_qw}-GyDF% zw5j5gOGoOSP6baDH-?(G!CI!C|K_011)}<4Z-XF9syGZ2tEyT)#$R|v;+7i`s#zG= zu<%JBuc(@AIA=XXim>tDjRTMs3j?z45~Xay?*zKbix!U;%WzjkK0Q7Z7KMS#M)>4| zfbbO8W&p*QS9HnwJsSaHkZsCvCR()R?DhHK54)-b+n1ehEeYFA^Bq5n(eTd6oG$Xc zbxeav;Uf5v3~y{mHld)pPD(Pgo0BoqagYW39@{_1m>*wQnNQg~^GapO&2eE^Hhx$` z$mKgyeT*X2x4fv{kb!YQZ)0^mjg<YFs|Ln1x-V3IiVi`U$HiNdMhlnV)lo0(r^Y841fqPz6x@hKZ?3jH>qD#Fi2o5YqEHrr?m`y~4Ht?1<-j95=>$>T4m6-u zSWyEr1j)Z|f!F6u82tg@MDy@jK%)t|_-Ffi`+9s}7*RxXi1Q8i%>R^u zkT->`GMr7|vpVE>n&#(jD(`E)%R1yM*x{nTmA(PPA#E06HOo%&ox+hh{O9c{tdvMX zUCkk8J`*)2u5On%&|0RuGjwFge!65XWcU0dc0rfh_#L75PpC^Br8@3j^~f3b1aIQ% zrK^6T=75s}Pxfj797lHkwp5VD{n^JN^OSbtlX;>Qaqg_xMSP1SCw)Alk6znzhJguEdT@=5utq~b~?rkl7R5V z6AI;_Ce%u27)xi%b*#{TRVWY-Qy8S|dg89a){;k=0|Qitz)+~pn1MEYJTZFgpx&CI zH|h=O_KZ^toZj?^)$<9^O(d0s zY5S`h&;fO5Z!bx!bv`nUQ?s`yAQS#zjd{Su4&ZS7W86VPJY^oZ+0B*qI<0*ItyzrF z;&^s4CG{8oMVuV~-HWZQxCUQemfWcI1rL(_wD(Y$WuAp)VtaMTgY;?93*2RrR!G6k zfnyrNzg;iPV#@}D9^BdcnlA9@#3{Z&@@L9lL$8rJg@&{)4{&7puXcINB~b*%OF$?! zQ7x?;?S#=MqWCWKYsefl1cDOzEv77bKYCZ>vcbZU`JShnRb2n5K@_*XubX9qmX@LR zy$)6To3Xh#x~RLtXFB!KQ>g16h>k1AV2oX(xGrZPB>@=Iff5p2tYHr=8=Y`5`iSCyBt!7I8_K!rqvwu}RL@ zR~SkvZ}?h^7QTT&EKqRVngkFC*ubZLb_1eg9fVj-!@M;di*!xo{x(Q-5zGHXGqn5_ zg^}a1CQaYtJ*V4Y=ae%I@L_X@(_X%fbhWE!tfR>kFHrUcC#NH*;N~9;f9=DSMUWEyq;TUyD z40v}xXxY7T)W3$4U7~(5!;8xY(|pFC_$0g4UJB0rrFB*ivcp^Oxq9ev2Wm)s2lzOM zlfQjzJ5N@FBet8iJr)kxa`xf!<}JUOxKgfeqUUW?3PCYa zZY){_o&q%s$pGPl#Ur)r(gD*`7VDeC2J#kIJ2T~MRRAAqn|5Z&>g#(i5DS_Qq~l$! z0(QOiTU?;@+WYd5Na4e8@C36V^nrQMgX`T5@YCzU74)i8u4mQmFo2^e&^Xm2g(UR! z6ArmV<3g+}jG^S{Jt{rzdV&3#ZT`_jw~g4d^(Tn9JLq!h{`|?C2wyFWw`)3p$8GNvk!4LBEDEZLds1CE*#y zb#VKTZ3oGp6!;vf@>z2BWniEm*pdUnM|v$GV@-7E{I2!nuPZ1S zuc2IrA+O!R?!9Mm&p2(s&d1Nv45xXb47x^)_y@R@CsZMI5e>cOrf=M+fCnB!=p4&4 zYUmcMR%~N}u>=!=9a4a6C_I-d(0p{a41m9XSX8s4mCB)d1MMq2UJaNgzy1*A{k7K87Ygd3Mr7f@| zotWsX*Y;m3VLUNo!yY+jUx(FNQ+bLrWADYT)SejkBz=DejN+zM5=V`kwnCO@|1cm; zW56YN<7A6eFW+JjpLu+eu~DNz@DP~FPk_t>%_8hwgV~35=E{W6b$G|4IgFL|GU3XE zZR1m+oZgD*$Al)&p1h&5-1e*Am>&q(#^)o;Myi+H$8G-1r- z+1zcwX4D5t9t-umrd7m!(qJw;19Uy87s@4E$$>cFGA`5M>rITHO@?@24G1Aya!IS* z3{2X0G1FJ_So<8@h4LExud&IuP~acz+i5kA!O)pgn}av-V+b8iR%@-67H|RVVgW_w zM9KA$UX|T9xRkd8WZTUEy5crk9TW7q7QTfapmyh?dV`E`kqy@QZ}J(rKl=Qm`k;M3 zPZ1Q?Cci2m8Nwu2cAsQjk@iELf`i(tAQyL3#xa*^7*9P@=qkMf3wq+~EV4f^|Gf&c zAo^R0UZtgA-Akxtu1sa&1@QVm(o6~o7G7RU+gL@aMV#v4tgC+Xpj{4ITj;7&q zwd4^1fXw<2FoZx0`d=2rivHsKz^3W*=>V2DG(0b<(0k#fOtC}pzWEH(6wcPB#c z$W@-gD((Uvx~QO8N_HR#KJ=9X`IFV8(tkab3aGqWRmKn?S2~4#VrVVl7D)Mg1Kyq> zFK`B23hAd<)ANrt7gpH5iKuKpqM`62FtHU6@+WSYO!E66C~mv0v|uR&cYP_gSHXC? zQr<13`SeR$oCdv)9M1p^{u)E!FO|qk0z?IRNG?Js-1|p$oZmM$Hh#8G|E8up-Y%Ah zgbbGSC=p(3_TyIGGCb|q^t4JsnNJru6*90!F;qHI-rU6Ou5G=+9#KC^Lq`T(wATb^ zA;Sz%NSL7KFR(CY))O#lVeT@8`;i6+?|K)Q2S54k#A*e~MnGM9H7`{d3kl~U-LpIR z?i$xt_hn$(yXlzn-VyY?TJq6ZWpnYICQ3s*AiQ>t>a*<;k0@)$7^a~Ux3{rq&Uh9^ zfqNv&^PVc0RXxSL6`5A;gu>9Ci9eT=Nt__8?S$MM&hWo1hI~p0*4WI}nz5kjAE+1M zx2kO{`wT-2=(GaHg+#Vg)yfHoUV?*iO=fi7KaWjq@Ktn>BwpH39<8V zx_9^I)0&xf5aa242q{y#Ed{mlO^qCbn_|G^0{CuM;udXxQaEfX`jtMvQH|HyhK?i_SVo9 zT>P~t9MvR8)UbVB zZ|)DD(cR1-$-nQlkKk?^c>xzw?Y}$-kwGRZdRbeWzSZ05><^em_GWpuP*_K2RaqwI zpUwNGPq6Bp;C^i{efy{ni44TwbyLZdySu+sH^(+3E^NS;vrh-@njJcVmNuYuS&`Xt zJ}u9KP!{y_2}Q|TiQZk;g2Gk0wTi?!*yfu;;wU9Ax$Ya*&SyC6EZu74-M4$47!PjP;iFG_?kAd6DrL$79 zgct_;GJQeoVvWf&et}o>TZpoAvybZiJ zCz&qRA>t-vgHN3P*W+i2>nH*L{_645$Cbj&!|*=#3Y5ND_TPuZAqi9ZcNK6Xuz4f% zY`GeNo*{g8@nLdnz2}R)`FLC&en#ccm06cCUu_vEtnEp}vx(tbG`?GaATaCN|8~b~q8K68Iwqh+ZD6CVvwBlzGVC_(3@T|HexNbZ&OF zfdc@IpaUCpnU#ryy$hqck^6rq^voQd%pCuNmTCl-`}kkbQmCM>p#Be9is;{$(f^N@ z0_cFwb-)%)tWiKxU}pcVkX&(o$&-rc$`~US#h);&8AY^c=)ON{H>`|TzN^IEhGnQS zQPft7Y2b2pu*g_ak^eZGC~tPJCAFeoaldjc2ltCx5Gk&)3!1|!G6v%u{<{&Bc2`dM zVo#Cz_Tl^|-G$p;LoRf_1{1dpXc%YN0d>?Uy;h!29jT+g(d@WB= zT?50>@TWdv$!%pI8OHX~*bungU2J=6Mpc#gMQ{gXygH;#TCSAMGS+LWFa6i003B6KxxA#$Zxd?m4prezy}@w3pkJq zq$bAo|EY=L)9ugyFT=eFbnB-78Sebk&@7-2aE?-1E+Amw`+o-*MAC5M{{;^8#4vl^ z=EYoJ9arcJw&2E`Jl%}?YRv1-$s_oy|5rs33JOY?xJe3BmOU*=v`xxH6_FAdGpBGB zLF$GAFBFds_x<^b9b1%-SyAk;iVfogyA!4)mOrE zw@6^O>t2Y9v1c027?LtFN8>bjALu5bZ_RYK_e~3!oJ0H#Q>7a zrUzj=>iSCUrw^uoy1$pJvi!hQ+Kpr35p_IvgmZ9)4MvH#0%|}D7~2iaC*q7tSIQt< zv*^If8f62;2io~wvSXu-1IOK-BtE0Lb8s8KXWxU0mlfV<3~OBQ^Yx8!MV-Hwo6&%p zYK{Y4t=|w;B(sG6Mh&;pI+Eipz<$87=kYKGa&q|f@KVBA&FYd|x8a_FGV)*Wxd5bO zT(IZFn5@fg%=yk$(cE%Z56tNDJtzE6YKFF@0tDPPuTx4g# zizlJuaoQB4B$gpxFGZ)YM5KmOM}wNH;AlAMd}87chpTu$(a7zbErHzTc{mHa@haxg z@G)*j(hdp>{2X`z2Rx0)@I~V`v6fjSO2F$TY*6;sTZD%PX3H> z>x!2@Ix9aSj_xhPkS;3wKmvUmeHPPaC|=g{$ZLZMzM{ z*@q6*(9+q{+opcL^v>jX4IQRU@>B(bIIZtnSJsf8PHs{Z`i|aZ)fVzSkn0 z$%(?Y$h+y?3{;lh4GkZoa&l`y=l2GxiISm5#wbwQdlNckxKvuAx!(HMz z9R8dkC#nBVprYAvZ@g!0frkD48dFR|o=Lg)z}LI7K6opqHwBt*Tgs$`ZMLaR?JV^_cJA*>?(cT{VJ~YjQZlPcBk=G(R8(v0@UOAOr z_#x4xDE?9py}cYFe!(vg|Cz%Uqoob7d4K#!DJQjDFK&4IH9rF?B>%k&bJeg0)2sD_ z7(v5MmL9qA%0*ewCfDn;T%g{cj-=Wlju^}akKAS9)9DI?u3MYvD<=2!o6YzToGFuC zo)6(BcOCYCy9$_ZVtYX>c<6bn?7ElDsK0sK!6vxfi&lU!<%`Fp!xeg;=n7-AUl*7L zTl*Gg&m(cIb#{{WEazc3I(5NT3ma)0ympC35gF3_S?s5w9Iw=-S+|vVJH<$#zFokL zy0|oSgoWE=P5WUbQ48{Z(FVd#yoF|P=jk?N-U*{CGKsnFB#~pHrsHjhmL=AGN5x<= zF|C`Ds$f_0Q~JT^sN~GIAfBn|N@A_ic+`gwj;z}d^*S=`>LfZBMO&Tr1iRZyP2D4| zhDtWN%gwcXJp^>YG9Yvmg6Zzb44a(*Dbb}QBi+C`38SJb(39G$w+|ePtyXdk#W?l( zRF(%*uoEufoAxg~hfr#j*FQb0drUs-kvb(OV+8p;l$^Sn$bobbk{X#E?9(T6GM@NsEI0s!&?z=Ex9p}Z8MsGL?xfoj26mwhydm6q+`#dk- zi@aLSYG<{*`Ly2b_H|6(3#m7__~J_w@_|9vOew(FCjrO^P|)H-@ z3;h&5SJI)fy6-W$H*}9ui9}giZ^bi4*|eW<-?|2b;64b0Wxf~_%%E!$4-O3EIs&Zn zqbRT>@S2=yzWQj!FEaGC)!ZAA*7sqD*=701x zO2jpLbuDXaUwCYxvHk=4d)WkrWyTG2GAcMZ%N%;?rY$h3%GIkv?by^9?aT4^i_I zjFzJThk@Zv7Kql(QkN#6-4?EQAl(__lJM^PBGEBOzThq?hx@cyeY_^?af=#5B44atL8sC_bs5+4+c4?Ez{S}n(K8x=#NY|++6lqTsZ0w0T>kP zUOuwn;{yO@#vp3G10uuk1s@=2dg+c8(c^EuPEvK#z)V;AW<5-bd%h3#BzgN(#5Mld zsXsCTy+e?AjW>GXz3wcU_OBj~i+N+U?=@_Z8Tw9xhw0)}jO@S?EX>?y}SZDJ%VJel1+%6DC`l;m1H)4pYW+$emb5BiPrzpf4u-#=`uNGg zO#_(o!Wz4RUaWe4J|dM-%)i?qRf3uSZP>q;`t2L&!(=j3j(N0Hm;ga;*q zb-gxej}yvH*7AHb!GE-)*h!N|CF5huiWT%!T)5Ze9@I|B_(8IxCG4uL$tg>1dLM5V zrV$gAW$1u?3~VR$+1`xGT(}o~tNBgI{kWZf(vYHc;n6iWqMbsDV34k+QUEmEr0~%t zynSm~;%L8xm6f6SZh-E4CZ|~IIt;Mm6jd~|WG$PV%(Dt*TnAGeN zZmN~s)XQ&y3=!KN$>);SpVTmLHQ@cnCJ%k)%RnBoLOlG_$ypSIJI*lDH$<;qC4aOY z#@ahx0XvmYNPYsU+t$V>l6%~oySeMNejFM?#OFPwVw+7S;B<$Fc~#v-<(9$?0LlAb zEe?@n6-fC4p9z@V(#ZZ{pe>wjC`?0mEv`zgIp=u~(}GRKB~nsmmwpoJ0$DM%cRR!H ztYUKRCj8GH6)=6f2i7a%iEl73NQK}6XqwxZ%`TpDG z_e|IQJo(WJb{Lim)!qyUe!#n_(t)KutaBn|m5kjs`75I34>Q|y&u-_2c^d}}Mh890 zB7CU+YmNJg9tfwN0tQ5n7B`a_<)RCbsd`F-JrwUcnh>a9a_~Sq=d)!4tygV0rZL<~ zDC;)(X9d9WdXVGMgm>BB4|b!{r%(xC$;4~kc*2Ko8+;D{H^Rmgk6;tocWD(VHZ{LV z7@D2e`8*cfLSo^9P`XVmhXRF{`L>Juk-&y@r{z4{(LqZ8eH zu1=t|uN#gf^0~*ON`tBvNpST1#fEcDu<_%KjBwelogE*#uZo1xe4GKYW6-a8u0_=L zc}3HE`FF6mOwJPA6+cp+E!2I*WHh$^&bJxRN>oGsISmAjjR$X!DqCtvyKVXYY?=Y1g>L%{F`M--@SZe586{ zm)&f%SpRGUdfzMV|@pGA|a2R&ijiitf`9fOIzBBY-fOb;sJfL*JZ!| z`m%16LA(Fw5CLW*`*bWs^4yxErs+2Vn81NW;oPYGHPofImt}+1b4rEWA_v+bmV%L?TeCa%s$^BU~s3CEP{r5`b>EsWU#HX;;0 zro691A1;ubLJk58@F&m1ZcY0)v&bRPvj|vGT1VVyA@zj1uz)FwNdC@Rln70H79z!Q z6MuIQ_p>FOWB(v;p#dy#GQW;rLbu7|b^veV!$SX6^E|8_%%^B0EXbO{fxIXlKAuwp z!PW%||KWCluX42^n_xzOj)shV(0z-?-quKbloH&Y-!-?b_Vx@8j?LqryV}xY6mhDkmEpJ4Ff z_=($m1!e;RWq`vu!~;Wg>CSPdgnHV=maOQJ)=9_!i+QecQDyjrpnp;gk{(^pf^!>9 z63rt&M89G=SXTO6>ico7Hsh4^Zq+JbZ`h$fdl%_kP?GYp5I!k%d3&H@+z*JoPHW(( z3D(4HVEVC)fS|ZJosN8e0;6nI*XyI5Rndd(KrPJkRntg#r@fmyC#c?ms+rPQG&2l; z5+Ggm(E$jUOcRXh=`(~);yN(|`_7XQzNSs|ETSY5Es9(1Of0^(I+h1(No7e(eJFp) z9}y{bOTuvg>-Hud6I*j7k@)N}jeS^2CEf(?{rsxuZzmvwJ6Ka;x1b5B-IJkm*yz?m z?W<+V=8%_laBy8kjU*YbyiF~Afym-|8Sfsl+WbzuB3II5shM~$MqA)@i&ukvQ1jf& zzfWij_nlote+yC??dW*af`)_IbDp#6pd2t`hi1J;a3DJS<^v~p_8XJvSN9AF z8af~J&+Sy~US~ekBkLYwjpn%>($vj7guv__=yND}kFlu=YA+iOmR7KgB~{5;zE)v zEGCYErHc$tnZFC@Uk(GliW?9PdW3wxmIaKQF_*a%e!p@b7|$$CLogdk zGC-aQ+MfP9W-f1Bb z+Bp+qB-YJBg2~2=DRUGM0urO~z(P1LU4O~`%(E8binl(#1l+bS;V75?GN%LP7`AJl z4|^i4zWg*=P6Ib=F?Jg=af)=A!e}9<5)>c12HLide#81o>}r1mr;!X}hn`O`7XB3j z?#cY-?})$~>^Rz7iR8AywL^j*b;kR=8DF=*<6%&`b8A%?UKF~J2fmC;20wxG#a;O5 zpv^cW&kVofUAVwCQ$O0veroK~BznzmHkKugXh#W;x<$-M_-z=hj;%8rd08N1p}m z@Pj_@egdw?Bf+xfFR!Cagmz+5cSsoe5Nr+hUTHaYy*>U(1-M&~5_YU48`qgW9p-6N zu(Nt3#25Auv!(Feg2G`IRnUV5spYM>F#61Q^WLsYkOzGsPeH}y(kr#Y6G?n+b&VTx+0%Jk7!L?rYi#=gl*l8$|=v{GmW-a zBuJ||rv=di>{Pj*9Dc-2MhsldIPAMG^kG%W*nGmD%% zJWsfwH~zuIm14_cF?okj`}~@%+N0@UEDL48C++qBgH3kY!{#DH&%t$}ITlx^`q8Q7 zK96hixR70*s<7@;jX85dyMRl{0IEsqK^GGf&Uus6f~1{Av61qHjuE2^8U?=6z#h67 z$xaIC@+i2(2y6qx9}Vh*ucWfXu|eD+Jn!KZt9v>FVKUB27<-Jd^`nkw9jKG4VDbel zh6UUqiuA^qTm&8-9NiiJbN_@aqIuVEzDN&KG{rGx*{2@LtmUJeiLT*`oaP1itZ{kR zN3?_~_+WPP8gy>1D5ZJvaV>8vGcghIWxVpM_kY{bko4O#OPl`fgsC%Sr@}9|(y3mq zdLE8MtUzuEv>=j~K7cySlVCc2g`g0Exr+%zl0-9Npv;5PJkLaBl`6$=)=HwV)H7%1y5cjP9 zY%SJsCoT8w(ZlwEk3%|_s>Ps0*x@jJCKkv7)knZw5esVdxpQykp2+=)ydg6F8_x-D zp5b9?nnNvQeN8Wxqvr#l?ZB@jgzrQsuv_%;+t=>*TJ(UsZ%|Sg#%rmku4{2Z^}I|x z&{80;;6)(%E*ELg1&WY`7 z($;8bC@T7VnN-u!+LZALpMg=iZvNXHg*08CyB3vt1#4+a>6FN&okx(GXxN> zsv%Ri?=8WTM*6gh#LxAXdFwVAx0j5tJ^JsK$Y5d%MoDb6}gyLZY+22+r7} z_RjVG!Cf0^q5T)a*@0w35=GDXWv2EM7ZQDBepS!Q>d>4JUYghHIuI}E?^IK~j zUv^qpqP}IC`7*_4Wp^#p6wfp`+PQ{b3Uf3eO%uyEfqAMzgQQ^*!3|Fn`+|I|#J{p5 z>1+eruFq;zaRZ?}seS3+*1rpd>Rnqpzgt|THq3-_#j88zTY@IPEaA_zL|7_(D6Mbs zrX}W@KwGt)h*=H>=5|b}#$9B0Tr8-Re&8wxQ;O zbp*bQRhG;&iRh{nnQ^`ZqKLHCz^OySO1cb^$-=-2pbIOx4CMIkt2KbK-Zyx_T`Xd5 zcam`j&%pAg@uYv8F9y+aR7b6zZtnUPB*pAi{u7<&pbzwn&M-bYI=&fzUPLY%%F$Z& zrua-B5_c=wS6U9Eq;T6Ep9-0)gGGTS6Xe;%W)~Xz zj@iratU0-Nuc@WU)jGz^u0l&gvG!v(4TS`H-OduN18g!w8nkEx+fJ8lWbQ}Taof^? z;M`<_frKE$gF9EB8U^E`Gc3V$r6o3vBy;C2X@NMT9T+{HkZ6ik>){6vy|J|tC%-b;ap%w2#Feex;(Cv$}Y z#A8zzkf@e3SHUUT8T{$*u2iJBpq^&qy-*%;7A%G!DSOnF;%#;Z$m;@gxHlrLL~F3E z0>(6UvoVzOt94XG-Mv!k$}LZfU-E~!g>5mQ)vX_$`z-?HzBH6Eok9>vyYp8eX~ftx z$VNFm5Q;X%>*v2hOJ1|!6jQv_czfMHJjwv?nOKL&;q`>12XOQ1WJ81{ncv^r$oJ#F zLX4nTi^rtvjPuu_EXSrkP#fS4OK^_6*T%b zZdy#NkN1RK@c?7(oWog?o@Th?v_nREMIv7nea2 z1J56(U}R~^Q}?98_KRL_5A79~N&dyo_D_@z|Dk*;bgtl{dK!CuQvIzfJYQ?qjQd1X zc&KiP@ea?3)>*LW*(7Jk)}|Kh^@R(wXh{$X9(1hChPIR{*uQSN{keR~kA1wD2d>}E zAN)S`JIA;8ha&`mX%P^!?}4wly3Kxg?$E9V0D$ZL4}Ed(0^ze1CVktqqG)@Yo>HSP zWIU5Gj!c~`ELfy-j?fAWMwreDA@^@bbs9dH))gfA@#e3v1wz+Gpz!^Aj&J{BvMmv2 zW@ovp9Wm)#r%wC>4j_{-gjF*Wxy+4I^*A<^+sJh>`Gx<2=6_K(PyWjm<1t!Y$kaVKeM+Ju1@hCbXA|=xS>U(cT&BQd)Axp($@@gx%-m|J|8n|`z=J&Ziahutc&DsDfVyTL9HQ} zuSiCeHGtl$l{M8~^^X721L3o|QaEMO2miP{s~P`V0NKcG4gNGTOx}oryoo#;HXGM4 zu5UBiwnZ;H7KpHdCrGN^U2O`0FrPN;(Cf&!lw$zuE=qu-^Z7}d044oCQ`C>pojSqm zp!1ZLgUTKg<4;3-F`M`Mia~=NMHAH28Y8jO_gG!F?Y+Py${u?qNfU4J~_>d(AnGgdJmo{J< zmneoWT@(3kcYd$dH9V^8h!C+^nq&-Jkf@i?XT-hY#dE{2Q;d82UtAwPx#1OXJKO}* zbfg1T-OxQ$s0XuR*^0R&qaY1&caq|6_{ib`8u zD&g;i8xgr08PQ2NhUkTarA!I>I`ZD)IOLY^G}M&$*^wW@#9;8VR(EV>)>iPTDcUx< z1YS8(-+lU<1~Cad6}rdEBc@Zr``*Ev#Q#7dXf^enz42?*Cles{jNL3r`!7g3#_q^Y0m-HF@_i1wGLLka-3S5`%QWykBm-rlRk zSSAtSbJXz0|JzsFA+zb$reV!h_Qoqa>k;76j!F!G607a_do8&{6_|{ z*sMUSq%;$oF}1MYvgItrhGXwl<&6ggPK8MSiQyL!a7i}Q`{6>$E|CxQmA8J4O^F>D1SjrMT;ggXf ze3?v2K(QMDQLwzMD8NVz9N7lj=E~CWP@nVaU`PyG_Zs)E92V%ZOx5C1xUsVQx=_)Q zM~N#&piOAkRA^mEJ<&qtB0g>AFEnmXO7Nx-;tq>r>0X#!^8uc^X`!R&=tiQ}Y4!pL zphBh@&$|xyInSawkWIc-DzR@kVhfi$a~J^xhwxIqRo^m=k2YlYL;rg{0I;71CGds@ z(cpgLg}T0NlDx25jcZ z%dw&JIV4|lfhU5z(lwZ4k_GN2wgem(GaLwq=pupJ+Q=2>MIdxb3tLCG#ozK(KgjPS z9PQ=Sv4=iAsW#gC{EbioORhiC-gk-~!y!lSNi^dTQwQ!2okaqTX0lwFe5{Ix;aSP& zgZ*;`f=lK3YYC=I#84!Jn;XuNVB+;L3$97SO4#3c&*i?m!u7p)CVok?;XW!Uk z`466o?Iz$uIXqZq8dhvU&uz|^L3UQ~WKafk>;77}^P=Al zeC&3(DtEUB=)HG~(>bq47Jr$QRNK?`#pwZJJ3jqg=L#DJDg1^4XJ=v8E_93bKc0%C zVybe*sYS+ZTtg+$`)sA#i%@}%kQOpx4*Ej924;#Rp69V$DpH0HgX76wmiv|K*s@OxQ2 zR?aqBZf&ghLb8qgol-T`e{%hgrOj4d7Qz4x?60LyHOOnvIcm|wpCU`DyBLsjFU5&S zYyy2B-X;-&cQ&XZ#*%LuV0UmR^U!qvRY13b2bNH8Ju#6K;M|2?w^oR#+YtOR;%IIM z-ofTuW9txjKaW#a5Z?UzH$^j!2LayZ+(mx*xwX-_^jH+rWJ0nvx2qP~MnXJMtgfhz z7O&=!uli{zyr~mX#m#9~&Ls(Xq3or)T#M zTmHlD@Hy`4K)C(mk0CkV_L`Y@zhG{U6*K5jfhE>;CiAn;sPItdCSvTUYT-tr<-5nh zkgvJdRyPliHlL+*Qa83Qpw?NppT~V=AH|kt$K95u-jOX?UYO5Y&#TVN9$rkwtbYY! z><}B_%SnezTcM#{LucoP>h{_WiO3~aDOg*Jw_xt!ITT!f}6g3Xr&z_LMlRj5=B0*|3tLc)8n^4)=>5EXr zKh?HsyJvWA5N5P#^f^DO7TF$xy7=s!=5RCa8z7CmFs#IT|985bwe6ph6;CQD$Z;HM zHom8NXKoYt^)6qH@`zxDHtKs_XHWSZ4W3U%npf%cnIgJ+4P{q6R(K&FW^c z7u%P1ZiL*R({jsR_eUjfF<*A4oqI(DaHZFF@9v(}P42oH04T0l=>q}yZPVtRK?0_8zhDA{6~9xrB|tP_6cDb~orF2v z&Ieu)3{o132cJ*C{RGpiZGMjk4*IBH2b2<|>0_ZqbYajG60u)m6Y8MefoC})>L`Zr zB`fy+t%Iq1i{pji{_BbPFQ?G_89(FtSN5 zN0=eCuh7VD9bskSIY7)z$@9)+{~zO!!=B(o{4B>@n2tcQcJhove~m*gF~m98(O~&T zzqPK?>JR(8a8O;u6)bg4uE-;Ze_@4}5e3&~YObDO&yA4HH)%9K$?C&4G#o<~McREk zYmAGl8ROSgJs+x2`1&vic5K~Mf7ILn=~V(W)$g(a)uxRDrgEk}DTH@MZoL~brWNFO)SqS}QG zrX{Mfs(f}Lihm}YRk~_gs#J$kVFB>bTexIEqW8VBhx1vP5t(pw$+-)A;3OUqjVD{evO!Jy&}&4miGSz1vvQW+0l~5sy^36 z?eSV<97&F@tl4M`(;IgXoN!W-4EU+h8{RVsmnJeNxdPA}6Co z6$z8zNga^dsQ3x%xHcfBOu?G9)GvVD?vAF7=qm^6ufUEJVF20+r@?aCrenTw z+VJMC>H4cJ^RNd$zTzE7gH%&|kt#jb2~_gUV;^u19vVfNXm5n+ zn@Si_?vO<$EZjfXd7G@2nuuw_seo3zK4O+>36?t;HRwS?!kb8%(!PTkv&3m}otsk< zo_VrPun`71Iq@#=bLB^lkf#0;FWJtfztqX#kspH+YGMVlY*6hXpyL`o7-a@>2}H`r zWau9c{Q8J*1@Wbyj+f)Sx{I;t22J6JjN^_G#qfteaWquZY5X(t0WmMTgQE9XCXsZE0+QL3&MWXa0C_k`gs@4Jp7us{n4hX zx!zMGy_1cK^N7jg)hqv8mN~rKW|RAlG0ty)8lp>ksxWI;YNON`X`(PPwr47lUIvUR z&%p?V{{Y{iQ(!AzOeCat-o_Ria?k~K%Sq>}wi%J;HQq2{*|W7>j?J(I) zS1pFZy$S>D94D93+mci2zb+|62cXz(i)&y&=CYGT^%`crtX)!X+{wKhlf8dERdrKN zYemEz4oCH>?XoJHVt%?uLHf*bx*&Gl0R@+Uz< z85SzM0iry0ZpFort|9?Y32MZX!Exp8)528RHnu+iyH%pbp~p$n(IEs{ONA%FswflK zfe2jJvEQ00rg$xvG2n5?m<#N>LYsG`oPcqaBNmwS{=993RV2B4H7Y2yxiYg>=9f{; zLD3_9XWLLx$T62Br16u8bPs}Ay_Q0mN3;^!Z1%AC$tvxQeKa!|ns?wmmR3I@)p8q~ zFlSSE9J&bD=rH@BU3-B3l#b_vO~LtE|Dz=hD1Vii;rZK4-2D|d~ZAw z7L-d34OBIaeYH^~1UY*rad{@`zt*=FICA%8uG7*KGuld=@K_vnV>9)(E_d>>YldN> zkn>XCcxh9;|J#04VSfVNp0ShuRC|%vX(KwojszcLq4wzT?s{NwjG=rFYwR1FP#gno zoFPg1b-C&(%g2s(P<)?Hrxd=f67JqIo_}~s*@H`-TjAdZrF*KuPC4#O$EL*Oo0ydm zG$Mhy*!fp6`FxK=|7Nx>eS1PvQX+XO$@6S_;2s(^Afk2m=r>4y(IKo?awRfDpJ1*v z>^lYe1#P0dzNJtnoG)-}smamzE)Hb5^P=7d&(+E!!`ArcD7Xds?xL39^+x^}!&V%R zLL4_Gz4#^QReTq6!{2_UKW`8(JIF4-kFeQ)?!|(UqS6QNS$Bu?}+DOLT za3skJul)r!25O;!dTQ>oIEb6I`W9L2l2^e`;fX?Z$t!J#T8+0eMou=S>IqfR(sV2K z^^Q&BqSZ#S&vEM>6%KPsL^P?N|H#FbGPs*L=$Pf)=y)&+ zF&o{iu6(~5?QgMI+bZ9*)(+3+_*&ddvKY11W7p`-`9qXu4W&Ucdis!m^r&s{BY%zh zKuM0_e5)V_?zW+86qx36u$85%30nYt@J#*&*J;Xz?(NJziTFo2H^0CgZivgA^VNRw z2<{ncA?B+t+4C&sSTzI^VenfEh=+u;l?~CA8k49kYT18Uyoy#`b9{Cey+4)0&)mrE zmAbcH|G{90oE8tgmhIGqsVPf@<1&zV>nYkfN(AX+Jiv4o!QJX>qtw{#Z-bMhu*l?t z_iqkkH^e-JucN;YzdJH|h9*R>9tGeIO6JTPm_>hEoqO{qDz5vmIch28tJ<6}Dou#2 z{zwHX>4QkpBd!y7_+2;IS5Hrqs7y>Io+2>&i!}R()4SZIsqIy>EdkU|GeR*%R{zgm z#0Zie>Dw`B7M&?0!j|HJbhSaoVSigg1IvGxH&GAIsJxx)N*Rm<{*j6odd?Wu1P;kz z4ZhcQTHF~wrZ(@e*+R8^3=KUE011Ee6_0__2b_+_7VP!9otS3Oobo1S>>52Af-@E6YDZD|K*Q-J{`#x{@8BOM zdnHDNiOq7|Zv?008mi-5n$loE&WRNA(E;P&+U|D*jq1h#FljWZMXRAHLwIw+qR4TEk#@G z&i7{sT7ZWQMtPm6{qiY+F`VBL{bIV*E5IUr6{Mv-lZgLuBtL^xV+c)@rJRJN{bQEV zsv74t!VkvWeN1+C2(C#=(Q8XP2s5u0q(kOk7hbC!M^6db4W7^BAC`gQlJdhWs%uB) zJNSl)-M9eRt-&F!ReFm>5fd?{V|c`#-+r0*&A0KL)b>%3JpwVdMU2#O+>AbOLhrD| zNGWTA0J$xQU*?J{y&LK(Hyyr=M`K=N6jZ?iWv!~NMtDL{1ctDNFomM{2s8?J;G}(y zpkD0>5VPvL0-GX_-u?WR3e$@?$5WB zo!E(X+?s_sQ&GGw^j(=j?_8Ebnm+iks0#2R$o=C_dLnw4LBpgYIBcI~L!40;#_Wn0 z-U9?TYwf4!tdZ`?R%#RSAv1|YIO5tw`)J`}Evs2G=%5CPV6g%a#NEd`ByJS_j7|91 z@GXDjrYOf^d7?di7-m~DW7jhePa=T=??|lvR3e~H=!6?!XwR&GR@^x;yBzhPUxyO0 zjeBf=esYKYj@iHjTs=%sM~#bGls-RmF*|w&R^>|kr8VqQq0nMrRAS~g}C=fB} z*wXFo7cGnDRYJNvnSDsuBF7a?r+=T|${n}2shF-N^7Cg0jfVhE^ya)4a}>THDFHl3 zVqieWtZtxnonsGY>Yv~rmz5}1*6`#xor!Jf@S zd)tR2l#_j6%hPO10o@&}6ZH_Buyh`_&u%sy3oCcjDoZC7&7n7s_>7s|SxPk}nZ_jYaJ?Fw?e$a9ZZo#yVB%+iQz8k=tKWhR^f zk9`;*AWgBxFF!9zlPlEax0t&!{&=IpcOMy0P#XQ)SRraDy&{MUlDVm|NY#X#8wbti zdOjA@pumCT2_eSj=xM)iR~w}E8Y&Qt!0A%%|GJihuBCX~vgc$p=P~xrG)^+=q+<0v z+F!7n->QfqJH075_YVYZGe>;eBb53?nNQW4rU^8rg;sdx27&sDIq{eE*Of;&)n&o_ ziCP2IvF`+_#@HPhUp#j%zT0=yU4(mQ6(bJTy2laHq%EpodwA1_>wcI%bD244@Pp09 z4|mipjM|{2%EYy${24}0y5Wsgs-^JUD8;E$zc9xxFEQ_J#^6obC^ib&Uq?;-ZYdz0 zKwuQ}^1E~$RHfkv({Ez=N>RmZibHb!`x!Lkaw(+0pp6fUdtxkJb9;JTOVIWx+4rE3 z+~J>6qU(aqCZkfXkiK6!cb`tU)9I?Wg`waUkpebLYcQvpMroWbrYIK{_w!SLG>13H zr2xZ69e1|2w&35K24Qn`$H#BoB~)JF?`NG~yk>0>akElmjfD6;`(PE zB+{~E61s<{%#-&L$SIYTLuB$^d>Gu7$nSU9lH>Qf{@HM+Xrx2>iW6(c3;NS#c8Z#E zZP$)LzjE{NTLXxCWn(gqB4kKtpj2FpRIK{~3hT?Hx+G8Pp;OxSmeBZy<-LNeznkAq zq#DBzod>>fDMfai_NniK^jE-7lFhBjNx|@1;Mh!1TA@wz%~pPG1~-&a1$fBiPXir#+9vdQ=^)t0PcKJ*gR~WkNMx!}-|&Z1`z8)e z_0O!N>$(#V>V26d@laRSY ziXUYkmz`M%@PJKO#ReL3SZ4+=LVR-P15oiYyb0l5jEXTeRe4-2|&ZV03=U*8JgJ@vC?n^8=1Fyj}x=zlrM?B-$4@AJz55sa+-%2;i9u*V( zr7EPlavs%SsL{h62$)PqDuOt$u7^QX{=KUjbN@`t_@AhkupDfAaiH<(nZ4G~Uu;R& z6|@WL_fN+mU>L@7ng_7D1u=Cu#MOq1=@x8UZgOw*x>9$zlh;KQLf-Q#l!G`K;+6#T z`#KK$}QbkVpY<%asiVt<)N(lIcbgyEsgcXMKSQc-88<=H$pUttXHHRbkLBz6WE z$FFHy)0q(JpEw{jpRwz1$y(@Q;_vOOrihER*6=K;Al6ab1uehX=p>QuVW*CMJ@e)- z$pL@9a+w)Rzv03kFm5YsLygKiawCxB^<~k38D*M%35me{b@nMUbqKzXKKddAb^lN9 z%MBv>AJl}2j4nf@E8V|QRrDDYi^CA1=~B^b5+`Qq@359-_= z4J!(gSC=XN$b(AH>5xh>NVwW6pbSdQZeW(MYZD$QE6 zK=HEVFRk@IiYw}2j-qbA0{pt_t}lY+V$!tMvrExUpJZu$;)s-8k~2*)1l^`dug)N-c!|D<#E3ZO` ztfUx__|M8qr)>|?mgn#n*XMqP)Y(;8Gjmrx6kT30Y(*Q}UsSz4*45CJcB^rO05`@e z)R^c-#C+N#+SyoFx>uw5O!WTU3gqW1rbcnU zEY+v2zi$7l!T9RHA9+e^EFnR<~AJAnI1 zs$XP7qk&V;>)$ib+O~935CPsUVX;rV_TjC8ex2=pJr$Lhso1^Wf_WTR9NdThD>b(v z|L&x|Flx|9N^rktuL5S`?B|=*28#w#>$|R$ziC5?=10IOWKGA92muQ4;qjA}t&2T( zcl#_-HlI3!xO$=ti9`YaMkbNU5WwN=wlX1w3O5(T!l^-jCgH-rzlB&w58s_ z$as%FV84TIQ<*;>v3lyt20bK!jv<+M%E(E>s~4=(+E{@Brw74(W5&{~F${-$D7Fx; z6OrhuWr9lAedTcdhk4+&P(e=5Z-v$xX0G9r377=q)mde#^e6DOdAA6ppYbnWsS+Fn zww7ui#G;Rr` z5D@Ye=#)wPj+`dtDS{a%3r!?NKQJ8!lmmN0x#K0}*JcJ==rCY28ZG9NZpD&>7m|U} z3tm+3PxI9ISpd0sxl_4Q8dVL)D#Pe!k8={#N=fq~f{I&)LtMqazOy!&g{vozh&kwL z38F9XAnCt1-Vo!_(!Y0(;m1`eJ>og{akAlUz~gTZq;NOgo%}aT&(do)C2e}DOwIO= zQ2KtySyqx3F-nj&S5W3Iu=WV*l{z3&mOOQP*yZ*6ghbLW`(-BDMzAI7aap|`tiXsb zT?Ji=LKI75Wwat0>8riv(azBRcF4GHJvGt$5!} zm|(08m^IC&@7?fDOim=pq>yb2`l}tgpo(>g$fOE&4Qu1_-j!({~Gszk*&MHc(V_DQRJ{#ty zv~z6YuYq!kQ_Ql}V(hCw1^$7dy(WM#2@GHeju=qI%aAr-Fm{ue4P_;NSiti6$8}-3 z&fZzvtA3WCG@3QNiYaN!N-t@bWdEX098U0$@>~FhyndN>qMMftX9T`WmnwyHkU~~o zCT*D?FUHW# z&Jl`=ljkSsTvxO*hQd)UEYNF!gfElq7vApz**%O{R9^Q0hCLi%3>9V!%^rg*lk4s645&)uaq};0t<`;K zc&}K4O`^J6inGa-O+;lIWLAZfe0>)!1^9c-0>b!oI)v@_Zne~OWq7jJ)V~@f1&a_M z*K));Zx9%9g2a^(4P|1Z>zS9-TRC@cgvh(#>|=ipR{E#Y4hzg(jpy4QW~)X+Aj=oP zAyLk5Krk#)@r)B|Ux+;3R%ya(_ct`72ewLlV`^5~Eh{=^PI_k!VU?9Zx1E14NG3aD z4Rier|2?5%1?k)v{j<;<#0c)n99j)Wd}h^`S=HLE=tTMNKC)06im&F`oalqT+8i8=O6B&%9b7`74RZVHV_hY5Zw?Setr%w-$I1VW?G zvk=}4usi#HxOg(@(e>gw+``GT8`}01DUG0kQG>%zcVDotNciL+T6&dP?ZW*r5DXUZ;DW zkuKXk1^24`Maw}zxli=n!zft|dKy44>F^!3Ch&5@y$UW`;}Ic~LhD=fi0`HI|V4o_ArPR=>UyW&gC0^{-?asI48z%+P0y zotLQFXV}WU2b}`7;+$IS80Xe1=$l529?-95(+Jx>u}cSr2@nPur-YuNUFt0`{0S^p zhhh5@k#qe9~rpmpLFm(?xvu4e%RW%)TEa3HHu5jW!a^qk`g!9i6s(&@g`8DsZ?n%#JwuZrL%cGnD} z*(7x5JSrWiMGX3(+HOyNi-C^ryG;_|4Xr$#AD>-s_2cmbiw=2TXNSjFNS&`BR~ml9 zmgg_5@Zbk+yb6K(O1U9)ge1x%159Yv|Mdl+@DNs_5Qf#I;%?l!J`L4`@cDzlSxb*W zv4mEGmiz8j{Ovgo46~(+_1<m6E&wAD*;`0S1SnD1@zgCe_R&?+Yrj$D zCIrsr*!Bp#+>LT=)*8HJu)dZ_*h^x5Sp545)=GF%ml-J)TagF9ooVTQznp2N%0D+$ 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�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 literal 0 HcmV?d00001 diff --git a/images/colored-line-number.png b/images/colored-line-number.png new file mode 100644 index 0000000000000000000000000000000000000000..4de85d610b6eba822ae4c6726fff8a584ef37c8b GIT binary patch literal 60400 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 literal 0 HcmV?d00001 diff --git a/images/demo.gif b/images/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9fccbf5921cb3c677fe2d2239fdeb4fdf12c0ed GIT binary patch literal 317958 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 n`A$>a z!?fo4B2qY&gH2x;N7NB`bh^N6Vai9>H1pdKneADorF zCj3iXizKVfSdAUUD#Oh zhO>s6MmAyts zv&+9^pFQ+bGD=kAu{nitlM=)^f%4XDZTmnWM}24R%>0bmA@9O6oUhAH|37{dvq~vX z@}EMXcRSvZ4|DmHJk7A;B;Bl8k$w?8hI1xa-=8k4xbmL_8Vn_n;IGo9q*$Ia_0c;u z3P=7i&uRzizlMV!zW6i+(YA9?Nzg(ct-Qr1mX=Lmk2o@Cc0)2a1B{5^=Z>WV@p;SK zKz_cGKeajQqOXf+{fG>JPavJjlJrH7h~rL?LZ(Y@WWzq$0c~)eyOgY3#o5ekpcF`>=U1 z1?lZ{kx_hnjN+IthCB856#P4UUq=xKsR$}rj&T%th#!OSgI$*50LHhD6suQZj<29f9`uTE>Lks%B#BR+p4ir~IvE4nvSGJ>_;X~h3?b72?bie4jtQG1H63gL2 zIaGCLi&Br@+)0)Q5#5oeftQL4$bJHCqCoexOCsedb@*N*g<0TA*`Dc(J-Eh2GYAIC zWouA_Y$KS3BAy*+#s?6+E3EngQeMh+|1A9m)s%_J)gi1hd;-Ej=IvC^C=R}^Z%{#n zgfF~D=TqAlpKBQS4VFaBKZgQg+*(S^?lB0MkeuGyIcSVd(ZsPiCbLKwuCEhd7fw6W zOVB9YuTA!;`i;8dpj?qHJ_w}T{IHa z7no;$rJ?aUr8R^iU}RNEkkAm!!7(soBQv40iH%&W0Zt>;TI?AMPmnu3iN_BXZOSpv zE4p>HRj*&*ynLY8Dz(hK<4*qOrYkdC|2GWw>0syGe1nE3Jd$+m{nlSz4^+fYDYuu> z6ib&j0JQv_N(&P1z`Q*(4C{nZ2`DG(RF}{1MTmkj4iFg0PSb}>G{%bEvx`}~t?iLb z1;vL~>K~YqX3j=*3MhB`pTM_^3Kx;yU};O#-o|Fs{LeJQ{J$Qbxb^}5eSBfYglr_4 ztKP|GKslO=q>eTo{3vPEWtEpHMcGJ2n)=tv>nWu6{mw*-x$aNfEi7zz566*?j4s?dz$Eec1|% zrkdzHSyhopXTaJYFwc7wV%dy6!6podP*ZvXSxcSOp{ z2eoh+2!W>E5}pxACl@68lUI~7JLcf}6EoM%-(Suwz+72M5x-iOl+WNmJHIUZ3?x%d zX-%I{{^!9Cdkv}zt4zI0-6ij#D38#Wf9 z$QVpFsWBAW9C3ulKGw%T`IOuWFxG{xf^9Cznuh4TOdbHcNsV)A;=w70cmTQbCk({@ zTgE-3le(Sf%#N2IgOFqP;a78VTE4g}_&z7ysMzUU4zaHsa#|L?eK2hYKcw(?F=)+eQ zkp5Xq9;?@zbQDg7)li_PK$+~8oDT7ux6PUxVjftR6Zo?^i8jByY)4}1*+uB%Ad@!8Yliq^Im4l4B4EQzi5Gp8=X9$kr zBuVv^%Vo&!-Gd#Tx1BhU_46-zi(XnOhzDKfZ@o;j_PS?LkhRp-h6NyQsl1XiL%vLq zp1|0pRrXN#yoyq+G16?(I9}ZYKKVA!$K}LMxMGdn9x`;^V$$$>rK}j) za;nh3wx6!_(@V9qw0z`!-A1}?{jA(?pBNJ{Xi+LcwTqG6%+F4WCP-A_*{sygL8qjc zB%~k+UUlWk2w!@m{|9Q6zIO6F>9%jl?8UR{IEzvWrb%Dh6Tq*Gw_T^6OVOXfiu=i( zupgzyZ#kG-wmMh+KC54B*0L_L=HZnk_%D^}b{A3YmatR`wu_;Ip0}8&d?xZ$3M(;= zESb(^^d$O2Qv6v$#)aXM3q6txJp%YTrsBxMj#N7Bb3CNsgDqTOXf1}8lwGX6j3&og z4f0Udyi3WR>MZ&hJ03jdK+Sb=muSqL_Q*`MaG4p`Khw&(dqpK4RMg8f-^D>+6k)IP zR8o4iUV?%)Iv$-RSisaTUD5sc9~Csf)UWLsd^$a-J;_663N@x<8#XZ^)*STY-cjoz zy`tgGVVAV}d8meTXg#1^KY!1T2W_WQG~!KCTIw8z43DMi7eCa`gTj7H=q|^eRTKw{ zDR@rLX6YbY-iy_0u3*OEu|k}C9JEHPHTdyD3EIQ~gb!bIi5cpDX>rn8q*ToyXEW|{ ztKqULQ^xp~!UL3r_Y{>l-RMx2c@cJr z(4`@|SZf8S5Kwd!24jdX&m@REy=eFQtDYkVy@1qKNDF?)LM#ET0fxHP6J*UtmyLGu zsFO%JU!uL%^zO)*|uwv{s5vSQnjYPZ~ss}w^)56o z_DqxU28LAPP7t20)H#T4R(i1y=&DV8$L=S6iODX+V%=V>eXSQM@bYQ)0u^C6RVdfG zJ!+;~rfE>NDcDb=-oSCf&SQkCIjv93k(xP7ZvhS4&C`i1d{X@-XX7a(@2R!F45G^* zjp!TSX~rd%*{7v#srYE_OE)|oRGjIjzEn{z)cv1Mu^~OA;k8B_eqe&7r`@CN;XYrg&1o9paU*`is_Wdqul-Wq@iu4-+iN zrxd>J;lT_g|7PFc(bh&$7ZzT8n+1cEP^Lh@zk9vLEHt4jWEy%>Ft8R*Rq$$lzjOQZ~_l_{QF8xDZk zBIz#9{(CaA6h_ig=cI7)QJf4TQ6vKa;PrpYjgrHX!j~veEs84qP!{=57~#+X&F7E^ z2Inq-=81r=8)=1~k;6sF&NnjDIH0uz$QA%im4VmOAe#v=xo1%hMfI4zR-6QH4(g?H zP>B+~ANqe#IM7-V=|gi;_SQhsJo&Z0USKo)Ng`GTL|5_=P^1l70o+<*@k7;$qk~8N~Q3snB_Tb;rCDzkt_t8ZBf0Fhx_#5z zPNlbt&TP*!j;A%$WsIK1D^Xt_Wbe@(+GE)6YKRzWPVXq$2|cmx8{pY|q8KQ>kP4%M z+Lk3MZT5y^hC_C|Ew8<%=@dr|0rWbZI49A13#!|)j$Q6iqKizA`ftih=}?cG((*ic zI@Vp}*>DDA<0}Fiz1O7bBk!Ju5}Hkh;%EAvoS5gGeJE3A`VlHcMzMLAA3VKxhC{wQ z*J(z`n|Kdjkjt+%Xu9l-kdqa=ct3ULz3QEX*9#0Mc~=I21J$XJ>{y!(t;M6=<5~{> z;*^fka$5_t=77VD)(A@%w+z$eF?3+e?&F-SRw$@Ti!hBEWjof?6UfY5K} z@{FpwyC{(tFaMqwg&3Sk6~hIcV51MU5vZ->2TrbwyHqcnFQwG{c9;s6F|40h1n<)6 z0`Oc{ug7BTtj@a0Z>D?JQJhQenx628zplAkVMI^W9&liIGjm^=#32?+S&VZ5!7{-W zTAyzuhmbdwLK5_^dp5J)=0Q9_WSc2NU#Ocv?EHFDU@+Zc-B*2|c9Vct^f{pG2ffCj zxvo@(N&xOS0FYae6`tS|)cLNK>oA8RS6PwX|$3f(|Pc0QsH;EJdEJhVXiL~G{bWOgXDr#*;A7ijiJ+PGdR6P` zS8zYYY`Ny___$k#Td#by%OPdnFBeE*uD3>wY`1Nm&>m&Uc2yb|5{$xBt(lk zOf#9d{m;{LHi^&St`^+tGO)de}Db5U9V4~ zy!MZd2(CHIgGZFJ6YndL#Xl)d3awj`J7~LHUvJ|W16vFFu3jIb`Vo@I(<((^g$h8; z5nL-i@;XWN2!+tmoQ8G+8_)rE#Xpr2?11?2$7ar-Lkv3(E*q}b!pD2c(fMMVKoGP> zh6cy1%}OxProRLBg9_&(g-hL>g!?}Z`cnik=;9n-{Ue{Ny zbwPaq5v3CKMlOt~nEB|=>;l_E=wGVVuiwF@T!$2?DIzpl3~QJ2c_ge*SB88-Pz-Gl*k z=N&ifCW~aq8Yi5CJeMMoZJeZIHt`j#33?gN$$E3Bnxpa{7jpT}y#b(znR#+d?7&!7 zr0f*gpj_vt7?ah0?8*L&BjSv?{V*ni{Fb4&^yliNqX>fO9|i?RG>4VbwIA0Z*k zHldf*^={20%EbcVYxW?Z;^cuE6RGt})R*o8%g1zA?jl^~wI+V$F8%|ue5Ln+p{v3N zRuuzljCJEl%mC;^mEJKAdbT+BrP@5&QYV3V4{q)f`kP1osh=_-^14oi8*t#M^CWYC zFd)Vn@UuY%F?XXj9c%LqF)T!|{x>;3)CNJKR5r|iM_w7sFV?s_m}Z}m&nzjiOW^j) z_C#;?4djijZPc|4Gfr%+19Pmj%}vNuVqy`33bF`3xn6`X74l@^SfT@Lo6pKPvAay507iHB!(CeDI)6j3oR>(sl_GlVcE7EqL#$qHWa*6dPsl6}(f zK|zBCSAR^n$JTgT((clhNf$wlazv8nN*!dc>k>T{Z536?P|GL&HKuOwp|uf)vHH0U ztl@G*mD#=JJY8Ti+hKTuaK1r&cJn~K>5j;m{HbAt(O7kmV>47=_l8>ZjuGR@n@>hz zhhr|4pIbXyIfT5wd*rifP-^^wJ}xM8muX=cj2Jsva4cSl1x$E3Tj1? zu@Zwo0o*ubIX%fKpYevuO+7d^$d;1MnuC7fQ^N=3gtGKhAHs@fH$nR-+LsaZ}Z-_=Bptl??Vh$7?J zu&XeQf4s+E;$0KIF#q>xsJ+~I|E}@{U(0XN87Sjf5!5~@1ibn43xb~)w(edLDK^?b zM=~D>$9tZ3?KjXKrU=rr9a~(vieQtPXYu3^d?0~?za}c$^cHjhliY0sl&J1V7w6I3 z028w{v1UU&j$p9hJS_h^@b}bp7Bb#pxj`H6SGoD;8yPg(cCw?C%ZH4$XtjXn!m{=8 zsd6v^7;26iq?I2ae%Q3pT8s_n@WDnB4Mk%>6mkir8_8{;;}HlqCkYho#(_6wk8Vom zLx^oMz>hlOdMg%2N)>~1-A0}3L3s@n5%Oa;!bA22e|*hQ_uK5K7l)7sCyG^N(jqsI zvH;x0*M7HLWZNTxs2C}ZBjM=g54IJ)PIh`gVIz#52tm#6y z{rrOW`P{0RDx$;jboiFLq19u<3YK3Pe7e6K96&9!_yTd=^*1*mSQ%X@-2F%JAV8MF|_YTDCeosbhnvE@`g61JP zVFeZ+`60gR@p@~?1^BxiAlOe}gZ%Fp!ler^f5_)c6>1+3es) zbhZDeMTT6lhvu9Nw$_O7`lwuSkhEPllj{dj;HVkPt>h3M0Des`4{eA;Ztmv;pXp`$ zXCSAqLKPdBx3pDkkjb44khJ`X0ddFEP! zY`^Y!owZqn-E0qE)!{MX>THqI3NQaPa31FDJ7_r>8&+!atYd|v7_*mxP=Q_--w-@e z1nJ13Wr*tMTMY1TZdt}ayk30T(&n#UO0Hg~0DDAmyH`g_500tn-R!x9qRIuE?%K6h zK~rtYIRJ*+R`qQ|^fvCx|JQg@sl_n7*k9Z`q)ZYCy+!Y_cjNkQ`=1^43ab<#d32Rq zXZJaNnJP8x5*z$M7VC{ES9G?-LLt_2Y@xDJ%6k0W|Ad7)=4?o5{uJWAti!2?0}+*7 zFn}Dpi0GKAIOZ~lS`KYRp(~3M+6Qro9asMEjZ(?_Wtz5pzUd1btyE?jZS=UaA;G?J ziV0C8dD|&8GEBBWeP<@Z{?@Sh^#nu9_`@%Eer}-|_UVUBNb_qD#`xRZ`AyFKk{#G0 zq02UbhO~c}JPAFCUT!857h$-$qXaD~zj$}~Rmot|RGS3a% zR_2!I{1Q^)43m11al*3e1C&K&5{s30`@6;aR*1y~PRTtAC+g$?3E>bm1vN-LVG*@V zac|-aJE3npe5p|P72p)k<>J`uml;<)m6MqH;3o|-pn)bsrQRw4J%vHWmrgidh#8I8k*(~Zh9i?wPq{6#B8T}(DBjQ!g{5H}gYGEy9$jY}|7N|E1)Ac+#%`a8e%lNl{N9^M04r)}9)H4b zFpSIDkois9lOd|wwp<+LfjQ?XPr)0bu2C>(=iRGQ@Hf31VB_Zfs&$7k&k?ztG&7DN zEg|u72IX(SWi1@pvLiV(EBP@2{w7_oA_Fx#ufLMvI(*#~F^E00!$sk~^5yC%7|&V? zR($2KXDBX>2c=2OFhXRnJQeSPaH=^lE8a4&=rp2?X7*6dhkzBXupdwPToA&M#%xnR zGRw)r_+&`fxFcNK=gk0Ys2~btYMAKFBETgwbb)D3Kt8U!5=Q5Gxf(*O^qfFvEI<+t6TlCF?tWnTx%*Jz$gE3P*!n+K%VQA%Bm0s!JiGTpad0 zUe3iXNh2oOY&0mKJ#1{{Fq`$gTp3X9{sQPqLoxRwzf%-3?p9mHK_{+2G)4{tCl9yb6rZ!ies(LFaKQ_YKu)kQ*R;v)UKaz?gl$rd5 z1yy3`6rxXTIt#+R;NgZTMmwC;W3KG>?NOt|sXt@GHzh$?VoY<3f>FdB--MrK8*EO3 z#Mt5&WEWmk;!f`JyuXbbMbKWA;d()U3GIRz7sBF}PU>%T7L3`Kj3irCTI;>TSMS0k ziOn?a!Rlk3jU~896KGHdnD2vaF~#TZvXnB+qnh>KZ*w{M(s_c1WU{?8LofdMJd@5R zZRe!^kRORUDYUr)JHp0&kX^{V)!jgG+Tnwe@NhRbb#kWm5AZI(?FEFDX@eg+ZH+w_b@td^goKTmcz)zH0Xt4X9}%V693b!)C?`Mk6cB`_l|=)gjvv?m z^pQY}doGT4Y-Xz%XMO`>Z2vsD-pPAltYNPkv7r5-$9Ni>Sc9u3R*3T!bRzk+$)i z76{%=4Ib^;dt#sW&Co9Iu*DCob(s>%ydrUvU$8!B`mzo|PHSP$Jh;%LWu8xQWQifS zDA-1=OHm!Ddk!@l@!VsT_y-?!nm(X~Yf345aV^eWFW8ocs+~V)Kq?+w4{5{C$W4r^ zj?DEQ`7FczFzno;jtxC(yTw*n)}Yxj0>o^t(F#!7eFp1y0!jt-Zcuuwj`Zie%qe{i zmOk&ivI#%K)tIfzJv*xmY~vgc zKT0j`rIy7hvfaE??Mp#}n8F4NTk!_O^F-fk3jTe@z&ID>N`W9^t$w}jd{K#=VRvqP z%@+=0p2_a5l;E1*8XF>AtG%Fm>V>DTx-N>bi}KEprDH*yt9~KHTQ_(8HH6vDxe8rD zFNgG_R&b+dbV+Bxt-R9P-&`~F@j+|(YO!E{qWRd^)%;4n*W$%y@Xcc-`LQ6=gyr3j zxf->3`&XV{$k{X!5&$WZB+scpjO7l^Q-d#A*n>B~OeZ0+6lpH)_09sTMqtLp%wtFU zZb{)x=fMd&bQ6LxD=z-14fUSCdkn34zW=^+D?Rs1XM8CxYs8V+Q;>AyuAj3}14R{@ zDlYg)-cs7v3hF(l%CzNdK$s3*3tVPR2<%8tO0z*{=3bZQ{d;=~_igVR)Isifx z;`7ANTr*=VA!rSB>LVAcU+iPqr}(>~M$G)Wr}1qBFr*lKVreU+3VND=U!vejC{S~` zlEQ8c1EHrWO7j#1Neo~s;oNKZhcY-X9?)PTuJZ6pG)!R+5*!lXB2w0s!^18@oOobH zh|0ll;A$FfNsJRoCmup~8p*A&Qb;5F}3kVT(-r6;xaOa=Sfxf1n%>%go_mV;2`|G98)5PIQ4*Es{rmY)E7<*feZOx z2-rUQ%(5I4%E4GY!pCtSu3U&Z4LdExzZ5|&*q}q~sXN0E#bR6;d;r_Mn-dWofR9qifudLX za0fZa@$*kzWm}BtFB@stj>|6}N?$riIcL8rE}-GpUd@aWFvoZsz!t(3Q3PvZPmY3+ zyJ)yiAf-+o%%eFML5JOy$zE0>vFuABzVMCr=ZBcc$>5jUv7e;)97=7< zFknN&IF~(jz5F!uUsb9+?l@O50Ry+Sx&Sjpp6|JIU7y&6<}EX>RM0ODa!_vc%vdgJ zkd4&z1qb&a1}W%ZiY}A5sfCTXMnRW}P`|$3FOG$%$&oFzD-sc=PL8Cxje0_ksD3=S z!Z5U=B=$*1t2_`#!!a3@dHNMdtZbPTg6@mmSX@qrxJs8Rx-nO)h-zN|JsRvN9aC`( zbwqwuSVezv{aUxI=N1j^N-MMhRt$`g+cPYqY79&X&;mB*U>02CjL-^H9?3@Dk}tQ= z(6QWHO^8vQ{8Jgl`kEZ+%7Oe{ZQ-Yn9G<*-OQd_@JYXz4n)Ummrs!RM6U?&M0BeAd zP_V42QMbtJY5|)_x4|pN3{@?#W07o`4-myh`W_wV6UK5pC2;VmiC3D_kQm;@jv=ms+hDE?m!Fs;AXMb4vjL0 z{Y3a5*RQdWdxX{}rj}X2`#K8pU$m{02=U7LV{Ikujllpo<7V1DF?gb`T_dt$M>U`bPeU=L>>9ht)F6&P`;6v)=F5`jf)2cO@95*c+T(j?*->sAUk!x z6jTn_1LbWmzxiT5$0`my&wJhUADY3)OU?h9brkHYQkO7Wsa&|*@qwyt#F29r4B63K z?E6}d?HyHB2Pxd!=Cto0;;ent`gF)nI`Zq*@7<#RNO8(;lx3Fkm$bh}TRCYNoA|z$ zFcnYrd{v{F5!X7)R6X?Ci0R8{NZ zN@w`xDZ^;Qp7*hyg5eP&HFYlA$b4rnr+by6UlkjV)osat)phV&dk?2|YigfWC*)Ki z&b==A6}J6hwX%VhLr%hqatn$mVCrL80cTe(suONQ?2-+LAl9o+lvw7yU+5 ziYVwb$#DfA%GWJ-O;WY+rvYu~>WBjE^y{aY_&+8kFvKmV1(|@Jh$?F2X89TA6CKtO zFlY(o9XU7s@H~KJN*P5uakDFMRb3Yfl+5XnKvfO0L5k%LAOkqb8U*CyjwFclwl9nq z>3C$)_<5Q+FHFf!<<$AYiiApjzJ-+-1csA*^Umb{7>AXrBslQ%5mYt+QA-9b6sfb< z#_};#7ZF%Fj3@KCMI?bBfr$IWr_|ik!F+8nj)5R?dMIExMa(E7rz|7w@VXtGryJX2 z>0xk_;LDsD-R*2Zs1^0=od8=(1d9In_p2~py>Y3}NAEcIYJoc5H?JY15{QR-YoBE7 z@bz93fsr&ZAC+Q7lT3x|jhLSf+kwln$5>W6KESc+4?YWbz9r++T@^;RNaysY#u%3l z9zO_?#fVU`?m5KP3X}1`SQgA+3i7$%L^rBS*!))o<;f{N)pe{FtW)mmJPlcjo);i# z(a#>Ky}tGjC?}w2Cqgs-{AqCM(eELCc?XR3W6{}ae6~&sZ(fG|{V1$JorIM5P~zq~ zOpkik%Y1e_x2Qv5>P=7c0)L(^((z#?$F^cYZ?5?096SHRFnW90u857}XKJ49QOg8@ z+lg~sbpmM0F925U`Vu?ca~|4qsWHP!wkJrtX%+crQtEtIU?l#mWQ4NNQexgOWE74h znzv$I)_IWfXE&(vh)?a5xD!^#q`YR>4181dcf+qAFZY-( zWNR9}loY-^xMQMKy|iDF^;gnkcXQ3nFB$*-^2>WF4-M+D(WIgxD%mg%p8ncn+OCPW!*%%m?3YANx zbhWtP9I!x$-PN<{uUFmZZEW==Hp$xsM1$+xH2B!h-ZC=5EQAb4t0j)!R+*PWw+_4p z9onId!z!186ZF3?Bkv&e>*qI(m;N6_Z_K5+?K-(%Qc$0Sy6sa*9oqj(rHhaVcxpAc+t(twNc$bcS-MiuL%r_Nx^Eno% zn~+zI{8RQX1O}IqAt1p4OjM3vUV?bYJ#IfNemE8_)qH3-5p0q9P^_NP!uWO{jv8&Rmo&9{om;eyKZ0f zG%+%%*amv7RNC`w&%Wm7F$UKBa6ilh+EMG;-=wtXMucIb3Z5liOcWC6E(4Q6r^?Qw z|G2QpzUhbF-KS@7era-8{y`a4!&4}Eoj7gvt#FcIn~u7cKojVa z!NeF6SZU!eyv-g6hA!m6zyLmb*wa5?Rd`01UbuY@z>mwwsB&{ zUQBb+Q{NQWuS^}UcOITDQAWr0-RRD|)HuD)^=bFEB6)4Sb85xEGzj~sY>YGtyKaEy z%n3-R>cKY2kuDT|o)WV=DE#MvQb)VXs?##49wolTAj!Ml;l;4E$$Ui~Hprn}blY&o z*5}sT67xzOSeNbXK3Ih$3pY+PELm4u>VH<0QXlNK4F4+pn6ulY_1{d&?@>zp;5){d z%j17+jjr6%3mB6PR1-V)6BRLYuB?@u%4XcK{JCgnU$~3)#qgvo1G}+5{uws*s8ar_QsPnv{kLl~h@t_Sg)*1H+5_1F z;L`ER9DSpsW+%vMh8D!(4b!-DaP~dS&6#V}s(YipM=-8&gZib)&ZfnjuOHSMF>$5l68;}iX_K<_xb(-uV41s?Ygel^Ljk) zciZCqGlT(1&X3rWQhMOgt5qq`BF-4sqWqq$gnC4la(ZxO$`MOG{5>y^B?tsfgk-ZDSwS9_96CySl)3iS$@3EYhg} zvbXLdd)JN+-}adiB*Ry%&gL%Jo=y`7*_-3tZXys>cH+aS&vSYN5Veb@681?8&?=Dv zj|ZP~m(DA}-*&2urp;reZSikvb#C0uIQOZBZ*`ICP-1KI;?j+D=C$j&w>B<0e9*J` z_u%@5hU$3Pb+F8Bmgwy$Dm}(vC@>v$_xBY_MJZa!yeze=`l;I1hoK1&J5W^l1AT|t zb<+e!>uI1Ywm}7?s2+kV2~8-Rd$2>uvWo92KHA=knk#MnDX&LD6u860$TA9PWd=XN zK^}BbVqyL)!a;~>>mvq=UiospIBy)Qn|tNkuTsfFrsHWnSa(RkdP#1sNN#Y6O@T-r zy9h&qh=SK_mOs~L0TR}S>S$~$*=&GZKzL|a2BDQYG4`acg1qknd~)y@k<>j=9e-=W zjjJ6?L~-Y#U}mW@hT${|eV@nBzr4n zxdyiy2QSo3SPxPOLE{LZf|WNgGH@RZYKJEYx)8gz|C|0vrdN(6zZ`GEyC=OG%DUvj z_(L8e+LXGxCx2jVQX5#cg2O@vxLflBd-_&z=8mx<((ey(D%o z_v6l*&eN%)JEuMF(UfkSH@tPWvqpTfkQQuPvU(rlKQvGBxH099$-H-#Z`%;Fvu8qQ zf8LD_Lw3!GL!0f5q3NsqPzuw+9Y2jOD>!{c6mlTC^2Wr@?pOD#GCiw_p3Az|pmSPu zR$*f<>u5t0HX@G1G{aoeoWM&H0V*I8jA0Udw&=^C&1q8B{}YQGyU&Ij598jwY(1osj@FWFpb)|( z9~`_fxjIIi8C{*SS!f+Fhl^W$ySwkJnSObhjBbMKhxML z`H@~J9G#|iq4~y?rOT9Emftr4e#%95TGexU>{9>EzasA63Nt2scL&@}7-w9@UeS)O zb^JR3!x`Oho--4nLFd z4aECj@vWN4a5?Sj7xb+$C|+wOM=LPo`*=>#bGzhcc}64ISAy~_4f5>4=!C-dUf7dD zWOnScj4E=7xPQ9K^ECTs^w`+~con_MuEgkBDUxBot(k@q8J;BN+zgKSTUz%0`M!ZF z;&7o=YUxgAeDln?69Gf{0+$Ds;?EE5dfuq@u=Jsu+r^o8cJ#Vols&t0!u?rD(d^-e zFS24^o)mvsuNHcAZgwK+Wo}kLTfxh=*q|d>&n`3t*%gJJ{1kHHY(Rr8_~2qd(&~fq z=^`Ql(qKT>nPoa5nO{(|QakCAJ`4|jp}{2G$Y2mkD$MCB$>!JQ=a!_9nc`&aCKqZ= z7dAb(1dnCN>b`P?ztsOOEV>mX5=3$Vk<4I(I}%L00PYu))32h7x-;C@i&7IxvVfB0 z)goO`z0!#}KiPmsmQw+S_Vxi&j>&#|uJ}n+_#H#aS?rt%+%@&+RG7c)Otwq7rOS{^ zYB*~z=G$V}XkGXR!C`;O&G|hpr{3Ot*$<uHW^@3bMTUMlHGX zjpd9>bijHtxg7p7W9Ipy?k(XD8Mtq|bPtUWpO>|ei_tWbq> zk(achY|e!`Y|V=b5aWYqqfcio4~#`KW~MyPE*q;1g3c`*)|w}T?^Q%H_mGi@BgK1I zu$#fJB-5>Yzb@|kP&PqooKyp&Cn4UsZ!$J9L=xj`e?;3`q;^@UDl)*Wc(^6EOb(}~ zsN1vpK;cBzf|F;XB&!+M6^9$A%WjWO6vlacjysq=;r=%+P34_oc5J#se5R|i!X!w# zv~K_9721=P%+vAtm*1r|gGb3~?|%|kVyTZw+!qdYgXX{YvLtDGep(ml1ceDDD_d z>Rif)=XLLfqu#fidk31|U;24}PjO<`2eNhI2SxUW-rWZpven-o*Q}HYy0R5lT%f8E ze4%#>s(y9ZM@dKJHdGJqovhaXW;>!)!Ksx;3k!acP}SB zxRr#c>l#{N+#X*3qq#rT_>qK|T<2xq$rWS{$`plg@7n$9O%vHw#qw`v%;24*SGSVq z&b@2BaAoRI@*9b&%QB@KrtjX!RlUoYVQf15XPmNq?$ zuFa=>9(s2}hO{7f6j?kJKd=3{#yvR;dT-;vr-8$t-~lt6w^HtOefoU);BVu#*DB#Z zZykIf@j35g$iG{*2a4i8gntG(ros+tu3CM89bAQ&eEyq~n*J;W)w7Nkq^viyVyjXC z!-Fk>t;ls*gUXbzv0rL}orKr{G>B0Zxo!tEM9BOwZeyUXM3XF&Qcu8ARqcFF<53iE+6OYn_G> z&80^oi3ENIaW5T0fTpkz4ylk|DKnIgSk)Hz;as@LYQ!$d>`2w@D3k1H$LtvI?AV|! zX2{jnh44-dI!)n|B3YxOy;r`Jp}Tr)CZ_qx1}G6I2?s_$C4WHev{LbbXki!+Y}h=* z1MIX;DIw#yOC*sE(a{y^eR7U`$vG;>0VH$js=17wcT5F&1QCP`-o~zm-=PCoce=3e z0nD40~u zm04|x>ZKkf9X?7faq0rs*MpI{%mWD}JBN#MNPqL!MfQ$EWXI`)?`j{MDzQ2Eee|as zT*%2Fh&&B&%OoGk+%D4SdK1|u4E!F>YW&*Y-VCjU7~Veos-z@PP+OgU1LSN{LSX}w zjz>4WkA9Chx^?jAkMkP{79_JvBy$^Pz78?s!}8nsobGu)EPGUF)85`WL*7UL7~~ zuBc>vaBF;px0HGDxflIkBhNoLs_E_n){$&Lp4-(E_3&br!Sl=Ew;AFF*@iFr;~ux~ zx|D77YAEFmx5^;L`1SSdFN+T^<(Ry=bwmJ>Fw7+`aEm21c6aBRF5RgXsJDEVICWA@ z!#^zd3Bn7dU>u9=43wNduVzO>?#UZot~NX#fgC1^Hb@I#|8;qxmslC+U)|9k868(xjc zQHQ_3w!SPq?m6lx`1el$#jya|p0p~5Gt(HVs1eJDi}+xv1w|Ys4b+(K>0(WZ$RyFY z@n)k$uGs0(Zx65w9`aN%q1@(VvM#%Yk!w2c15%i_J0|UC){UV^)>~4Ah-1THwYrcx zGF|f4DpL%Gk-(j8^z#il+Y}Ua{A}~y^cQE3MKBc3wH!E0JLSM+6L<{bY0z6omiY8z zZR%vNcBO6sZn1QO1}m)8yS&OV`#qZOjM5$@MTF1B*He~ z;ssC3Qup>UUDshqg>f@*K9Jx#8CLz|ra~fNx|NBN(uqlx?K$a7Wa|HQ7P83t`(ItY z@rA3@GxF`}-kzI37Au0#r)T$%p{`#hevU_pX?m+mV;(g22?)08$qLESmj)PHehGtn zH*g%>Bl}+=ojE>G32hRK%osKzTMT(B>Q=En(8E{GD&T=ZENt z2AhG`L$40`E7AIyjmxm% zieD>*)5w1Z1NB;2o3;;jzVj8+>Lpcr?3m`ia8$nLJmM)i*Rq7v8)q+}0FLLU)6ThN(NP zLl+|9hb1ro#B8A^ypRS)0BmHwJhSXS!6N=Gn*kN;<-8B50c*>!rCQCAc%+c$zs>)l zGO3&SlL8kqo2BITl%26Gf+=qEY-TAUvfT%c?hI3xKDj!o<78U?)sqg-XO(A6Qx$Im zW5(zDByTB;>~`@iM20f@kyT`L{VGhyEKTfa5>xuWgfX2FP~p+oH3*$_*RB&>ZWFjD z;zpo|>e7(A2~u(&gG-EjP2F6`k$Sq@0Q_HXb#9@CV(;*n>9Z$dXG=?<{WfmawY3I% z?Pg6E!?X}sGUqC0o)kkKp|Ru4R7{sN2Jm4bh}1Aw*A zh_i50AzbSs%3T$9A5Di9 z5@4fG{C}9O3wOY*i*8DBq82`2#OO@-d%pv2u`eMZW(07oEFB#Ma^C$AqIzMH;&$@G z>|H0T{`yk_!&s=Z{jo};Ont_l;B!`%IEuN!v0Y$hipFUv(8B@2aKqr`^cNrMstzmU zGLbJP+wLz~UA_L==-{D`dk4d;22NCg6@%0ym^+>TESaOhz_(a<|@?oFJp;sU0f8-yd$dK3)`^lEui`KV)y*4@e z`}gR|FKc0SnMfB+;vWMGdx_yhrqUW;gon=j3 zOv}a^8RGuzLTx;_+lmIjlF0eAL<;IoC|Dswo)@I{s`!g9L|7uP+^@&kw<{Pt-AuZ- zGu*5}@N=pTG6Fi=&^4;F#!?TwN2oeFTZnT70(vqZ3&*5|o>}CVpH8r0t4p*WVNnot zV-}1y=IQk`73r`FN=WPj;K=Kx9wZ3*;C{0<(d1RCY8+e(#8DgWoA3|I3t;`^Wif2t zb+31U9FT7INmvNx<4{a!i!nANn`|#K)F#bC)l*BNN0yo&vYk+& zRjUzD+gWa$r>K4}V*i?kA`9eVi00IH3#T}t;C+Li{5~O3F_jX3dIzO_1woaNBXa zL#2hp6$w@Pa`=+cn|&b|cqg$U0|XVB)fX*|^Qp{lgvzyoU^1b=Qe=nSTYc|5Q7L{| zhC5VLG?k3Zq|F|p7Tk^Tyjt+o2#O%4zUnNxdRLK8_ilw?;vVH(J6``efw|+#qqiG@ zbIR9B4`t8CT(BM;c$AqLaoEt10)l8`C9}owNTXnm_s1s^UM)69Xpi&!MjSSrLjT~e zu_>by^>0nWqE%vALBe##N|T1eMtRUz1kMKp?u9JTQpv4;*+F8d7=&WBG)f;tN4IW& z#jTqiw$cm`tGtCsg3sYD>Ca#@Q~gxC$dFD&5Cq468rNp^L{;MZpukxcYMJ}-eY~!{ z3~T!<#{Dn1**stUOgP-xyM9%<5kTAB&`WLyz7|E_>N%tZpA4diuZV&Xm8V^MU)Qb* z-|u8!#6>Y54swUa7H<1DCjRcgf?$DeIjpQnq@YJ7zrLRN*>*bBaAHdt1bI~Zp-iL- z{w5@kGZq{6rfCfA&sLKWSEdD=FbYSO^N}jE2zLqr#+CPi>Lo)6ES9`82CYd~ou&}B z=?d$h)hix;wekuuhC&h`wM`>{AQEQNhbqZ=GX(K)u$bXke2mf#O)h4draVrUA_Iem z*`niMbUO{(kK5bH-e<~2Y^qGZcootJqTHj1j{pL>ZMt}P^w1A1{>`Q-wc^Zl{Xu<{(1F7}v0S%BYE_<4i}62RA8YIU4jY*DGal4cn+5p`Rsz* zmpm8LNEoRUtV0UrwlOs6&wz z)Ro4Kl%uKYQV%Z4K)R0FkF5TjuE%vfWc$+&V*G1+9(+PMT$R5i-%Jgw^5{-ExvXeI6es%`h%9iOxcN6u{N(hBf1GplTb(oX;PN&@w78#Rmw{BN2#_fs$mNqvkp=K z81h}w`Brzl_JlfYI?2fRD0Z`~Ch6@T79N_t z2ttwOf-?)@EoA5f*I|vR7feBoK2Ff);B*=4Fz#qzl3+~VNqv}(#nHc4x}YWx*s`f6 zAcoX5AeYL(+kyKN=$g6^xgBKC2wS!Zs)~Qu{dqNE6e0%$p$k_BirH9P()l$iNfQDV z0?kLE4hcL=cPDE0rTSZl5)PQy$yKM6%#{_joMzhfLUmYRq%K7{mAn54s3Yq?J!cN= zUa@~J?MEY9j6`(=QDwZyV*5CnEkd~%{`Nw|i%+W28>Q{sQ}McNscxR_2t(Ry643(I z(e+Ol0&UguYzRzcG8q&m1Qb&3S|HK|07{1ZyjD*M#s+uO&9|X;?2E}MV~Ce%DPU63$27PUIfwmGNzS>IXoz74yqJMi zvO|a7Mh~(@DidwUU`_}C!b5C8(m!9v+vjRa__&>)-tFpCTVC+$cKJ#6X%~))q22v5 z*={yZ1<(Pe1izRTc64zXEw})5v%Ny1l>B!O8PWwTL{|G>Aj2!!P#CbX3>}mUgD)pp z&?rb2`RgLpP$v9@3*4^LY0`>(W*^ltff;lTKFHWUv)WS9;kPMf1_gb&zq6MEW1^&k->zQ$%{yR_}leu?@V z^SNCD_gT?UN}#j~h_e7h5(vfy#0ytMoY}JCP#m8O_a}q#WbIL^1rjA<0cegwtw|7x zRFF`Mu3Cv876SIiT_DqF+fuq{fx_qgU$ry(rSw9f7Hp&7&tF!6XXC)_|D5bHdDyq) zQg@KXD3ffg?C{9RadLU*2{DVrmO})#SnfjufWG;chuj9f-g0vOJJ-|Ig&ZXtSc5dy zs5axAr?Se!k?}~tAcRFe@t0x%KvW6hezk1yAG%5FYFYU^)6M~lR<1M#j2ceyD*)YI zWoitwCz~41r2@JhbfL9bVUA+D$<%9{e*9_Gu9g8^=+K{r8p4bq?rineQ_3)ofOwcK z=6NBAVWtqqb4X$+wNTtoQl!}2|6!PYKrQL;=SQGQmB2K{+olZ!>E_t6sp_+I`O?9$ z_d@hEWiyG46%s%@A&N3uYfa>nxoc7XKD9Z;wfmj}m6t;*IqJy}rFAwedJ)|Uz@5pa zU!Z!+gYFR&oo=cP2?8Z_y5OKP{v1Cc88!96yliT)W?79GRF6&($4Bb?{vH7x`p^x0 zmH>1$pn502f+j$nR#c)q{*|(meIfL8VpZt`SGYk0)wAENr5_@IWCw+GU(OE2R@gSz zjsP{2p1?Id`6>n|@|kwJ-1C&3(BKRMT87;Lc%_fXihZx(9C8he1fUbGP+U%$bPlrh zJTrXk(JWeNZs4_Yxf}qoEbucsMRgeALgimob9vgNNpupsbem_=)e8fh>~arEX9_h- z-l~b2&^b=lAocLOcRNUK_P8gAgydi!P`mDvnM zxdZxas^j=Md<#c*V)}O1WaTh}eWN z9otVW8Bw@f5NRT~J@pg(!;t3)pwLOz=UZz6lur0oy?I{4z(Zk8Lf7wO&T_X<9WELzl%9aQwgPr3Yx33Sn-RN}_uGws;58Y&wYP<%*wt8C( z8F$ohY;+s!Mi`24!>nXQBpA7N<4Ymwoz6-kHbQ39%K)4-TeWg=b=yWI^hLr!=7t zOMx|JXPZwvGw0Z{JeCYqC<1}A-Z|u6f0>qQT5#3r%r6r|;Nl^+{_qZ*korI3vCVD` z(gz^HZnnJ~7%petgbnFx(meQ|Oy&Fev+5h}WO>+(#PZFwrNf~v*FAHufLLor?$Dpl z-b;2xjMn`&RQ&Mb?7r(aPHEsNmpflTk)RjZ*e)(qbs4zn2pZ=@RW)zTKX3KMAK*YK zch767^JUiLTi!0@!J0B-yPx z7*~tH-*Vn{qLcV!F#>%>&8>QlKlc1u80o2^SDF*|%;8U~sUc4wsTES1?!AqaC@2() z6@2!pkguvP$Lk1@=B-gYq!Qx5XaYccVv}8+399Sk@=oM`!YeDx`6d^kQDl7kP>;Nv zjvU%BZRlV_lb)&%Do;Tl_Lc|zrBBc^{DF6BY%JY{P9De$_BylwQPvE9fkvw4XfoKlnYWjWs?$E z;DAMNvG~0}5?CFE0BN00M{rnO=(t{@qG_g&XR-M1Igw^eHAdJ0zKo2)I_}qPyD8QB zYqtV%e?48eL)0ZAaWMd2eE%X%B<5V75gb;dp&jdQL1lU_Ljl+v* zmC0Xj?QbR0v|CAUTg_X;$L|~8l=9MdvnxaI5C`jX-`~aRr1a|1sh9Km&&%nv)Vtcs zcj#Zh)of4HW-O-_A~bydpO9HsYyeku=iUorB`|uA?gU*3*wU?4zkKb3uWk|f-IMb& zI%LS&j2PNLw;1O@pcsilYMlqM8MBl9a=Gq{Xf4tuI@i`>%-L1Oip-ZhI@z~Wx*Suw zFtcpDO$G(J#x9j2WmY-Ij#Q$UWy`>>>OxV{I=kWUU?LPH<-lS|q_VF`Jl^yrt1-&i zktJ0dgc00QrR99fQnmd*+;Xjp%JJp;T@DIw8v}Od6)7p=1VT<~?Y-I&MyNaM-l?4x zEWoxksYs6=MY?YjeceTky_g?x_RIL3=>En)F7jzUI zGIRO#)?eTi5kjq2siz4?=9_BQ^M-MlsN%XNK9i89Zo`<~!3MbE7*^`2XbyvQxd3Oh(DKmuHsN@IRO)_xRG=`)MUlMIzBw@t{cTPi9#14h$$N12xUSi_E2xNl0Hs zjz0vg8r+tr3zEM^l2p?kX5%i?CA0n8LxYH;a?*Y0u&{RA5U9}XECH213YDkzg2kTc zFps4z;(rs1{~$sfJJ&Rh7OYYfdSa#0~m}DodKChDqGiX`K3*B@QYPjGAYKyz`UizK+C(}id z{oqp;>ffODOl>|CkK>C%c)jQlY)~$l#pP9>xBANtL+Hr`8)p}~4 z%sR-ZJ4$JpeAm<=60Q&@8~>;UL4foHW#X8U-ETGL0#mPXRhsRSL%a1~s>v8wOvE)b zWyC(ALR`Z-l(-e$VrV|pC$&R)LHDGLKV8yqlwDn;?@IEGKhY5rrF^r6z5H*XN7O4y zm}_)183dK*uLm0CRe-8$u+?Nw4Y`6`2>95K+XqItT%=lr6j`lG>0q?Nf4xlU-2)6M zcbeExZ(rlFK9sKe9fCn`JT$4i^1H-Wi)AQBwHdsc`bQnB4sw$Cd;lytN0EIhAh@xP zg3JEGw^g-)QxG{*F~1V3;!WYWvxR`++5ykz$ak$AA`yXMyg<*C3em{%$Q_q(3#g!N zuEKn3i6edyD?}IQh6^WxK)Skz1Y92g*F+N#nOj+Kf)6-W#9dvUR;~XFD{eSRKDY6c z4c_s2<6}TGM68RA+&P){qLHw2bVtxJ8l=XbPagkR2c~)Tf{|nz%p5ie#sOgYZj@S1 zr2EXJ6sBbGh&Ei0GULWSf0S@;IZg+OB8AhTNn~)yg;UZ|E;#h$$OqY3Pz}tuek$|N zeGSS3PC_;K#d@oeR&Ym>`;l!4RZS5YRr!9Hs*|yGO_cj(CyLt&uAF3&_>#dKFjC-7JCT zA|I~}|J7rMq#AYh^gmPA4CO-3Um)$kG+-8g1{Zq9l>b4d8tvxa>iq!y`PO(ptwExi z*lHqDPKCbiaOtA$@l`_$(^T0#+tnCUgAeLhE$XCT5>>Nq2HXAU97H%S?w}Ezvl6p94?*IbFf$@P* zW#QB|iu~a;M%HhSY*3x--Y2pVrqSAaq;x9KGwo)JK3FIZCOBw=+28V^LrR=0rsY}I zwWRzEj9+Y1_NBPaBjlCp99esCpNK{*6YTd%NHbx01+3h)puEziEVY2lrkSOrDKbs> z^S!Z_b#g{~6a`>qwLZINeG(#N(ys+na2!bH99U%@Ol_BtgZdIg>ItGx36fH3f2psH z`4C|;HJ2qQB&cgVg%|RLI4gzNCzQ}qv2zQ`^I(;sHYu?KSWho?5+6=lzzs(#^VRT4 zU~wAx8{b4t5)z`@p=NkaJEvaf&{LhGQo79gh3QY=;sxbL3mP>W8ca{Uzmc7~1Wk*6 zN+?53sJN+S!;g?X{0-lF5uhYia2S7oHA^s$)vaKf?O&HEsyBM|)aZ?r@sh8xN%4Cx zz$_hfqj@)CJ>4XhWp4I4I^0El`;nY%HSSW~x0QaCL|;>-DN|KxGYvm8tQ4{3F$D-$S4{pcN6r|cd}+fVt~KX0(lNU(GvNX}AJHy2c7D6suBqnCb;KN=i=PdN&t z$qPIf4ulz^s4lYcn;iTk0RC!DR+Vwm@ORQ_bV`;chOxyL$*M$6>TeFdm@M+I-N~)d z*>l?2TgGMY9%3;_R>of}jD}n$Q2Zj1t^}8ZGHx0EZaIx^bvvP91W6eg&oH*WbQ^vX zEJfag-4_hFot*YKBeS!^e@g4Uvu^UUm6da3?^#$=)m;j*oALLS4e$#HsCbMFnhA)I z4U7&5jBg4&FcWxCHYg(?D5ojt&`i)#*L|1X(qHscJDyI-m6V}Z_MnyEgQxQ2)o-9_FyLLvFyI7fPK%K_Pv_f_eM5+Np`W= zFZ`omCj5(RgmrQFx2A~SGZFDZPy>>@L)tOa=~2{KBV5!MU_*);7vXp3=XGz|gQdtl z+EEqJQM9v1 z|J5ogUye`C*37rs_3fbJP$0Q0aQ|D4D2|*X#LDZ3M)F4GQU!YYgMJ(C0DeA(|{uh1ezoGH_ z1kH&xJCg?FNX+aQ9eLPyIaBW(dzMw^dtRa`V*gTL%*2-6<>u^zpj&-g%85Ldw+U2eA>-cLQOhfO*R*B z<1-tO$D%>d!#Sly5&$O9Anq|LCGV57N{J2txIO5IWp;l#HOrX@6|S(5WIX zuZhcDuc;H}?#L{KUycQeLINA1>44T3O{#r$tW>!Ll!7a;hD;XJ?goxvh$Iu zU%?n6OH4Ls$0sgNcm&9&VdW@zEo;g5K94jRpXT}M77!IY9km>c6Q~()(v{17VmjXP z2~Oa8vgk5MT+?jXt~>hUhMf8D)BwSALSY{2A5D6V25av>0H0M<{;gMTQy!AR!0TNlm67Kqic4DqPiKs3{rGsjPBN z$LsG(1`wDwEPjsj4kQr;RGBoS59}s<-78=m8vE2TW|Pgm6m;3|k7_}-gtMA*f*LXy z9`e*?R~a8wucl-eDPbj`Wu(1DamkV^>^;gkS#5LhZ-;J2hg}9oOKgI;Hoco++31%9 zWfnzph*h$;^-c$#{g!uI@Z!#ax%;x**lRS&r)mn10MSy#hl0KLpYV{UL8C5V(*4cE zi+q$WWt2*n>L*w9U5vRT)Dclezq3Z0k}ip>?|Q(O>Q}=F@#;@4h94Ioj*Z;&BtuyR z4<8mhey$;e$zwAqIKzeSu9j?y{lh&spDF!#czy(1sHUW=_H%BIwh4@@(h;ne36#TQ z-uvtuUq4g20asB|65jZ-;LnfWR6Ln4fuW1+Zk2e|`tawC+mzm?CC^^HZcUHa8)FH; zhWS!YDe}WCLmz?Ni-Y?F-CrNHsVUw0ll9-JwBPoc**BlZ-<(?rdjaPnw+Kq}r$n{0 z97?}p9K^*LgmX*X-7lUD@A-Z8h2}MTF#Z=s<>iU=$-euq)L%+~HGIJuriZRa+7kb~ z%)GpC_F1IL2e2~oRd2F3{336uh}Lk)bSXq#xU}NVapZ&@;&hOr$>~LFrOR&=Ukf;w z0ywJ6U}=?~?@U#m_x$@%apQd~{#srK(m7U@2)ioHfYj6E{?L`BI3N1LKOUa{r1vjx z_}}}cTQ^4_zFU#1=?m9B{;=yj+4HK;eu#*YSirStbDO~!XZE?h>JTzPn&_m^$46K( zZ|(u0P^O-?cL*pE~5Q&ID~ZsynVI`7&40+VK* z6x4Q`-EHH@*0S&ZwA%H1j%x&#cxv&{iXip}kb{BmT{y}=|7T9V?v1-v=3|_~do0V%U&s4iKVj)e6@*ni zUHv?I{-g@2-n}_~cFSL_P0ePvv`D86Qv`{`%wv^Ho~0=(#}m@!vB6>JyKMj$ZDx^5 z)#k5iND|cX?sW|B3pp$%=-;^p zSmB*TI!9M4w_)QxwN6z^YxKHkw3y-VzCH%ChhZD33{uExBY({)znEL&@hzhD3X7$1 znY1X!@!md4g;ZZKTY0^;p+Z_qEK{e>Xzl&7yBH+Dj+tApfNd{2_hGfI@geSGhnX%0 zEc=K*#`2W6P5j!V!rn#nbT@f1`zK)XuY2I3*;V|2M044n^*0HNDk4ULKK#!-AB1V& z_$i8xFv>hCCh}vFB0_29a4skmZj9l+t)zM3;_Y4_Yo?tfO)N5-7-Cw&!J_@MNequ_ zxC1XecD)JXj0q^DNZN;3JgF168D~_HW>y!`MjUd7r<`*otpA?su|Ts5ku*DOMS`rw zhKr;}7KWRcwd>5?In?O)N3ovxRMYUcgk84Fbzgt8w zrrWCxGsZ@hTzu0WZp{g1_x172Zhq1kOO8JR5#O1+RIL>-XTMB!jY;!R3&CNpztVKi z$~uhOhc|te8F@PFUiQ*_+FQ+B!yMG30*NjfSN_2*4D4k%@*JdGhLy0svU(fxX zaQuXoTFJ&Wl*g~Snx2Y1s0r4WK~<~Y_PKz`RUMdJ9U)6*4T4d=s6EmONEO4CN?5_y zIn?}+%Wr;fz5=ptWe3Uj=IVQxYXVPei&m(d+T%Sfs0fy|4K%x;*{L`?NmUSYx?1z8 zyJ&5rrA4BhU|v>N8BfLpM+IBI&#ZGeT^MyYSO%Ro*)C~@sh9n(ZX}8)OT8;aC=*%t zWA3>J_UXs=Ihpm)8-=FE20Vf0sf6iPV2}K`}H_)N_mCr<%`_p0M3>Y&1KH}m% z;6MrhUYP?1V#w`|095r1iCaz#U|@SQV5++DwrQ03Gd|2*VMD`8I4#Zeuh?RM>cs;2%G~*>LKUgtEpLNx>lg_aiOnSNnrHONZWE+y0?OoH}XW5((SqYZbdmxC6o8C>JH)$!4iiP3Jsmq3bn$;II8E^M_#GF5!{!*b)}-zT@Se1 z?Vx#El@y^1z8n7b500&ZM^=cnMkveIBq`ETnOT)rr3p?l1;1a^3>55*dYc2YKtiN0 z5{nG3zCD%SHAaf513}%eceiHJ)LtLLZ2xPq_4}9FbWFPSPyHjs4+LjfeOg4B*l~nx zmr#91xLE;HWdC~z)cdjDwHJ^MF=G$X;rk%PS%ZY!TP9*ZMc)YKk3pI;2HO&aei`|% zMR|`hSMP5{3p5W9re7bRf6T?AcM+Kd6m}~XvQVA2&X7913RQP%6DgUNtUHo0ByZ`Z+}@;9OK8|5ZQ~9b!u>+n-j+uJ-B0-}_cXs`EBxrB;I?3g9ZAl+GDSPZD}^H?tw zH%dDxeX-VInZ*$LxFxQX6v`jLFcpJ^GQ9D_gk?;T!L$k{3imFd^DIabuc5MrVGf>- zf(UQ%(Sss|@`VHu7hSH3>9ZMGA%XKhT6iW%?pmSjb){+i?*z5McZz5{qg;s!=G>thXZdu zpV#a8d_0i8TCSZC2-KfkUE2jLgead99|AYyARlT-R{^9ylz4IvRL)0p4+1GuC&647Dh`=B9d$aZxeFBHt7;-SU&mleFV0S6>5A-s~#gXIT{iFWs1cl{X zFJ!gsh%HS0nTE8nSY3br1FutL-Mg&9|A&^R}?pwVlSIe@0ST-gdsfn>8W9 zoCXLx?jamaV}>a`1%7D%=H14RFeVq;Ew1lp;?TA!Eo;bJ3mWLlYzdBTK5IgWBX?64 zq7n2B{S|vWzu~#w4G3$)xn(-Uw(j<0aPduvR!s&ml~ z>KAJVb>Xr2B43+NBrHtNHN~u`@cW#M3VeIiOAdajgN47vh1nYTn&8AN^ho(S6K1RJ z+s?Qj`y5%wbaMUt^G7&-==IlZB31Pd*R^a8aa(;Ceyd{7j7u22_r%x2`q?-1bA_gs z|6<4~d;Oq|9RtWGJ<;<`TbJtgnQARH<(LM5FwW}`W`e0}_rH16dRPyF*t_SA5qDnn z-c2ftuSNB<3m3GUJ@NYyW``W~Q^dG3dKwBFCeN0|9)N8UVy9I2rCRcuY^&jX;7=uS zQh!>>;SL%*5~pg;(+QQt5($Ke*K6RK!!;WrY8j~NDtCtL};$w))USv?DbjoSwIBSLK`UOLnS^~!%5 zVt{bp_}3lJf1=Onh>uR!#~g}??4@juOy4=mDWrTc$8;tKs-@gvNHgX$q)n7B*4 zp}>Ul_t|cQ)#>_nv#>*|D_>Ps!AkH&9imx9*tL@MPLJl)crA7U&E%IqL0D^5`W&^% z{invjOn=+NGMMlp3HYEp$L1dM!k;XIaWB%S@VqM-G|~VA%nJ|%L$gpXKxcg>I^vvex}{wIqtbCIYJq6?7t?OT%R3PhWbI3vgW zJ;fvl(Vpf8cplsmn)mz$Y9K?;#3W2miGtYkSCz%V=7S4nNRxb&3+LS26zP~|`_v~` zAnR)F3~5OVZu{(zTPUiHqk6twl?+(F_zo{)5hgOOinRE~rs~je(}+4mEk`vC;9BJF zvr4Rky@$C1so)SEi-~7dXgbTzT#neuLqkmTqKsX5A!bgiwJqlWWd0zY42S#4=Xi1g z3-ynVcu#3SxJFD?f_I0Eh;^_nS~R3U1S?`p*249c8V@1d2hvZxfj>3QP5iph&E`8z zFk5t2mXxttA~F3;e2(0UQ%le&(My$Zdp<&slsp5_W7-WGnTYUYc)Fg}$iy{$)aVhe z^cep;nTF&*T%%G$+q>JBj5;nKjiCf@;(LWC(Q%HL?&s|{qwx)j%=32h6FzJHhpA0# zU!dFbMVOIw3g(cMuVCY3z2ck4TGWZ04Ambc#x8Ch2n`UQ5b0WhHn7EX{DjZ zK!l$H(W!VqcE|0~dL;Xz`H=?I3Imb_K2O2!Pau2pV0)N&QY)cEOJ4j57Ei{+SQDpM z-XsEH4}^$#&?a%m9XmGh#EpWxr6CgN*O;U9ywRY^@d?#vY6v-f26uGF<1hTj9Bce> zU>o5&ct-VT!UE;&zQ#_6*sd_R@9uN(Y5St@PaAcZCllPRgLtAKI?yLfx2ky#$W6X_T zN#!QoID=$B*%1lbvKQ|k)M~1ONTcuoK33&E*+~veUi)m?ow)w;v&*Npy^q6uBoIEQ z!9x?tUJ8Uy>ti(^E1iyw=V6bze8(EIZd%`rskvwb;AKn*6@e?9zE$LVO1NuP2WZ-4mPL%bhyK{Sk za9RQ(^Qp-kbopa7Av7fd~DPK`WX$zhYy-x zM3=-(?fY-9k9A^W^+a^*J*UTT%`=T}_1lBDoV?FP;@SxP3WEUtDcg^4&*;{4UVia< z3*1T@hI?<^-WKh!_u=oIhFyBds@%+82yWMmFY+)v-uvhp)7YzbruoVnt6td9G4!5e z^s(aze??4sfL_}+YO)i1_jjq9ba|B!x?4Js;)#&2NmUAp}Ar^^O__zyrjcZ4*fyE&(_Bd~xT&9`aJU;mLW zePzbF03ecuD!01*-Cv(1C4JU^8^}nG#{SA8;`kE%tK2XC0)qiVJ$C+X)n7MQqzRi# zKLIQaS9IeH>8FzTj(qL1UJIb>cIE+z3iT}j1$c_XE9jW6Oa6!FJ(SU?iI?{|?z&xL zNFba0FW8ml|K~^Mzw56?M&K)t-u~)395n>ZdouMBL?Py6Slm3jq0cKwmgl#8{&i*_ z`<}GK{@%t1+rN9fzOo_-N@7ta?_4PO{PxG^ZB^!1c8rYYGC#)81k;^xRo2Gw&AX{< z5}32p4=n+y_gA0uM2W59;Whr6%4b~zHuXW%P%_m z2i6~dEPt79TAR_;nBjM9_;Fdyomy(P=8#cH-u_Kl1NKXJ+3VgV{w@kqtBc zS}9|$c@VU*P}G56~@IvE7Kx4JinV`o_uFxA#bI^H`E3RC`z zs-iAo91o|>MYl_NbqQt0xjmy1dvcWLrIm&;>@a$|m~t>GVUUv3;Kv^i0dZu?kmZIp zY^hONPrf4~W~Ti>C5 z8Uu#n4-3HSS)22hSZqsuV_Rl3zbTBq?P~WS(-c8>WXn2l&wh;84b4!T$06n>w2fe5 z<2~NoHClP-OmCS{cu>-}@bz_L*( z&|O`5V5A9hMbS}{m(=>loD62v>%Od&VG&rAS+1LCptNk6G~3+x2sSb@7w7jJG+&hb zFe*#ZVq3~sJi?JLaLAR0GK!?!4LT!2FY0qZy_?_vKs6dax1E4A6^v~@8Mo>r<5aAvB^H&JaDnL1oKT<) z`EXhC)0^)R-afpKxfoM}ARf)nX$T^(4X=+RtLLM8JqjSkZL^RJoQ>G&Id$75Y-a4M z@Be+J-pn%`TAZ7;wgXG>7@r!xcw|KNE#dB1IMPe&DKD?eaxjZ9lPSft5f#dJuh#HjH+_RrYMOqljWZhO9HC~c0HfY&_iCs z2`ws=uOPf*EZ=qBqr4=-&$8h@ltpvnSo`!Lm4~Hq>=~dGc;uq8Ih5ZJSbJ{^WhGa($|oTY^Me%a!^m zMV57g>hbdfrd27T`E#T2xc6?6o~{VvEAuaH8s%U+Hx11#6a3?H$3wWwqa%eu;G4GD+k)%;l|>*$xgBU3CbqkQj%kUj7>t;TRkQ-(o|*y#pslteydV!?*3yqlUo0q28}@rEs#)XK+5J-$TVa(ey$!8?I3dW3m2jj6Wu9{%yWoK5>SE3mHjb^bR^<~5!aHg8>>-vW1m|`j zcAwKDC~hi*xKv+0a2AL{$Q@)u?-$mTc95LKOsz^BcB zAMW6!01SIR*W?X~X)Vx@?`i$0_Ls^#P&c%CPsp>pmMvCt2);9$hnL>WG`p+t2*2=Y zx3UU()sjnGz?#&aECxJ&HZ4kf?`0sHd09c24)H|He{dv47O*)54cND>|BG*t+F*3bXjV&(HOU;TaLJG(|xl$Vsp_s4!OU{YWzA2ZEW93 zA;gZFc;sIe|Gc#MOw+)n+h<_*(>7-J)SBi}Tie)7W+gYSCF>RH(niGyv&L#+;a+AH|3v9Bi zF&^|XgOUP-O%VxgJV60Z+~nN3p&w3bY%`H3`i;68e9RKtaXS=)N52T~^_sL3u0dBn zm+${+Tms`ej$3b8R~y6#PHx&A$ZZ}on`^Tem*k21Zb`s!VM(O?5>+EvqC6DILM4A#^q(#27yU0-|WBY^MxqC~P>9K`2(0EhmfMv*1Q{`G!8YsX!kzlh(`8i`k_`?4EFD^#_K& zUr|!PK9Q&qq2yAHiyPhq)7vG|Zy>RHT$miKZ|qu-4Sq2s>vd-vFmr&j^62dh38nyA z?T;@Umm*lu0%7TnuCk2`1WM@eP<(7gkBsX&rezU9J#I~h?0f6p@mPuCA=P?{sZtD= zAs&pNm(Ic%EGk9_!T8bw8Jb`Zks$yh6Hz}y`=-%_T?n{-S;>{GS1iudh&~AB{q8R- z6uSA5#e_a_v>X(;K(tEqRwW1*>InvbpB%JQ$Us{WTHd=uhH~rcFoIYTj5}_#Oy4$F z0?1iVttwk8yo=a^I<7&nln}gc4g{Z~^RytSII>NPI{{R#x(ML-p6L>?zk4N$Cn?07 z!j1q~=KSg=(6~?Z7Y6?}7HQ6ak~xV{BMFs4{0<0zO;NR{56={8t~@H+I*#yOcFz?f zby83bbWoTuzF=0m%pP3F91|$KNo$X$M1W6Q#uopqp40;*n_%%H*g~L`(gpkuJ@T3d z(<3_;a4U*srA|V?ZBfNe7Sd8>v(jMKdd%64tX=O%?!a`S^e)^HRmEc{iKz#I@gPr5 zS&?jkTfM!!=%8SthphdT41;HI)|0#qR_ zqA2sq3%@yu%Pgc{QHf^QQu4iV-^t z|7x4B;!lHgERkDFk1?rXeL)q;8yT{zlOq65BYjnmJhuZU0kFr%NI!9$05?V zK2+a1a^A{zM4Wn!LDoPn-0pRNQ*Z52X49g4zTxcSAcAAxQg(v|hQ`;Ix`AW36ksf!lQ?RTa!=U^{y)m4qI zqOOH$jv`z0fo?O|re2sm1HEPBl7le#p#iFhS<38dHk^FqJPrXCE8lspz7zL1;YwJ( z9BIQ6S99^w!cRUR`2OXrbQBIZG#8`au6MdRcjKJm^TriT#wW|nBvExW<0tbQX zgP3GQ5Jl=WLPH$~LNrKxDS&mrgq`GX8DVJh0>d?d8M4q`4kCR#&<+DHNfAZ-k(JOM zFnt~o5PkW6^O{`t5JmsXcY@uy9L2P3vW~Q{6M!iX7=5BT^8=8(uWj%(ztZcd^%^O5 z9L7m_LDj_MxQHU5(zNp(uO=bS8FM`J6sNQFw5i4y09At*T%5o>4@o5FrTd6|V?KKY zBG#i=6FEMVG|Q-qN?Yv&+5-5A&Z}jA31}`31x3C1GDyw8SMVkySW=MNR$Q;7i8S) zl>YUmh0tYm?=q$ImD7z>$~GBvaMRsTL*XM!k2S=d}a4zr&n}uEi4VO;^&{o_mfEKWL#jMh# zU1Aypy;^b&HVqqAp|=V_Z@GB&e&pLMy~_rI^Gd$=mvvl*0M=GfM9O+=5$FV8J%Y_s zfcP#5I#DK5No7OHbDO0BtM9zHTed+9`?!^!*^1gIFWW!{SAqF{u5iLRT)}v0dK0Rk zt8C{q>iu=R72vyBMQ&*=116LASHleYVEbgqB^rvHE*`Ka9m4Sy=AB5I}iIOI4YW@#k87;wwx`a7LKAU8I9+E3LA<`tHv z>-En3=`}~i`m=(~K(Z#`cV3CZMeJ}4c-b)^r91WUB0GFz-o^vyZ1&?@fd?-Ay**GP z89j)A|A+2e^wc>ijVwr8>kNarQ>raXjIqe5!RJv;yM4RhUWJYum_c66aF0H1e%la} ziQ4f7By-jg%rs%}D|AOGW@3S^Oq;r~qbsLAp_sg6sIvOTS99q*h>ep@fk zsGvFfPIvp%?17}Fi)8`n1C&{XO*R17TwfD4!M};nBeymz}`esNP`4YeL#%5zgeza&)ZoU|0-Odv+9j^65 zG0r1N{e(O__R_fYo1@&t4>Y{~VCS2)RlL*yH4JHA?668AFF75u;!En1NNi2?;1b$) zyK$}+b!`cKN%pmfJ!yt-hgMiI1wfL|TQcfldSdld?KWR&UG;*K1y@5*_TxGeuJu6; z#{0e?6s%t*X4Uv_dc_;-?_APraS0gWFWyU#ex|u+;*;NpB$JVi}%SFzo zb=>xb2F(xT$j3qT#i|!waNu67JP>*4$l= za?MXK_rLh9HVnVN`{yo7B<8Aty|eVy)4DU?PKRFfEP+R1O#^zczFyVx{&1%!(YxGM z##&RB#3Y+L9ZHpt+@viX``L)0_DOkaswlhjeOaNwygGUO)j zt}HHRWXUb|yyKhUOWOHM3GS=c_j_VR72yJ(20NG9c+UB9DaEvy6U~~Eis^^ScW+HW zkpy0*^K885@;7nab(|{y3k8YaZqTnO#Yi+)4|tU%LgH}Oqx^nwe%I6;4?gRo2#e;0 z-1a-Kh5FG(Pbeh68Wv>$XPm0L>i3Ba9|(40@&*@v(DP|YK237SQTwHnWEJ=SndD3J z@A!ZC(phc64gXRA%M{Y$gH&Ar0#4<^uLM+RnVqj3nzSO9&!-25DNaqg2_(sG7b$2f zyIln|YO8j9(c9r=D%k&PX9nmCm4CzD3#$vJpBvKpM0-}LWShR&n%4-$1nzRnYrh7J zUu)3*6;US*Unumv=OOG%{fG&#HTe4zH~m49=H?(LlHPCm&GH* zAU+?+Y(mXKFa$IFI{K7s*#B+9uDroeilEC5pP>Lq^ylWYP#NuT`=X6EGc9Me0|W-E z(&IW0Z8ZH1_zA=N=0f>SoDkSuAO>8n^86O2GXB;}D!c@To9N7G6Ka&{X&(F@JKayp z2NA!l3;tCNk{^^q$%=b;7Y1Z{WzVh^KsvfMMLcg#oV2Tu+qpZVD+|9)16Z-2n}3Fe zecRZCKjfWOq=OPHTWgS!5rW1!sm!`WyLP^S z3ISIMWt(2u8d#kX93FlWP5VHEYo+Xpnv@@_t;K$cQ+qon1(qpD{@NV&S@=c8|fyqHeL56DX)aa zAIJY7o}4Tp?<6ZN=J=eYOMWh5M1GcC9EZ@Sd3c+u`+av#H&XA`Q5K!HseSiofVv4- z651ogewB)_CQuwpNvXKkRDxQe*=@f#tL0ov1er7ce#bnHQ&Cr^`n*LMyKd5$(7;DD zb`9N*Y{$MDo5@Dk#2RQi+nBuX`kMV6@xU4hEfJucw7yE)skH*m_b=T;9eJ zGq57EZ<{Cb@mM)yq5x%cp&mw@ZvSK7S+%*)z0w@Gc4Kawv&jc<+ka4tEs>FGE8QO3 z?V7Q2ZxUNI9jfGccTm>(UOyq(3^$dgC$?{`3}4>itypHwmp$A2?qB8y#}_I$e+A4_ zk^kD~O!}O+xbFtBjg_+Ei#5_z4vUUyCvNDoq2DYVNfNqIPFt+YbK->-Bh-37rGxM8 zg}0Ea_|*tX;kip|wpjPDUbduV1g%tVRvo$|_NqrmEF(*EC+g%zi7M(fIksvq53{}C zIX>z94~(gGRlUB`oI5{;Xj)r+I?t8I>AqSJ%vt~VQ8mV25RC)o6N{#;G54wMf0B)9 z&r({~c8rG(d*7C?YiY-yt)F?Iud^g1zB0Lxy_kkVKX)j%8#!_pq)va`MH$>@IjB-G znl~22m{Y!9S?rdoWzF{(33}eOv4p)@By~<48N1J$k4YpD7K|#8wa*65k9m+2oW}20 z&+R_uhIo3BG`r98$P^Mx(XKulaR4bT`t<0(d^i<|c<{ndcF{+z=gJrqNCH#g=HXJ5 z5U`Pj`c7jh=^}oi8`T zg1&^!%Yr55-!YSevzPke@?H44-2ughKXYraZfc*KVcuF5MM}X&0{BTu0AD?ahe&h~ z<^x&;s9@%B_6!)Hzk2VB_ikSt^g>+79YhN>Rvi-CTp0f5Gt68}Bo1%rk5OY!593Bu zpYgPWTjU^7UC;|Mfg4Vu-1WoM+G-(+^{D;;d^3JGXf`ZxRuYUz2nK8{__anq(hW1< zba_q8?gRwHao~Xg_y+d}67P`^B7I+clFDijWH-U74IDnQ`~y$z57c4sbuO`YtnHV8 z=HNmTLwGn9*&G^>R_7?>`2nGrF?moqRnL1SIH??u4Fq&i-8%;Cm<{looUqA(ps^13 zXC1y@LDo|s@SQ$JEAousP_&alOmM#6J+zbRN2>mwR)uEMaGWIzu7e&N&TGxR0Of#r zAK>_nyTxaRJBXO)?7U}4u1_XlC@MEIX$ z5Zp~oHL(kQlo3GY%{4(ty5y4{25c@eNPzjg$cS!jh`@JlH&-!uVSy^iTOowxLV7~D zZ+btbScRvD&D#Oej&cmNhWIyI zGeS~O@p^s$D4UZ$MdzyjN|uljYFi9=m;*fjl5C9$>w6=1)xhWRxsL{cs;3<4;IIiJ zL>DK02gnMBu5U{NJjW#kKd_Na57`Rihqa{@_EJJp8GB?!=$B}#v1&J+3R4C5=AsGw z#m#D5)41Wp<(q_=km7)W0+gf*C0W1%`+tRDr6JB)VP4bljSh}=*ZOISQk1vYgC0j@ zh?dI+WfSH-Rm<0&e@H()J|B;+cwzOfl@pnZNPohpf43@HQMI5P@wkEWb2O~_c2_l3 zLJ;1_SaT!VWIwkU5>gN6+Z^6l)HqX)SW$pXvK#!>Y?9Jd^62T4;G2ssiJE{VXhL78 z@7z&yegNn@lN_p1(Ks&izQCGNZst_=Kh%2*kK-TWvn?}l9>u&1))6Y>#D}X1@_^1)ng}qbv8DPHKR6}Zu=vqR7hCa z+YDd^%f?zzi&P@lnOHsk_B0Y>)1VG%2r(r0U(`i5KDd4^t^a)WzT|O;P=L8mz3$U7 z)af&=(b9fo^zxcBveI-_%&(-se(&3Rvb&%N^sM4+H&11-Bntxe?5Yqmbx>nURaL>G zu2k`Z>XfU?rstazHqN3Jjo0inB$WBB8|Ow9o;TlrttDgZ$t~nQCZF4g9I&60ivGhs z4JKQ3@DON(Q=pRts{if1@*`sjt^Gw3A9DY2hwL_M;EVO}gV;rtp`{ZdE8l5YsDNXj zfgZ1kg9{)^SA`FMMg9oq*=37)u_{ZGAp+lEGNkhyCyd2}C)y*Pmx!OAL14$^Pp;aiZexrZYB{ke@|NX@7o)3$uMrqTmXl(`DjnYhnvxd z5p@7b7dn;7M>#w|ZPhMRN-Po~Or7ElJuLVDoW>AU@gRdkx0xG(xZR)`3x<=)NvUC^ zPco!@HP)yavgN&0`S5+3}JeZHWUL*TJtoFARbPe z4RQgeK}mpJKj{}#mCJ_>wj271kmKzUreydJYeQVe&#r^kuR_zDZAiJ~@SQwt04-+6 z)$9=~+k?E{$(06A#SYCOjuX59t%m$7k?@mD?#`f`zw_K1O1i2C7l(zvsq+Y|^_HoL zzaV%LH18GY08#Q9@yGy<>68BOV_`ZyWOPoa{+Cgrf9puP+HEY%Pa*myBjcWMtZsqK zZWUUQVQ5_!Y7P0l4f9JC;k+Td8H0Xvu8VT}FNl9qRWK4*1xu3G|j@ z05#{qUH7M+mhoZX=S4^%iMtrN<&0MAMgSw@je`e)4X=!B>`EeDkmhwoI0-`x5h3J)e;O0^bABbSJs)|O zH8`?S^e$kLSMI#q!q>UW-Xo_&yr3k*L>Tqx*A&|j{XjqKAV7gu`<%Y+BsXf!%{80G z-9oBU;zbU4OM5r7h$Q2{ED>-+hPjNI-xtObRN})QM72QgR39W)p=72=x}>Wp9Zg}u zN?!rX^ggtnoW3~Ord#ET<%18bhfiM-6suqf=3B{5zANV?GY`*soE!(^NyU*TZNR``Oj-8}5 zt)%nO#Ac=W!S^N=S%?GQhPsH42$0KUZBOAmQw&4V8S>~@?A`@Zm>_-cp;6%267!x{ zF5R#)p-?p33LL`xbDYf1h+05kZ9P-WLAJoG`@|kCi! zJu$mzumbzVwpBphhd%#47aF4VV$g`abl;_-VZwnYm$y0{FDBS@q1GN;iIT^1m3g*( z81>xp8(BZho?>Uy&3sp)MRg2wtdK*Ns+|Ns_(uk8g(3asO;x|T8z9Rnd+DcJ!(rnK z?zPS!@#Upk&Y@aTuSc)rC%#R~8r)wEx2bwNUaLaIikMY!_rbR<`_=R+i{FH__V7yl z>_ap&ZFHl0)UvxI83%)pw9tJ;r+ld4A6F`H<=nsN{0}Gc@*eGY7n}%W*1khB)KBiG zku?Ul-?T2cl=tL1M_agc_w1f3J2qkV@TLoo*K$*F<2?&CVT|#clmCHw>iIevXcN2e z;3*%}jB0#sYFltv9t*Q^KL?wrGSB+axXGwCQen3)4>#U+BxP0jf#Vy=VS3uKZte_c z&Z6p%siqkt?g`JDcai&xIvc-qrR<$R7d$C)plDj2-}@cQ%c+bDkHyOt=+%=}FN8>wk%l8VrDR3b!s6r?#_#T%2|VjfiNWcdYuu zm`!TWv9RFH65|;SZgYI->#+Hp5Z6T<2gRKgyPF6XE&EeW;D21c;UhMej{68@kE}MBbEl;Ty{9JMo2-JzLjU=z;9r6{z>nTAQAwEg)7OElmy+^7 zN!A@4^`uB-km6vmeZhvm9n77VjL1b(16I=B&A{5)DQg@JQ*r5^!}Io3kf_;t4N*B! z)hI%7>%A3=Zcpo;%0CSFBQ(7E(bbP z1HGGO&z2;y)G)*a10%pw%`s#b&(4_l^7w=^g}>#!6P(Z&55tm!->}8vm%(*}D}%HO zgV0iwQ&YDxhf5=CP?m?Vzpp+=h=ZfQrc+OL!o=yJH<~G)bJ{y+3Vy80&-=IwMB`9S zTu<*CZb6yWJH49{W{&y7H(5LxG8pWaB=3CLPDxcPxU%!SDwp$78Bs}#(Yj71gkBA! zqPy5f7Mw5{KvNkXb1VyE-`te6gm;3abhiT0h4v0b`<1dKTI(Qt=D$&;Mr01(u$zii zi@~dkL;H(^u<3xyq4J!+iryCHbZ)z8fUYvDVq2FOE|<4UNltR70laO2x_+A``i0Ck zs1J6)+NUaALWmV&uDkXg&`EfTXjH95F7!!k(3C%H7=BhO#@LYChb%HqGDH6tPPI2% zC6+G*J=`d-o9FlR0f@N4?#Oz^f1^x&EMI+S&eY>NFe&z{YmaL5I@^>{;o_aPsZ5^* z^^~!iD6eaSHj5k@g6PO=nE5jwQ51HcW^)A(cW|(j=5=WjS2TUCA0uyzZGh_)Y_E7G zi#5zdg7@resb^t+)Sk#lSxAD-BSnsR$aQEdamC5el5%Io8SAo~vHX%{g6}Pzrun9$ zb|wPTH?|XipmAbvv{qol16`tAT+@P^YL?)yP{R7#fRBXmGcLC59~5%dADMKg6LjjzRFy< zJjx=0l|kaa<`pbmSixfDi;XvPydqC!?E1U71Ir8P2*GX`>y>8jEZK=k z@p$Cqy)MG)0wnQUmtVHW@yioY>F(xs#3SaT0@S{!>w>LijsnW?Q+mf`6C0CUE!8Z} zS3?=gcD=&{H%y<;s-aTv1LccmdL61~ZMsR@kMvS{AFS>s?RZ{7*$TL;-@wfVSuH5?3cW+* zNb*35srN{JWLllGi2IFdd#>iMP^G6pH1vqBEOigvBk#;miMxS zuvOz>bH)w&z{3Kc=(p{$;2LGPZ<{_-NW_XJ9>dKy&R))uT4UO6_SgKOL2cKBkwSp` z!7(g!x(1BzT3`O)UnVs^1G~nAuV6QQl!A4tx+X+2O>@R^%ExnwsUX~Ij8b87z(b!9 z?6eg4Iwy=v7)^KS0|95mcYbrp{fx2&S3PTdHHvI<;Sz)QO;H&yz1F9BWfSFo=(cMa z=*Xlj+qebd@HHIL1%0ef&OvPd^bz5t4QUp@(0q?C8(kTrHpkm{h49MxUeh(C?9pAT zVySk98u*rtBFPD^mh=-d%xqFp*CxQsd-FwW_$P^`FD0bK42Z7uqR-RlJE3#B@bs6H zWq|pV>Cf?D*Q0=hf#+kd=<|)&)o8=ocE(?|XgeX#tGs|i{R*KSn&jfIf@v!wnJPs0 zG1)CZ3#*-;3EHbJ#b^&RSQVufE-bN0SBK?KKH7oG8U3>uKw zRl^cfvgYGf$okV)@Z^#gwpMawDE9QecB;xzW?KLOjl8NIW46Z2dGXsV<%ng2o#qmi zir_USHuF|sUOVM_C$ivH>@dg83Q@e9)(E54Iz_)Jn{$?uTVVxyu!6kICX@$Ber3CI zfbx<8o`_JT1#n3b0lEaDn|V77H!`?VTZ?g0@ex)d5ZUcgBb+>;4~{U0`<_hS2xcd&DdZi5 zH75;k5Q7N%Y2YUHnFag=;W$Jjl=3DO4_6IM5M$N~W zAR1HBnI!^kWq*{v*Ogkz6;5pVQ?pIbz?0ib|3xirt6lr_LwFcreNv{m@NWGr&euLa zcCEo}n}5RoP)O&VR!`;FF=&6aBwGn}Kj zA%>=x$8Yx1!b00kpM@8_zk_;kD6jwEe=&#ZIiZ_N(Pm0@d0kXg%Nm355R0Ree|Yn8 zCsn3{qFJJ2zR}@)Z%$5X$VPHHLO!z5H~izYh+*fP_^5N;OeZ|%rHPYut@v=OFUVw{m)z2+3x{*$q}=W7BcI&ns{)m=A9nwxe+Rgg%II~aftM7ML9=} zdIBw{=J0oOc4WEi@r8^}s`pU!f2bu;8-((L;GxzggCRyI*DdxyWmT#6-rT@9nx=j^ zK}m{V+7n`tBwxLliH=kmX6^dcW^KTB9-ca3gt-oL)BX3!`LKNPW^e5roNTkVCotR* z=>jpv+M8mYf0uy>nc70oPFl=F{TH3$rNTVoSUfsJ;+17}l@)zkGlP+B=V%dkfLssH zs#VIWHi&V&hs5PKX7SN7Ef~WDV<1!;v^ljspGev(j-f>Y&8I6tp33y*VAFB{=>jDC zI@TJ=jg^xo}GC4P>kRpqyF zjDCgFSX$jIvg?y>k2vZg$A*3qW}FE$ldVmZ)^z3crX_rkSh}C@Sh83TCWRLDSkuKS zjOIO@_^H{_lX)J>Hl-wv$cwnBlpX*#3_G~@<*(%s>NxYT>_qa|%TJeJmbXqIlc>ft zu5p-sVIQ;JrUI+L{2xVk;>h&>#{vAa`<~4?44eCIBu3I_?%P}?qzQ$TNkzK0xeHAc ziJGInl4^?5rMXH{Q9_dML{d>pD)m+S?e`yic7EQU_xtsHJQJ)7qbnhpuGISKME@IN z+)!^VEm&uX7Htjk(2A(Pb!3-~S3v@HoVT;!xJscAne%~u#RT!WuOdVOHH!zbtx+Z1 z(}|1wOhp=cDt6jzY9{O3jpYBX@itp`7VH`67UHmAQeWG6JROQl8ky0rBEp;ZA#G&cM3aFD?^%^?KM-?CZWxXm0F0uRC zNN4{F2wZr49h(BL9DvzQIV?_T^l&iFtksKCZCm|rx^R$qH?3v~)}M28>x-M#JN0CA zJqBIjIBH#6eM_GPRh6hH{y>GD_`9@MO%}I?7w(Qosk5=VxA}x}DYhI$&%@xJd)%}2 z^~O4JA$I**9AHFdUOkJq*Di6<$Us_-;xii=#~0GdLz1j1<9%QrhH{ z+6|7-7LM4(@ep6Xw<5vKeRA`vw+ozpu^|o-4WrJ|?W^jpHTvuQu2s7t@}HgxjtkKH z#8bm}hFp|bE!Jw6aIDIgq%t~{7VBQ$s@C4A?$ibWzcXSkp_o%z*FwkHym1PRP~EBb zkv>Kd*@h9pCJVi~PTbDWbbRZH?KsQW40LV1C>NDU!?`Y`!}BXDJJnBj z@=~5B@jR3YI9qmclzLb?2Yo09a#2-ZzFzUN4dwCYSUS+cO?HO3E)Z>c99sD_^{x9J zt=iN|dZ-;IBqATW0*sd8USfOiKTW>2xsG7u`<)Eq(us=9emQyJ&KEcmQF@2x9y)O+Br^PUEq z_uu)?aSDx_B=`n^do4ZA8=?mANf(}>J6&QdZ_mg zKE*#uP4*7%%hT)v18q5~OopnE<^^Z^=?>{wrV&*Uhe~a>2pm+rz2=5|lcLK9!wD+1rCY%iDa^r_e`Q z{FuFmVv6m42gk8=?DM~iOVdjFiVPoWcYej>@K9_;wJ~pxXDvP%ymKWVZeFI`oF9Mp ziF#S*k*$(TV@BGf52&U9VL%zG;CWUq4VOvtSAKWG)<=VhIKJ)!{l#b`-UQbE?m#Al zYzh>OOLX6O$bjmQwYY{%0rStippSHYI#;e@j8v3t2%U)KZA~S?y zV|?G!c_}~^@NuXs5h9s}CrPaV-~@ygpY&D4YZRY5Sm%Z}5FI{O*tB zz*U^XsUVJqIasS#S&Rk+UQId9(pnvRJ_fjq`k1b>XpZpaw1(DeH!Bi-Qs@buQwLv; z$%G@6Ke8y0>xyI=YUPdNPBToeAeYSgyoo+3H;8OGc$1 zGv~FdOf1!h$!fX{?3^{<%l0cn#S_9qWYRQf8|KeA(p2u{`2?Nr%t8@uDQZ&&8L`g}L zwYs+lmE0^- zFHrrUSle|z70u9beBF6^-TAZ4WWWwGU*vYRGwVGVrhIa)VLMyUj7iaffHa^>Q@7x_^~vZb_pXpnmgO8e%tBKT5mE{ zTZ<2TWcx7Q^uVMk{b>LBLY6_0fYojMDfyh2veii&Z^L8O!L?f7PuH8xf%+DKd+t6i z-C^Kcb#|yezwcvUG0VL;)Zys!h}6%5aQQ&mTX*5Qu?g~Zr)26qzqK11#K$V?J8dh5 zAIdZYsk6J5toDC z6lEpfdcNnSW1#EylpZwU?-nGs>Vz3#EBuD1im?_Zbo+mXb-|rW+##8Ghy97vgjf~R z9CDzMVW7eGB!FzA@|`6>+RHdTR)tSuRjodUz3@~sX&`0exz*&8$shX`N2uIkTDD(S zPds5?@n9Ws-B^ykfM?<#+;?Pvt*mBLZ}`oh!g9aRiAgWgC$9GPuZ_vfs1dQ$4lrhk zt9K>UJ`bMT@#NCc(<(4suP;k*R#+NBU3wjk?lYkDBE`18fTvwkO7rc4DB& zeO{!Ca*miTvG#b9=Ba55G_h26u6PYcJw=oi>Gl+FC}2KI>GUX*yKi%+bViS&b88I^ zh^saMUr(259#VJ19lyK1_@H`;o44AFgdA7XS4>Zs=asi=ni{mHEX=CU!;vqjK_vda z)C#m+uPQQ)UZ9{uTM&mmTZgtc6gy`ZJAIr>6A?Vyp~c|VHH-CuY*#}+d-re|TYI(y z>g8vfnb~~gW6t92eY1n2s+zTSZQHG2+K@TS_8z+zKBq616C zt(~KO3v^jjl+)tmc8qSj_vP6L()!jWGS)C+u-npQboDdmhr;YFZ?JEt)X!FcEW zp&i7hOe)_Md-t%klkT!H=GofC$`BS7-5ea`{JrPzQ>=IpB?9wMJt7PP)Hg8a=> zZY)EsiF#K5-&*-6sS3`LK}VR;Iw23Z#fO&OqG9E)JpBPEe8VnXStattEM3W|;4*~3 zL@thz5fnR+FjJ84;!lTDCL~B*S&!4(V8`9mIIX{ZCCONM$JR<5BlGJP4W?-I5BZSN zJ`NOWyMu+(=Rj<_N=`nkeCRU6$Eb-Ua6^D^GH&B24_C$ovNwPKYXjJf7#x3mEYed^ z*fPKO+V1ExUW!v9eur)9tV(8jQ5IQU|(rX@sDpwD{Rb`+J zXYBZ)<+xgW_`fJwp{+{%3%##%4>ZGg4^AZY80~37>Z^~C2?qgkYa`w+5KGv~=(gST z^$|6(ln?`FS!hZHMs{k~@OH`AyAj1q5xppx+jtz9NhJhRGT3+uBYG(NQL zPA(MWEb%VH8)drE=9B-u&*|>JQt)DZyi9e6XynQu`>BDH1M35s`qSc1oA(x7A=*6k zslS!8yK*S3*CksyKsvTw7K-p&N$_ePB4An{zlqP(xSOW+#bDsT^CedU%JUXKTvPfe z+s#d90KMs;+nG{)Jg;Gl>p@z+Q@Xlqiabg3Y6_|}r@veWuL7CwH9<({kWv7;RexOtB75hY+ovbB!U<&j^yP6LF9!!6(1H$N<$28b7MON8Jv%__zn%M;=PG2Yo?_Aj@?R{*c#NZ?eFkaaXd(SftDD z(j5PsZ0hsI9wiP*v6(CaM4~+BF**v*l>kXh&$ZGP{AvcGGRfP}DK9PGr&5;6aN$R!XB68feTzW@@a#Q4iJlsO|uVSkc^>lX%zg=C4Jpl`QBu5$$ABDe(`NR{xG#TeIi zs1X}jEx{aaC*(;{>zTf52Xkp4vYLx~At5Y~h|gu1fHC@r8B2eX6|ziu23;d zC0k_(LPDgN*Cqr$2iYw<+(JX52BAtcm#=JM2>@~6X;{|+8C=IH4lYKF{lp^{T!+5> z3GD!hizI?G8w!&l&o4VTl3>5W3PtRr_bF)n81bC6(25ORMLOCI9$k=22#;kLS7}b_ z4d^v>ND||yQRdMW08Np>T9<&x!DAEeQQH`VFBRAb8M|d4*daSSE=1!w0h+AiWU-wO z6Q3tTm1p~#^MZ(90r(?cL?haX3)|lwUfjp~MIx-73;6UEpm9;%?4uJT!ciH_PFzNN z1*HtZPK${X8Z-wGe4Pk!;IQWgi3fR3qy&hu40@fDYc(d=8iDoVmWE_QU%>q7s*B-EQo`-&C$)PUq`cM62@T%kc?R2PVQ<_a~T?Fb!2 z-UfEHf|yebWqPRL_Ezq35EoO5zb(ZcXHY-NTj*s&CL`gS=7*vG3M$SyV$<0=Z48vZ z7d#fk&DJJy^)0pQtg8#p+y=sJwrl9gAkkvfO^o4{L3FNP_Gtnf$mtIx9a72W26x}qj8YbxI-Oz7ll>y^WR|iWIHk8D# zU-*C(NDz)ZvK5e<&PFFx;5&iv;j&b1Ky~$^{*PCY?!r_P60(kM;+L$OGiY{=1yw+) z9ghFJc!lz_99fp;AxC~O*8}HxPpB9bu55eu8r^{ldu}TdC7FFFg9yxFkV7V9jze7g}f z^y_q$2z8r{6NsQX`nsBIL@ckR%@?QOVsn3K#`kM?_`(kNpOUK^9bgk)4x%G$|7n$2 zu@}uvY2HOmVy)fK;LtRmqqR9sSgj#wjx2h0mA)RSv1<@57s9mD7}t-UY2#ohKm%ky zge63LKYblxewF=P)W!%syQo=aj;;VN!6U6UYDF&Fl|jbOw$jj1?Dg|Y=r%SsfplFw zyH|lA<{Yi<JsI@(VM3B z#){B`Qmi6WYbb_zSK(VFFk5zO-VR-r*UCnNH+Q`=LaDR~B0ScTztsVPS zs5CD@?e2!Gmg4>+5mUHuBd{#h7*@3eB}*lE9^@k2kHdzVk~G=Nis%5uoCbB`xtU7& zzOSM4EC@;}(HB9Tr0~9t&cu}az(h9%kbur7SIMc+Uw5DvdH_5R<|Koyk%4C405vv* z=-dnPj@g1x4U$JBwcEzOdyV+MhD0$D3Znz?1WNm53WQPAW9!_#UcA3UG3x{p-t+Jq zfNL52pnn>AfoP~U=l(y_exbLz1MsjQ|1JunSGvdcLTfkR3^kDSD!`8oD@wuc5JFLp z&pZ_OYZblOhb)FfIrpQY`)^f3$h3ZQ5mXO^=yUHkWMMMxqKnMEdvscjj2E^TUTlJwG2m zG1Z494@lhcFe3>-AM9zCZw=UP_?XV)8?bxxY^KR6LE)6L6}E7NR_7Ik^Kobp<@E%Sz(#UOSsq=8aA3IUfI+Ba z*d4s3#kTU?IedtLRl6~atmS%2hP{i2J=Y=rCI@Jr2=jh3{MbCwmIL?XjQ9{xE>DKH zR*}q*j`(kefmow8ZHT>ZhLKn!Pkrq7kz~O(?7g;SFh|;ZgTuoW-?zDJMg(4R3Vt$tvgF-M+gJYg80WrL25_eWH{Wo0 z4&S(t*z5c6vEsLBuU|br`L5#g$iI&QN1q@je6O&(rb=T*HDf|=FG!~XMiLlRN-;HM zJBMA~%$K&jiHecxx}>eH7(TKnm9x)#6S^FEGdhzf!R*%cmrbo$ku^lreLutCCoj3A zC=>bnL`^QFqYjs`_-5w!Ds>ugf=m2A?J2xh@(5C4300w?UT_H)c<{5OH5=-cZqeZJ<4oN-KY_}ck@$6`r4T)tl7dS%7=+~m*cb-fb#U=$1ECP+&j*My z5>B5B9~dUfyCCsWMaB)`s%TGO;ND+XI>Wp7(!fNw^SOP>95v0>;`OtSUsutuezy#` zY$o-yW?fDS>*!eeR)7Bc!kX___XS11goemVE5bF5wX`N@ZqZZg%y>{$8T7PNX-bS? z3Z0~}jF@N7b5ir_d%N6r1i(Hi+aKgbrT$F$l}um1#~7=Xe4oBkZ?QzFzEpnX=WTS* zcM@?S3KXm|*%GvTd668i^i|H?v|VpB{@)nE>hFQa%Ts5`r&9lm@_TD} zuI8V*I;t&#=L<23oF!kH|2H-IPAJ0sGW(0qS$LD3NPYhEs>eINsO}=XL z)jtUL<)|(H(e}d}2P-p!uFSX6owc>LoP~Tl2Qg;Y_9q0u;Up8g=H-n-I7Y=V#L~Ic zz)Phdw21Pd9;bcP#51s((Ma!RDQi2N=wlDg+*g&`C7QC{#&@ckcwccY70l!cwPLCU zWTjIN)K{%PLG`&7?^_Ptm^?Q3mBYG_9vy3--r)1>WKh|xI5r1;p7T~7k9pOSW-_3v z2|r8A99ej!YL#_3<@VA{XQlRfsG^}6#3NiF5w{VGe zA(z|4)n8W1ve*13_;BGu?XE;se3Yry+RAOBUk<(VSvMNv4L^v zmI}yix;}~b?OS(V-9l!iVl6b%-Z(3wqg0aa2(MQ@z4M7SSH6{TR~{nwMw^!ZwTU%d zO6;FMr#=_;*d_PwfzRuj&BHKaeH-Tx`aqyzK(_f0$px)-HzY^REae}c*->o_W&fP- zS&LtPejG|Lym_tPqOZdF_vI^uA*V0ixDU!^c2>`tlECwJ1!NzU0*mq%b#~?PhZLhV z_=~xb-KvbIH+B?D+>;Ddecs03_H!!JU!!#0A)qUyRWNIaZP(dX39U0OP{f1Ml854R zbPkWxk8N+FHxwxiA6PoCwxL}LF)KN3LdGACNTHL!MhNnub$k8Uoy%a?)g$r3*xFvh z01dwW$Z4;0(K!+HM*_n)k0y5~cq?zw^z?Q;nYFTid(Gar``_#A=gK=FXq=*3u`H|y zfTGXrI}w|U`WW$E=ZN&xa!tC->>*J{@!BSGPfU#3fZseEt~dsbY)q(1^3-4+-u~dH zVfv1e@`Tevb(`Lt+OiFwP+4|R6M;Rk3@i7LaO=+3Kg)GYF#6)bnmxJy?5p>bC&e$@ zE5aXdOgw4y#xeZl;~PoYhD3-5*|cQvYI1YSXO&0iZhd~;aQ1b_?>@H$5dfbEjo^?sxbSx<=L*l$sDJ}oNz&VPmd5&wc19d*-KqIEJ)gtv1U9Z1;;8I()1?wH}e&;U3N2vL>s@>t< zy-t!X?6>03zClDdsoVLH;nIcc%(Z^&asoZ(z^z8idv^MKXVb(C5wEdcu_;{6cQ`q|(HGe}&ZC>$70(#LZBbfG?Lp_d{-*;cLxzLi9 zYZ-aKDf0U5Css{=CNZ-#Y~o;-`5&`)m@0NbJm{wLRt%?B8jSaa+qNb6Sz!F`jQ81X zxb?{DW18==$iccBt-Xka$a9}we7F30JF{q)MyIuR- zUNaZXzqShBZ8_+J+iZ2wp+g(frMvr1l;1!td{ea5A^AhUi7u_5_qy8RRTOqS3)pc4 zm1lbRzIOe?x?{ILtEJB4qqh)D+7*M2eX1+R2p4I$M?br1|*x;e}5~fijPr0MI_>tFKy_1L__LQ zx~(ZSKk@34~KDFGgI?}N(MWFHD z`v-3{A9hYYLS-_L;VJbxx>0t9Tv>L9ebl(@P}{Y(oaA0z^_B~pQ)*?OKI-hq2wmIP zX^?1>kZ71qsbZKonWe;&PzN6VL@Wy}Qf5vLOewc`bcL(#ZYZ8m*BZ>svy^fJp^w`q z6mj{q)y{EGR>t~%@3iJ#jgo2x-F*6G1EVjWI`hf*(L0UF_DAXS(*|$EKm$DX*T>o#jC}3B~uVYb(VQ%W_vYii(QI|?gmZuT&Ern;q2>t!60TmtejXM&3RiFJ#29;?^}Ql8FtN1wt3$fKd7qVr{%Iq zmQRBC#*6J+{(CLgYrQ2uB*VF^Oq(3Z4CU}WYeD4e{?6YmTMjQj-12w4f_0^x^VF77 zi}APlz4GVysX|@>m1Lm(8e%Xeu&sm+svMW^08s})1)6~_!pxm6p!7j710W&im`bCX z^_aj+D%d_QdErM?cJ4$KVYJ5}1&wO*P&XE(h^1N0ny}G8++7c+N=#1}ZF}xAt?iiq zo2MMnc^(R-05yLt&?*eRN+Vxy8M3gp;7YQ3^clO^9XR@HjF7Dq-Q6Y_*V4kfMecC0 zDO&%hz_*4G*IG(@bPnvPPR+T$ z_o!myflnn_Xg==C7V)r@wu)9EDw9`;@hx}uZSeO!zk+%d;rq`)-^L=}i`BkO&AykY z_mwLj)kpKmbA10yR1^i2x*a2o@m>`uVQJZJWiXoeb&YYJ1sk!uF^9x`eCe*=-2uOQ z6Mh}@e)m`WBzS*$C)JlLvs;s2xR}3%2|Y@uY9>=v5*PWg<|3+v|zI&+~y_Rsv=Cps&=R zMR-uUreU-JAwu=R(jK)6Q@+AwGcABx*kKN~07}BV{RO!OQuFkStrc_#i48R(32xx~ z7842P!;i`eToCQqhlEH=4z$oR2zQT-f5IlbVG|eFN`D6D*FIBH-1Zm%j0fN;{Oe;p zIh@BMd-Jj0JoSL!jkP@WlS7zF-j8Mt)kXlu1aJ{~fAA0$k6<7-7$zK23FpK19vg|{ zsjuOwB3yhlc}CLKAPJ-%9&Ei3vg%I=gAi(?6KcE8-Df{fSDF)xM(q+Jqr7tr68S?y z2)-S*Wen+{5M7zbU1(Gs05=u$DVaPwX`b7sP!8KgaCAVU5}wSot4Pl0g843ga)S*D zaP2_26zS`c&rN!K%7%{u_-n^nN%-bB z;W272bnj(vHKjbhRlQG|tzEz`KCbIpb<&imN|S!2!(Jxy70zB}uu)ef?$LryQ97Ct~q) z;e4G4fmKBIx`>>Bh};yw9G#yD<_9rgs|KNgLX?+OLHMGb4rT8U4)2RVddRXpC`eAh zKRSH?sa;?Z0S&Lr-&R>E<(`7v6BrIc|I8z7*stshpeA?wloiJm-U4uJwO3`80r{mS zP`O`>aA}9GX5=Kz<-WhGtgKLMg(!a#v_GT;_%+tj7B%tK{D{uCk9 z(9!4h+m6K-5}1H3EwX+chR9TKt`$B!D6Nr4kn$A|`q+EQSX1csK~%JacUdRuRn6w{ z%bQ={+dM(=H*ZHCTF%kq@eS#G;cwt=^HQ;yOJU;t+^L_w`LY+4ASj zmcI*I%(JkZq(_vNBj@P`4zpBM-tT|Cng`RgVJqG zC8c~QO<~dg`{YRl$vQ7H6Ct;tK-wU+cSJl*@zccie_P-j?T%RL(^#F!Slz?rN}QZ@ zPX0|J;oI?uaQha;b5VkAMDAREv&UXkZtA%(LRKLdlMGv!YC0n7djs>83g zr*hA&&GR7>&GyQ*9N(e@C7m*d5!B{N2tYCh~O?(asP(QQm$=-kIv+ku!i=qKhUE zhzNYE*ErZ9oMat-i+Mb@pp&#7PC9pCRv835CHV&dgdGEb2uBY*f4IAJE|mz;s1yr0!6*`d;J}Z} z<&q)*mGB{fbWS58_mC;dlEl;RJ+AEW(TFm|l0dF+Ft1F+$LiyTKd5=D|&u zfh(>M+;Xx+JuyuHHk>DdX5#!I_E=>F)G`KP-UCU<=v3BOgMy|Xeu)(90Zg0=7b zxL(19dT*63Y(t~rT*^qMc=R>`t_EV#J9xUn9Ikj{Ql{%6M_z1Y>TlhVEu?G$^D{b= z54IyRDI*yXd5i0mv4euG04fxOep}c@{K8d|b4dR}U+r5c2XZ#r+J$ z1o9_`6gr1#01v|hK-3aR0#Os68Z71G<|Z8S0Y|Uh2Kqw|@^sLFM}5hEh_Bwxe@?CW zHgjN#@&FYg;Tw;!)~wnax_)n1(B5qW;u_jT!un$us%u(ftD&J93ziVNzZSY!# zd!pruxzSWnHbJ^KeEq)opnVBje&FN3SBQEYif+iOzDjFDwBvqi?s(WjsRfLLIa?)g z6N#cMFJt$rjP&(C&s##2N1=3C3fvZmY{|?^&CEwF$6o5MpgOER_;XF5Wv*A}>S*<&M>3DgGli)Vf-G2N z4RG~BKUo;OY*nr-9Kwp1zkcgIrq>KUb=M03F8)1N?huUhej=3b7b#_Z-f`-IQMN~A zj_)#jEw`s}Uc+oT+n2doYx_*!5}^1dI}SpQJ?O_$_>{yndt!`UF7LM`8p|9a53XUx zr`J2=7%-OPg)aV=vg?n3-IKSi_Su1Z8JY5F7~f5bJP?40EblJ}OjYC+@ev)<>_D@* z)F?FnGV1=h@6gq30fGIWcA&B@E!#&1Gh(kyzYzGKb1b|Mc*lS9m!Wo(1Q~xkFAPD0 zB2bSpD3`==g>E|W>`=i~-kNsBas|l-awDYKRB%I5#V_*FW#^*hg0pj^Wrz>UA(9H{ z36TdAb4i&u67Wyf-T?+`auX?VMZIaUh8wMH@9}z_t@ZnNYo7^wy!@SVChd;be8}Hv z?+KI;2$$vW6vKGnHGM?BM(N6<^qeU@w>+yzW=g5PNB2>=apcNRMqE$6w&T8X=2y6P zo^8CTaA}uTxq$_{+;abk>|DA3*BQ;}Fdu)RifSB`V7|w6sLu1aen8V6vlkZv&$$+x z?=^qfwBhR3Crx`TMz6%&7Z5D=S-!fq?O9#GrB)AU(EEl$Iz!PHRAy_LwM0qZianwA z%{44amCGq3O-7ehnD!{Cn!0Q&YH{V~`&?H3Ac*2)y}gaaJ2?8tH9t?fz(Hj zP17$L{9_1%6`0NP(D(u-G{aEHWV!A7jg)m^)1!L$) z;e$2vOl9DN;mF{yTS=kGnHb;mrdyA#awWyNSwFw^uDq(PU!C!_fIC3u^fJ!>CWXzUDjdzmxIQ-Tf~Oiql~}CXXEB z^MKMiBdvZO_MZ)^bY!uuDjgnbKSM7#FNlnBGi;A&!bZm!eiS_^q40ezTQY`yP{OIl zju#kT<$R2B>rc_G_jPBk-2Qa!^_4qcy0ov}{q{WSB{BxS=s|l}{o;u+&s4cU!-{0l zjW#u$^3vfi$0C(1f4o$XJVJ7TrkZK6O*iqe!aR;#?iA~7EC*_QD73sleK%8T0afX$ zaSfF}NJZ1Oar=glX1u#%y_i0p!O^t`YFqSnN3*zCqr0?+I(y@xCC;~U2E-btte2Z?2>h4jZ)bm2q3rzP#SJ;+BHZK6uc6;y{&QH!@(=0OR>?)cKFF=G*=7<`+-0 z%BY@SCO4p`sTXp7q8I9IoY{?5br$>yJvyZvtx9jxv( zT*gnRf3qT*3Zr)2`!`#!V|lu4OUJMG_2)W%f9vP54BszL2RVNm4h>rQesHmyi1z?o zY1f+#4*xZMXj~`M{MV>c<1fWil|u%P%)4nP(z=w4-#~P7b%6XRYNVc; z$mmkC9L)AtG>v`jez-~*l1o^bHpDM?J4%8J!-NKhzj5>lKYkupNde#)(%6;OuZ3&& z!BB^3Nntl*vgKh6SX&xhE--AL@;OL>k-Yj?c*<^w ziec?3hP&4)F*lo9*+OsfeY!j3rqfAr90^>OAeAY{6J)VkXDv~N`^4GCJ0({001O{5 z7GRqp)c?5ISS>Za2Bk~m8;Ryp2PvR6OR6mjc!*XZW*3*Fxtr;V&-!&77tO;ranG+G zv?&ai#A#bO@_*)SrOqdHY&4HF0yEos56ncZJjF zk@PR6dZ=UzHO?qtXTJRy?eTI?Hud3{N7~R-0bxv1v1<7f@BV9|%a{~7ZuKTjpLcts zNB-WS9^#vAX(jI$_h`<|a@OvLQpaikI9l+054Q7zPg+Ryu1r1OOv=>$<=son zN~%UDc4|NlTdw^tP#wciaKBdZ&St}PR%R@Z+}**p@y}E@xu5j8GyiT?w&TE7 z-PNZbr_44`E&`CoK}ACx1QI5-zO-4esuET}g3~a~%zS4WA42o*;rPh7YX`}=)#%!! zY6TQ$LKUgAr37i8*Qz=xfNWr$c_P0E68wLml6wsFe&GP6I^$$Akfm?R;lZ#p{*N15 z9}k2|=pTnlf;bANOZLfmoR2g~?19>C_{V032ZK;RtO#&d@eYBa(KP?K-Eat=1E2>v z1zs#3ygiM0i1`*3U|WJX1zzWwLErGbGxYBQaP5L%)5LkcIn?raL>~*S8rAyO1w^uk zS?E+Ec<^Hj-foV=MzzBl-+e8llB9^HMwA1UpQBtU0wVh+9gt)moXtA=EzxtoVp*$8 z6+FAZ7Qpr`sP7-Ftsd_J4`J>U2SwK+eHlH5G4ES=iJ00FY9K`Ah(Hvw`M*< zcW?=mo9PGxp~UhB|Hmn95OYlCMob}PtEX^~Dx*llJse~6<*qMYOaa1Q%HK5XmVhJi zl(u~(9u&u|Gi%(lhrh3i~Y0FO8i$vK@SdQ}OoR|K%SvLGG zU+X_pW1{=&xkD6#+!{pmg`*xqP?-&5HgrMZ5Tt@C<$*SH-4=VQZd8ZZ^knywz#A|7;F&4}HiX%l ztxw_+**xGkxK;`?WI#MjC0fmjksUr!5gw=pzZU}|r#JdrzR0~8n0GN}ZzK3Eld^V< zj~*tYCS30`J71q4JNiV&HyAegk~gWwvKj6+F5nS`emQpX5LO$A;8svSDuQSrgbi`- zgV6@-5HoaVA(TjE!Q6SO&0CrNnjav&K8Bzcv)j=*7Uw-ZpBCqkHSHjXV;-GmHa%8s zP%ISJef}CFdIZ8~67wE6yPgRp+F3Y5u-;opob$q~zO-C&V-|FhE2$pUeLR{3pQ&xl z>x_C*tfboQa@SS0{6z^nTji((dl`UIyIjhhVXG4Kb zC0{d>ukPJxTSTQOcu{vyYwWpkL?>1#aqHvR-+1T~E$NCC!5WZbRF51pb<-ZGR%IFC zG6-?+vavfEt{}7RPuhjKs;CYh?3IH%7hp~+Rgd;Q3KB_B(V$W#M6<6mN(<^ZkZlkF z*+Vg6a=OwLgf0A)BWI{79-1zOC<}22!_GA)qHzZSXfx}oQJ3!B8NUblE_T_Z#4~q? zs#k|qKu!ag1`t=>0QVR889}uq4VvB%&2pGak89$eY-j^Ze-~664H2OWxe=RkH&?1S zzi4K4eju(xwlEC;eOl@+&&5zFE}6?b`m*zs)eg}wpaN38uY&~YfY!r-G# zkz}0*@8qx&;)#+=7M~=BVu5%$e?uqD#LbDTRZX`xS#_M3@pW@1-L0A{lp?z^5`+Ac z;*X}@sgW@gyTfN9d4;fCP$=#@8<}E@M|lL;3&v$%jZ*Ve+Dkf|*%RUGZfyNfK`I`u z9?zT7bYfhrcxk-r`~_rMPcy`$D)VBWcpPZP99QV?J8Q5;`p#I?t*@ETt@^oJC#lEy zb5F%%{A-ARM91=TRAbspmhsd43Gur4v#OsFj+9v84_&1K2wb@kmOy7S#7gb%u6A&x z_Lva{_|7I*xl7@b3RH9pBJ9 zz9)B|?*PK5$EF$4^Yp_0Au&pC72ME*FtCHNX`bwyxcT~`tlg*OYJu*A_2C;{TN=Kf z+lc({L#X=B-nHT$v$$uDBj>ih?Y4=`?I$9$mU|rSjL-gVwCI}E9Sz9W`+zYVbeirR zmsR&1cH1wxed`!BvX{L*AHkNmHVb@O-JIIp$D_{aTVi|}n6_co)8EjLi%?JO zHNe6sOW_E5H&eLBKGOWjo?KghKFJWu2*W5(hz|#N=`|yN2zIv&i4oz)T%Y7xjC5aP zCINC%K%NUzlfq(GJ^62=oU9GMS$Gip#H_b`S3`H1?tblY0RETdoM}p`jvHF(8LCU# z_}TX!+!KHH^Zgr17rK*5qj>l^>`_Vc@b~7&D^0%Bb3U})zUKj?2?USpX;$w>iV~@7 z#c(@efQDGR8DTflO_iE>Q)ZrP&io@4u($VpF?^`Fcj4_snNri0uI?{RpW!(pyWQ;y zFm~=?oh)oz5s<*LTSjcH@u}C`*+9ZK4!BRHN4YZ1vnoy(>KouDbiKcVRNWM89*9d5 zcJ1F29Uz`Ve$CDRP9uS}h!v(l+`r>Zl1S9l4 zU4E8prf#9*2+$5`#izMBm5vjK_Wl>M{>RWM0=-YWsVD7Tu2C%zqb+spO?7&(=rq1) zXE4XNl=jtl;0O@1c8}Fa_m3Zs&WB;N!lUyFnk|Y%xR8E#nFqTTx~Pf5E5RJHN)!xF z&OQXEVeWJ>6P=~%6el4odn450bFdzkE0;*vJ^GWm-UK*!Klh+5?38k0V1;<=->MD& zcB4IzRq195g=Wa*_F&C^_ej$7rm)B>qxeh0e|Ct?>J@$k z%ua&PvS!J%Um#w8d3PQP(lK5<51<}?)x4>NL2h;S$W`#~#t4BonR5G$&LjWwl1E`m zug}`L^kJ5*gXes*XJq%}g6-`wu7_resXVGc&Lay*^C`L4=>vzvdNMdR{g^z(*OTI( zM0{$g4H_)xT2Juix%f}vg;+-2_kyr(3F1Z7!n*UyH+n!^yZFfK(-!ZU7t|qH#adO$ zwpU&v_Ze?J!=ii^6RSanr}vCCl<-|e&F8p`yu4=4guW%&vr-Jhicw9r>-6}Co-H0| z%Q$%Ze+PRrdR;z$Ii1^gLw=DV2GZL0aiETk&{Th;a+=|yhJvZ#>ie(^)Ei~K_A)O( z-%|!>wyw>!G(F46W?3xd8ew6CW^puIhX3s$i=}TZ;HeWlyxonFdC_{UE3%u-rrBJh z&j3XT;6h1hl*9I(V%h|awg)QP<$;szo6WpZT|Iz|1CpCPL0O7rs|-B#di<}SsL}K^OCCCh5hS|^Td~! zaPO}$nq9$`ZN2tV8=P>?Y0lk(_3EF`)Ocjs1641!*@-R9qm^83cEncA$QQ~a@(_?__>r6ucg=O zvv!@(-c90UzuD|#dkB&r9^nwcJ(0*PIB;aUyvVlXdyet+s==Z~wVn((mlu?6R(p$ewmN%O?RWBpv8&`2Y{4xT$S) z&12q6&yQU?2zbh)nbzLe{i!!*sbUamEq>71eXVxe?@^lsXECA_R)FXw1KnYmkHw23 zcV^jaK0Hg9<5iC4b5 z%`F;MBolz}<=JO2Y;Vj{6mIG0%}RtuQYNkxz%Bt=Ag|+c)hsC{_L`Tu*Qk>zLXlGW zAXls~)J=Yvh3*30{sm-104{du1ZGG(z6U>}ng}-EYrU%|wKp-4ydUWb$>0>$9wyERm=~IIPM=ZjurP{=8 zmnk&I8_Pn-?{>y#+pV2ry(7#+5R}%=2G_Ube7CFrsNGMw>F2r1n z7>FCuTzzgMonr`JCQriGP=V_xqdGCiW<7k|-k%2v0bM4FDYjQn1VEso8 zD+E3A+@CLy#ky>eWhL*Q0LqG#zWv4Ih(8zd74d?Y>eT7({!+cKQhm)7e^x^t-LE4? zkt-P0?mU!fH(i@@WaRT1S{B#q%&Duwo)bgglil-FS1v+?Z8<@Ga{3j^xu;TVqTTbg z*vsNv_upF#$^rWq2DK&-lb5SRdU4@QxTt#a$S!er;c4vx^#$kWaduE?%&-NjkPZ+l zN4+$%>0>_nrz^+&%rl!ytBt;@Uxi$(f|7(x#+ z{w|0#vl=?x@)cIfwR!8VYVS}~-_pV#g?pc?SF6mfzLlqj_X=yS&=W4~Z8}b8Qz$5nj=`pVhO~e|1L+{31`z9AA)s zVg014n`aXhU&P=!c~gm~?m$$FEc$Oh&mn9(t9c_iEf@zc>RsnEwKEQMVIdg#PTjA`c)@hd z#eW~y)cOy!#pXTs3hz-mG^K49xqG@=lGNeMIsLWh`r(FDnmNEz;C8(^c`Et??m`bu zG5ed18_|<~>qPuN&A-xqtuueWKXTRjxAb(|nSVdu9MW1@p3yq|Y$6P{MrrH*t&>-j z{+|={Y7V99#$`O0Web;NPCd&hXZA?|MHA$?#^u!tY>ZJ#cB95OSfn(c_wsBuPmW*6 zTSt#og|HsCN1_QXbdmMXOZPXn>hKko)}s|gVpIiC94lAt$ys* zu7ZiVf8jKC^~8E}`E~BKde?z4%%xjZ=*yn^k_(DwA9#qKIA6EwlSPJuO?YStW+2=t=bLeNa6+Zg-Mg$+Lqn|U{_|ea1AL2w91T%(s z7VfRGFHZ`Mq2+O-G#3KEB-?lnulURKu}uT%CAbH4RyiD;8tDmRl9r5Ip1! zfKq1j@M6gN+(kd?4c^hvJfSz^V)dqTHRIGuagvsOB+gc{kr2v3S{Qb}04w;XG@&aY z$7yGiq+|Fzap^gSZgiS)Xt_Xw43CFG-$lqcUv0W-0%L;MuOZ1&n67EW!nuey-Z0=L zc8ECM!Cd}WPv`~R%*$u}1iacy5*y~`T^r7=UgA@$A61)m%p*QWz}~gm#;I9!Bhnov z1dIhldOx%`RoXhF37*#sIug1SI{C1Y)3VvdoG@R^qgB&T^odJbFXD4;qRw9pKK&J2 zr1z5Ex9PHO$1bA!E5k?XoW$8o6v^j7FhWbY8y6 zdM$pB619QoCwgwS=SIvv^N!t)?<1wg-oFx`d+Ii7`Q**+&5Flz)w>;C4qDJSl({+*z1%gCW^s3;Bbdp&zz2miLUrhTAmYMk`7 zW2?J<;g0~%3qloZZSy@Pm^&XW2Rokx?n@o$+M=_y@}|Y!0~qcTgy!p^2}c<&SA%nG z%I5jAhb6D2?SYYc(c5o}>%VfX-6E%~J!9XzlQA*3tA8!MKZ3|IDocMDt5)#W{-Mgd z%t2Sp@8u`{P8%JP5Z;L421Dt@Jn_5X)VGV~%d)u4T>AUIpJ80Jm(w%Y(cPgja3ew5 z%-Vh1POImte+wV9-N19w8eeHtX#9k=D@m7VY5lslY32LLcUiM-f4`Hf`yHF^9+}^^ zssXj3=!Vh?@!J4qmgJLN1CfudH3%*??ZpUJN%!IwN`&UUtRh2 z?$GM0Ye+cy-byJDFHVZ#VAA!oy-chg#_Rq^2CkRBgqy=3d%rQJAgtJkbpnLr2tuvd zV}7rd-TTNm@z}(Ux0>v4c5IaE2>jwODwd7jA&^;r(Wf3GnUA?)(v2y@@gKgTbJ^HJ z0k&iWdz6AZHWHM=Tx4)JX0c~0+4u_r{N)k+HHuuDXvVq^6$v5>Jl@L`WrG63gAu}G z3UQqBysCsg!O~=~ENa=rSpn(O2!O|vaj?vhh^-4#nD#wCUPL!+2M)BW4N_`({ zU@etBN{<8-<6Bg2maE+!Rl7@7*A>AHv{eg*a)W!ZD{L)nvPI9R#yhI!`ykEP(P^Jq z{A)4smH=+e(YhB%cr8}naa0pi!H^qckZIbZJ5aX-+80{9{Gh*GBPa(GZIdybwKQF; zU|lVJlneBCIS4Udf^ZRQUr*Kzr0ItQ>u;)1@m`N$&|W&g9T>i(&0_|8X=_r0*L>ol zhIg%5Jw!9i4K^&SFf17}JW4Y<7Ho8)!syhP(HWX?W3cgs3ggRT#@A>jZNVltD@<;W zncStB_6C~{R+v5*Gkr`m8xJ;nUSalX%$WB$+5LhhJ_+PImL{C9@@TK#bglX1&C!3MS*#7m2p{;fYr$?v0j z`@v&Db2|~+Kg~Oh2OEwzMm2hv>wREP0il37_$5| z`!#8@XgsJ?KJ+c|a3=ff^oB{{F^jr3`xj*nXXJCtxxr@_J6ktw@$p846DA{e*<3s3 z$l|B1%5bh;F@Il%AQ*Db8Hs=Wu7*bJ`r8+h6P{|*E$>xjIW%v-dL)$=M?zPYJFmWiw)%B+waob=Kl`kcX!d{ zRb}YPxD_H)tvpRn+MYdN&2rtzy7DAjy}f}wpEQkDjEJWBklD%pySmasBCJEK^Wdul z4xGVgx6Fsn1N1O$#n-|=UJV}a(ySRj&H@Oy;YL(?sGeVC=%yJ<5(CBn!*(d3)5XEz z``DL{6#GE3aaWi&2mal7+)XEBosHrM2ch_Md)!jva7ZZkX|@;pONW?z-3 zJ{eY_=I>ozSZ^pdk)@H&cPm|ctq>pN%RVGU+6XsVoEs2tbkR;+|6+&kla0ZQ#POG* z+d3ZxMeM>PF|d3Ho3!!S@2A1PZJd>!MU+8kz7Q7!jBJ3g0wMmAI3`i-ypzb$s=_8o zN6{EPCm=pRDgE!WA?L?*RM#inJwGE?f0XW^hVB@@ za9zN_nm>!#&53osgyh)x2k&g5L9m@0Lto7%MF9zawbjLC!CvCa75n0&V-PekVBHdu z5(XMaQ@bFYwVnXjy>}i)QwE=PJiF{7+2z}S?5l#=S)GeXq$$?Zx}d#k`8r+2a2GJl zhl3cBkd32h>KQcEJ~Z-sPzWUc3f6izrx2L?uG%xhCg z!eANW(wKwr=j8Z7d+t07HGR&tx|wC0d({|9B?3FW!4aPrWS-K_wx`?Y{gSe;!}oA@ zB4#Wtfy>6=9j9QYbq(z|c3%EjjvS#oKW#fe-h{B^{9N^m8y5N9A#L&i^}Cvta+3Y- zh#zDpO(Q<12hYuOKRwm$*=2Qw&e_i){{(SGK)hp2iwiVntlu@TE@vIcSTDh$?Fhdw zuk{iVe?k=7YDy&o6Z%vv!@qS2DaLjl>*C{3ndDXurs3vBpAz`*@sNlI=t>T>UlRB2 z=QiIR*;j66?f!Xw;D6lQ8@g{pvTx42xc3yb;193ujanxp+Er7q6Jf`zFv=&$2~djr zPDB@n3YW3PC6H&l&$xM@`}wbzZYYIgyWtmRz6;y{CecW^13gPzalPwVXpOnlj=E4?ak`vkRXVED06{I(v;oxpt@ApkQlRqQ#*~2rPLLrn{D4HY zZhv@iy_;>N^@=u3r+)AEZmKe4)1vv?U`fr4nE4Wp{-1f}m#Z&pnLcXoZTuzhv*IKD zl6R^vsu8!o5x&;^@ga!r<)b3zD*qQ@>zpa7ew0F1~1QH*`MrXXGs#+BE`lmhPZ zvw-zxD)^F^!?*^{SSCT})ej)qO`C4Yl3xNy>0)e8DyEJ@LbBvdyDzB8#z;ckm_nz( z_G0#Ls%o?>L(Ou9SDa_aSx-`HZc$6c=NwTL9YP{>fSy%zG24OO%IVkZaXd)8i6ewxyMBO?DVOT=20};)n&ZQ-r4h}h|=E@rfx-}1T_38BwpmMA1Ghex|K?pamztPsM z`FWDo!Qn2v+-(2d;YZEG;f{&v4YPGtqPEJ1)*RAKZ8e#PG{*MpcZb_0YCJPXIm&cqiyk<#&+;*uzj5hM)Wy)-DyRw>9lQdjy2O#&nf~GGc*MK+mN!6h z&+qHKLW24&U2|P*sgR2OOSRUPI}i2^T*K7~sV{$Dvk7xro7=4R`T{DN#FvZ}Dd&Fp z<8!aHla<+$P=E8#LGpQ_#n<0`+b}r{mK;bLi~84-=Z4( zhN3mpC$WA|dXVQ(;s$VZ;#-^$86{RxU8BB&d_QG3^>PUj1=6yj)snj9(l}nXJB5$q zkt^c8F+5Cg!NAkk)dUsT3PbZl1Fd7IT>E#VWHarrfffS>H=ajiaQ-b`Am^kCXN?4=*?LX0id8edGGJ1?xcWY_>^$r>^HRmXEWbJ;`n2#gl|;|xm$yjUyzr+#pShd97d7^;=; z0a2}A>+{F$bdT5{nN&80;UnHRoJ{)g>~ATHL)|mEtLU6Y6^q&+gc}>9jD?s`Uigj4 zJKJgy?PB?>>9W`Il|nSQ9F+1KZ_c~b#+%vIP0JHD1w!bTAbqEH+vX_c)r5MY3@9(S zjH(1@#(6XQ>M3=APUml=tiK)Zq9)`iUWKqu{nvXydMisgPxDj0i`q{Hc5dHQV$S+6 zFZ;Tq?%d0{7Q(OBorBq@Q}|!jQ|nt=I~-_D2Q!&bBTbY;#n5 zD-5T5XcKIO?Z*xdXgmdag*RJV)I=^SF>0L~Amn*9RcjVD33Ph5(&HUXAK+=?d2()H zoey&EJa+sM@F(Jg+Ll8josZvM?-0(%v#_F5U9+{fS9xir3^}A0$>G)KnO9DW?O!&f z>v}O}JiFy?t$b3`3TEJNFBvKoth>L|I-R#3umUL_lOO6?^wlLWzW&SkRt`C-?&Gm~ zN-GdoQjKgCQmX!&G2>y9IP2HO@^?+nx4{?{Tk&nV$is)Q^2U)v(rv|s6g7jqWht^> z(M-?JsinUBTu|ea(N|XI@(5)lqx0a!lyd`BhOy@UEtC0rheQz5KG{uYpb%^EyU!=o zV6@cY&@Jl->w1EUA}Q_whVT$0Z`rofb9qT8NJu;yF*zx=;u(V!Qqz15M8uee`I{AXZhxjqlGp* z8K89bw9EceTmiHD+06I@qcLNb{fv=ITW%~f!{<*RRp3d@Wny>r7OXqs(Tt(sybN`B?FllkrK_ zlO}bpyVJu@^sw&jFNoSQe|qqArq35oDh_kD8@EQtO&xX_9qIPKA#dDNO5&XK?zdlf za;!wbq8+R%q_k|3q|f;-RiYGqSdW}ug2{a-MN`Xq<4;|=fyQBW(G>S~6kKl49=3Q3 zzqQjKm$i#v``E;Pf}@^t(rn$SbXK==L;9zMd`8Y{AH^MMWoH#`oy2T;c_J$PLS%`> z?{kU@l4VS(g8h(4r{-k-{?N?eo)0kx1GQ^TqSRL(vP)enpM@NCJ@H}j9vL(o;Gqsd zZI7LPCoFpScG=%laW`O#^46}jTa}t!R$n~gD&|6LW5I zX1DZm%NUUfLKY=o?^vn%#C&j>-9%nY9@VLz*`wYt(Ky`tIL?Z+){zoD>Zu?B2W-=dYS1{C~SW4JiWv`Sa0Q0uz!|fPZ(0r~2Y90c(e9 zd$0V7$cp?C=K%UE^wB3{GD@n+hnC*ItKak31pB$566g2oUCphHnVYD%KzhnyP1|tW zWJ+4#B+j9I?PN=N zhD^5$m7~Ssghuo#mFEb(SMLz@kmG=RM8@G`2VR3-Bdxr(zk|%`RUT;#C)Yet2TIiD z9_&K?>NgF8?6DtpkR%4+Kw}__KQ_QLxkcT1z0|{9Iw$@%4ERh{Xb&3!Dos>!oT%GD z@!kg20F?o=538+k3I{;O;MQ8jjOy!m=%6RCzP`rWk=*I+rVH>v?jGUEo3%tU6)v>= z@PdnRI4tLF5e(tOQSAPRR#Sv{NM=;s*C(KT9&b>*UEZ&w?u~D_BU7 zaX3{REAKE-j#@GVESuk}FE4wP2ZwLKh6+#YqrI zzLp{V>0!dMHy>l*11AU4D?$RJN~fK+H65pdLO|1SAioBNR*x))%h~%{1=^odMkkeB4{s*Tm`-Nwb*?bTvs=eN9$s5G>$NEi;LmvE51Fp^J#+m;9s44);5hC9Jf zng>qO9@-%+YZowXCt50kg#Aff8bfaD-XBDtA!DYyT1>z%OpPUo}pE&BqT*D&GKQbGRhncaKs|C_C{zril>hpTdFc1 zI^{|A5Ls`<)8O{F#DC#~nJAm4j9T8o9L5fFUzX}R@TPGR5B*#_X~^=;l#<--hczqW zD=I0EZEo8?Jo~Ec{LRwoyh`AS)1L(``4fy#rC&$a{!H_q&O+^Na;LDGz&aKFXVCCOSS}NPI`j~JUzd$L`^@iT4eL~RUv!iLE?)nYDZDvOYz_ntbr@ia{YBW_QCcek=J)?Vd^D%=)>zjd}>6vuXk-kj(^@D`8B ztwK@U*02Ag^YgsT$j3vttuG8rYD=$wncCv5R$#IWkZV+l%qGs&FWs}YdtYca#-!i) z65Zlpaca@+M|mr4;eev2?-n^Wr0{3Xlb*m{BJJ(BSGNOcLqHJ-z$q!9J29Ox!gL0Z z!A|<9sA}iNX*d0lTb2g=jY+++Iq-gZp_5 z+&UZb0Dvng#Dy~u!!2-2B)m``pCb4c#^=FeBp*(f!0Moa zX({Rc52Ob>V>})nrU!4jNwNNZ@EvELtR0M&qMwYAPe~D}zpBpV!C*6`TeQvMxwx-F z(oq1T%Y{$TkO5L;T`F8gy|ktvwV3dYdB~$eQt4*2x;!#kN|+KRZ}CDzgKMt>nBjN? zvXYpt2)C95OXCpWAVq_Y^x$Lwy3DU2p(M=td@N-LV-?G1Vr0dycRI5C9sM&N84cCO zGcjdSY}p7lgki19rID@RvW1f}A#P$ndW+a1{C|{VRi~$4V2cDYVkp&8j5sR9)d=O5 zn53VZ&+HbXcnu1G73M0pCJ;mn{=yy*A#^#W6HL4hh#a#-joUj%itB3F+sfA<4oGUh zoJ4)4**GmAcXQ5kLBu7o-1Eby@mAJ*T43>vx-a&a_z{b^vzU8KQXdDXY-_yPNE!Qu z{qX{OuM<9XoKoKw`V3mv(CMyu9_9feix}81hp`nu)0j$$o59o14xcU)qqtSHy-N+# z7jb2rx*gwbqIIzc*r>@Db!Aesk3Uwi|ME{4F;P3Xr^g#z94Tnfq3+&E**`E1ZGqY> zIL-Q9_h^QOW+4MPO>r;JMM^9MDhRcRGZQCKa*J-4ViBo~b7{Yk8$ml!XZ?8Fxia?N zbJg%jpfU1NZD*%~AqYRfKGO)eburKH#3zxWDaY>Br8r>30~;+Sopw{4|Lr^d;vOoJ zVX-R+zSf~`!X7jGYcH`JZbHHTmd9IipoIW~#?ohA%yPiug_M;=g(3S5% zu=Lo2NGn0)2M{V50Y5~!nXE=~g{Z@_qsqw56{+08Pg;vo zxfIY;MGVxt87)Xc|3F5SI>c~rgT54AAikMgvZV#MZW#>U29TCVtvT1xto=r$i)JHJOm^HcQ4A3t7tc6iQk4Xo($wH{X~|E2*pCAcOu_rhVX|& z_^q^sE=2yPbZ2rzF8$SEp`F}`VDb$H+*;10It8x->LyZdiiG7Wqof-W)aoy?76VlQ z-p+BnW9F?$7UL={$t@II?QNofi%7L`laZmF|6&TE0^oXq#iTlhfx9_Ho|Tg9_8C=< z5oEk;eGyz1ygV-XuaZx?0bu(RU~!<)IFqnKA@@?Sg`dciz$z9L=GK1d>{%~vc$E^_ z0$0h>R&guNT!LpXkl6PJM=|FJPu?Nf>iJftxr;%1Awr&Xz()Ack_=j+9I7SL_Me6U7=tp5M7z&Z=WPr zA?}=H3Dv&+*H22c5}R*TzQSw&q9`zK_W~rVB#Z%2&}!1V0&Tg$K=S{P z8N#8((vTzSHwEl2m;L#dxer#v#9EGA<=85z7=lH7hv`woZ`K>hINIAGSaCEZijB#k zU{e^#+Aesr5)8wH=}6!v0vMcweJ&#Zp+wkUNUE|Xk1+`gY~w(|jV{@-Q@G!|s2vN_ zxci)#nFuF{(AkG^pVzgUZZ3GsGSmu_3rLSKkyuvPCZ76jcH$UpBLllMRy{^T9)yTC z3*7F;|Z2H(uax0;c3SmYiv!a>R4t!HpQ5PO~b@&!O_ zV86NwOW;>EI^tj8Sx6rHbyEQLXqdy(Mffug`2-ssq-VBSgt=w*3i$7Bm_zd#(5x{4 zd*1BTbvAZ~*g~X@@Z;d5WiQ+RS>UM%CoZmsjeo20YW0fTCJ^Z;!HlrwZi!yq8bP1n zzC0(yd}!g0KyPIbFMCQ7KAIBEdB0*txCLU3y;?ioyi?aCoRA_j;3svtZ=3GC+AckJ zp*l&XHfa*BiV@c?DX5DP+et)59+W|a#C_-5s zfW=Es&TilKwTopW{;+5GRX2#;EQ+@}GFNpP_3qAl=dVvy*}3m2ZjquEEX#gt&dgOV z%1dCa$NskMD>hO#*gF81q0qOlyt|l#J{+Av7NBP(gd+m|b7625$&J8L(i!e*)trcj zW5Jx+_pYlEA*mOB0mhJa1^SD}Bp6(2r4i7Z>u)4w+&WQ0Z?8ojlgO>nB1sN*n%C>( zZy_v*aA8ci!|fZi@@(ro89AAp*m=us^=e=cU?s-iZ0)Wb8;4G6AS4Jw8}b~3nEYUT zQjG5U1wRKPvH0X=5z$*9V>YW2M*tVDt~!pK_?J`_ESp0hmAF8LYyhC3XNMyHXG1R4 z_qvjSEpsG)q3Hbp$O&TPy?@G0OpRPwXaGJf6_<4|Gt@2MCJ=y8Ape*IYyo&7`^OJ) zM^z8$DGYguPL@4~j6n}&#eiji;09$IfCF!~kW25blG4A)j$B9(qG){%4elcUf^axU zU4;t_{#fSUUCKMEn?{kP^XOsmt^1$JP62uo?k7;}t-mE$H^w>xK)GD_JNux~OEKo? zrY-B4g+JJ&Tqf{6ne=Of03;)^aAczR(Wy08>h5O#nEz5zFoP|oV^+F$b!>R=c<4|2 zi|Cjh8NlV+@OAe=i?_G4C)Fo?csf0VjVtqy7H7Y`5uN(ZycoU^ILB`Ah;L^2?s?yp zA+5do>4Zr!UY-o9>zrtNd#hk&;-9)t{F~eRRzBD#&FUMoEwX0x8oRm?LP$9Ab7^!{)7 z=Px9Ix+#(a6N02kr&}I zMT^Yo&bqYv)_#sd**mBJmh-jb0<>b}Pk{yIuXlSCzXtXvT5grxY1;3^Ua28CmsIPpYfWSKM0Ri>4BTJ6O0)Udb~jQwr1j72G<8V6IvD z4!k@weDYw8X~Nty&AmNXH~A#~sK>hOwaJ5OQGLE%CwA2Nekj*SmzD_DXKD{<>{I0- z!ka=e8w5dK(P*`O&A}k-2nw@$V25Z*rF}$%9WX^h{vAK@& ztM^c*oDO0C<{ zu$mUu5ly+8ePE3~vi{U0Rh#h8XYf&)Eh%FTPTd>(X1riizHKQ&?WwXiQ?P~<69>bo z*un0pW9)-`HmFy&)t=448ccM;NgfG3xLJ0Iu1hpV@6ss~iUnq$jT@OOkdYu$dDy(E zvYP6NR}{q_@1#k%Ql_%4!@B&N0h0txHBYUaAMT`=Lh5xYECZqn-{c{rBCQ!;blBj6_aqN-CY%by1;d05=#JBh9~^p0`|0*Zj}{q zR}A~2K0h}=z3$Nxb9%9#2LoyfFsPCmZ^!h}!@d(SDsxbuyhq4mY+QrW%9B~QMP7+& z=8{(BEt#%8xhmcNz491VwzWQDf?{{eUxrZj(xBQqLLu5FvxGdIqL`^3t85g#-b74U z{r?UxRRnqRpZqEb7dI%K0uZMSg{U2}JoFXNzs3$$vO57GYik-5nSy9;EkY%%h?cm* zEz4oN#~Vv{v`UUpNBxq_H4ma}FDvHtOkE+57APlx0#Cy^(>c2V3rP?;YZ^fTL75ph z?Z~me{0pMxMD}S_o~BQays+tk%Xb(K@x%y0mh$wZ2byZl8x=&Nd?T@lPp_6Z;B^Mg zIinj~Cwr;;js0L}*%Nz2EYt?8ZkS#&@p=;CT5rOj3xkGI4F@~+PMEns$!{|%b4d<% zaMqZhzOy}6c`yNULK=iK%wnL(Ob?5!g_1C?j>1jKF6V|`nEWb1sF&M4XubUFNXq~m zW3~*z2~=`#M5yX!R#71Iy|*~(Nml`oobea)$+Z2#Hsa+QB z)A;aZQBO@Um%eVY)~w^ARZ#@x1*S_FVwQ}gg@NT0aXnhknJ6{Ir-r}FGYriV#Dx2? zXM_|_*EmBj*ZVD4P{5O)mJApOxnb{ygfPSqvQeOYnf8!=;-+eTkM*cYZZ-s06^gHE zCN$IYy5$Z`Ak6aWNl~@Ya;mG0ZaTi+#<{Ydco3UQ)r1lE4)I}nB9_|yXGQDv+?8KY z3Jj6;Fnf|dN{tbHCxsnSpCCjYxm?3o8bN

    9^gH@ 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≪Yp8z_dVRu9|y5kh&!d_4&vga^Jq&n6ti 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 z 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

    5GUHN=Z;x!c?#^BXVVCWxsK|I(uWi&>eqzJ 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 ZKhgYuC!+sTOZ>07@SiaM-y?5!{2xvUWw8JN literal 0 HcmV?d00001 diff --git a/images/github-sponsors.svg b/images/github-sponsors.svg new file mode 100644 index 000000000000..4f1e3f367ba7 --- /dev/null +++ b/images/github-sponsors.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/golangci-lint-logo-anim.gif b/images/golangci-lint-logo-anim.gif new file mode 100644 index 0000000000000000000000000000000000000000..b5de19fd73fc914d884d7d435a64ac2efd3a9c7d GIT binary patch literal 3370633 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�KOt}~ig1cCuD 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ℑ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Ξ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 (Ra9s+ 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

    ON@-WQ73iiPy> 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 z z+IU^m$+qa1nVqt0Pxp02b=ti1>W{yRO=xIP^$7{iH8ePZHh~=bicYqyd|m4swBISfFJ)k#(^+0s@iDN$=6+8&1Kz>Wceh`e9{tTSmHYYuo00d6 zo&8RXznkmPo?-sQLxbjs8b4 zxvn`$R?l_S?=$c;cdIUJgTuv*%%Oi`ekcY` zBQ|!ExPK?{3?H-ig#jIjpkm*a`b*Ng(AzOob_`(W6y~f!wfufeH2^c?@5eDFO}I*l zdIT_JE{UDd&_4t2D)uiy`-?S5VPruK)#n8SsZib%M2N@9tN!=+5gKDDTWW#U{(+(d z2R_Rb`BX1a?0J5*Fy6&f4|TB4M+}IPbSzLqOIITy1EeIAe)Uo6@kNP#0akp`7ez_5 z_f0n+gJ9lcn4;8JuLij-*^HoKKqoxJw%SqVq_>a@M!3%YoQoWxIwoo%=7Empg)BAV z3%8)UQ{UDz!?J>L1)x*g!A@BxdB6KQ%0%m+FI_&&aCbf}n5@vQp^>pj@aP7~>7M7< zh8T=xH+6)R0IA}YfX)h=r=@a@3&GGNNv8v_Ka<;Xh@ILGHCcokK2|%crIru_vaQl(~Hh2?^#U1c(yhP?^hp;IOY2fGs?Uw@#T=j;2A+oEih; zbn^SFk}B%cpmfOf213Jo=ij@&YE*w65}?C4_1#5Dr6K;{z-LiN@sA5(v?o}{A>mgb zlUDZ~y0TA2;3zYPs$4%+?dYI=T?}Z2<*KFgm+6(zgC%hP)&%~%pdt~ZnkbOYM}Z=< z3cJ>lZ@FMV^s}^61of9Hi288VGa#qwFg+_}4Vgl|0ziF{Ah)2B54V4^C_o#fS-VOF zmC*LjgRj>Sj51XIIRu1*&}Zx6uD6TGJQ2#%mv$F|d)ZWdm)3$9J|!bHX(cr0;Cm&?i=oHIg-VE-$yUm#_Y@u5)IV!O74MdQ+)ZVc_!3-| zt_dqD!h+`O-E;1hi8mzf#(?&mRjckPBsdpmyeOxal~1Guv+rY&+YnjiJ*75b1%!@E z)OpZu?DgMON$pt}Fa!LlUU|4jN#Z@AwC}h+9rg~)RZ9uI63rrYA?`)rlGkEJlPm`GQpFII}r&*yyhhc;W@Qca~C$cu5% zN_tlZLd8 z)rSPfURoJzaE_v^JW4npsBq__Z1VeR-db>8>21r-a_t^~!YH^1ZnO!8$y0Nzv*_#5 zjpgytyXL@s*ZNsZQb31;hdyf!|5|UO*7XBS=7LSmZj+50v_BAItOtD>)aqaRud*#vj@b|&3A2$`?NM}BZ z$G67gW~8FdGXJ&imIHmwaCifMK}niJvay4xI)T|Vg#ZLjwZRkGG(Mc+D*=lr$OPQQ zZy_M73Sv;Z0RE8nh9&%fMcBTGh(r_Kkp_TdP@?U3vA+0iF;HTno$3pN33($8Y=Aa0sWYGPC zr*2Wd?W(!d-9>5GVnl|lm!Er&e*ytbYs;(bbjy_~3dE0US4^^BiZtlmcev7j4}xCk zO#Cg`QIcg^2N~7BOYaPMTHGv(r3(!8e8Dv1Lo6G|ItyOu{V56JqcovY^4N#+xi@2P zar9Lhfai73b5mjQA!7CJNA%ybI?-Y-&Moyd`reAt?yM@sE-ha9(jHJ9Yzd-)C@=d* zQ)y8>St-{ANaGS!!M;#p+tg>n+*6Smk3iE6*ty^0qcVOcEdXgk!;+}c1~R=S6Lik) z$Xc$rM-g~z(p-UBz3Hx>_c)2G?$#3S;p`x6?o26v0bnrQ`0JHHxOweKolI*E3D6(W z{9>;P4l8cpA+p&Ba{%&HXcx8Vufh#JsLZ2qICtM3+>Gi;lC3J?U^rxpN1dt$QzLN| zLzNuipMRZc{w=CGWAtc-Rs8wDdc)^z?C`hLw%t0wLZMsPret&m=D~1#3@@@sJerR@ zE4y-gF#^FT6SfmyJ?T1%Ibv;3y&cOycNvOfOHn zzg3Xfxjdnb`GD>ZtuYluO6gj+%Q4Y)u=sX^aD(e?0$<)AL2_Bc zy1=;TT-l3UP_Vn$8$FSuGLRy+D7Pn%ZVfz;qPIH9q&qPBtGy?xOdfRgo+{m%@Q$Ly z7z9}NHuntPq7T*xY@u1Dqw~)v<#VfdhHGqkl%R!Zf;N=hQLNW%u!fyC9SE zqSl*&omU!jiuPh?9)Fvgx19bmEEoh;?hq|Pi!?04J=&XAV8lNi|kbh zIR5PJn{5B{#Pnn%vq|5MR%J3BkUViILDKEm6jEF_U~6!s7F;VJ;#w|*6@8R9lZ4Kj z(c!DxR0tCy^a~#6!6pecr9VM=3m>J{$i6nqEolNahq5E;FR3NQPXLq;v$~$T<3BO{ z2M;gpJdYf7at(})bDuL$nj6}+^4gS5mJ%H-%`KxZvW?icn-TT6CSS7JfX&U7&lnDf17EnB2a=_+(^2>`G z-v>kz7BXg(6Fo4agec>(~7P6;gfq2YJhneOT+OsRe$dUf;`S9N#f({dXGDBQ2>392$LKE&JckF?b$kv zS6bk*fEI|04#=P|tE1_`tIMa=LS9Tx%o{oK52PC7Hr+DGhqyseFXJ>Jq3m%X4i_}0o~aO4FhD)bek)ev@3P+I`d z6R7rTU$IyXOe}uWE8Wkovg+yg=0G{@Yxi4^Tvj1o-Uo{b$*-=`4_N?1M`AyFCcOKZLMiGeM z$91(20Fwi~7$cird7sbX4R5}{V^YZ#%$xTgqTXn{5in5V?@8e6;QUx;|Kj}e2UyJO z3r~em#7rlz0b;V3vP!hygO6(dZ^k+Ai`q<$|V;U!xvoHF66o0SR3v!{Yny3vC zcI=9Cp1pdxUi{Q{V=77i)pO&WPjWj~_SvGgPi@w5*_vGJ(l+|cH?t`-nBQD`e)7qO zE-xaCx!TLmI)=e->XjT=_0X z<~1S^BFDgfTiZweLF*t=>hJB{wLmyw+rVX&urM@<)wz(@ka6J}_~ws$F$h1P)oH4X zxa)&+1{V?uMwnz68VY#eU8YwCQvpPSoiAe5Gz%kbTjMgbW|k+cb#8re=A8xYe?be^ zD@_BV35N|U=D7UyiO`zDAqL|zz}L1NHTK@V#;Qo=%+lPalMVK@wzZpkv|BhnDqOm4 z^~y|M`V+q`aBW(0J|M7xh4yT^-;H?xwATH_SI+@voQ?$25td5rf-2D>vh24;Rh$zk zSXxXnrZ-;tM4iXW-7`>yBQuV@Lu#%ti0ZFpi}ioC^Iekxoy!ibqQi^FCW$ZuK&lrdtTS%T4xvd zE|3>=VX6aa`!a!&b(B%`FIsq`M}z-nXnyh$$`U^kRnDmna6ITbprr9${6W+5Pl;?G z&dK@Qn?_8BpGenOi1k%x7CEW5@%k*@S>puO5B;v4JXb(dGH+c3lFv%hr_MV4ix%GY zJ$zgXP?E@}a}3Yz=^>XL@JHu+YLCMZX2N<2=DgyXuAbkk-}NRwRcT@@oz; z`0KCGuIEql(dxDh`cfbFG~LhkeeN;vFrAxTwY}O0uAbf{{>EJr|Pv4iN(qI5$6sNethnIJ8L>ZQ37VJ+0rTG*C(iuJ>Fx8h;&{h z;=lP}+6QwY!klJCNG^aXyWFAz|J6Bc0johi{a5EO`hRr}F>x7uNjXB7@(|Q30{=JU zP%ORhNLCU5m7AQbYxh5>L#cnM!|VTh>ae)(KdHlZrJ^d;(pnaEsQ+K6LxX>*!><1= zb!dL0!TRQHld4u*I*U4N`JdEb<9||zwQa6-ZJxI~{wHEDO@apK3|I0b7`qw#J_}4j{d->m;!@mDB=Wui3)7Gp1>KyLve>*tbJ~;gU zokQUN-RJ+zIm{`>vp0SxXIsQZ}gn(X?fKfqKJ#HmQ05uU0Kdy zQwexV?D+n%4rp)N>TnjzIecGCuo`Of?15*3>eW#1>)Q?hSb4prOSvc2DT zex*oke!L*@js-h!D09qp3YQ`u_Rtvxoo0S;cK& zk63lT#$}&lN;j;eptMT`LZWLJFHQ&#M9@=({IiOs#bU-PGq6?KR=hiLY;#ac;;wg= zQctXd^<_Cc;z%N*3L#m5-B`;Hx9=dsWsq9Q=zE{W-W6DClg04Sx;QeYT=X=EO(a%Y z8mWa?O%u;vDOoSEb|ta%O0ypCVWvtQ_|njeu2zy4Gz(H4MMmmeoi)w_&b$|>3m{VhQycG3fyiE=Q>AP+-0ku50U=vqZH|0w1*oR zkvwi^ipO4A_Q#vvO(=%SOYw9}>XtZVi;HFcx(ZJSoD6@;>AVYvr+1_eqQ!Z>bU74- z4kmXWJ*)jV+4Sg_BS-Y4UJJ18`nUX8#5%2w%z1IwCW|TL9N&*G(oF7p7HUsVoeulx zS;#DP3!nCUOlCnojCh^97Mwwy-DMKke$T^q*475e7(K5+bqA5?R2bk zO0;s6LyTl(=kBaoipNf9E#30@+=WZo(s_iPKMw4Y-~L7yZW*XyEhV)2p*={mddWu=t|aF0@og?Nei9hE?(&c#P4jMq+=bF$s;d z>qmaA^ZOGr@AGxqgqtgz>vI$b?4pGUuXYAc7_k_%+5rPprqe%>$mlkmPJX4W45qGQ zu2l5&jYkNRWFpF^t*Usa_ZTa7b#g7xLH+2X8VdLF)vD*{RYOEaEj(|mN`POo1SOCG zj*(jx^3)!X89D=w$yyWP*I+j&Z6^o>uZlgNM||D3QzltD@*KGEjsL}{9G9ELvcIg; zGYrq@7)})t{#0z)HJO`b0_Kr_NwD4^X5h)kc!4piySi)eOhfjhU>}I+98p0i%W`1E zWg^fOkGX=9_6bJ!m@Vu|U5>4>S13vm)vV-7AVTrb%1k|_O1L<~#+0=h=*Hx6DULPe z=haBoKek)$@12Iq9=h{k&m>S{(@ts^4SlFq1G&&9qkG~^_Ggn_65aAZxCm4 zI)Valp?UC4JBO>_^te*Zan3zLX|#HpRutlei3%aJxR1}uSHZ_usttDVcTY|_SKg{2 z+xFH)Ri4P{c@r5dTfM}*S>Z-m;5EC(CK2h|2dHe4Nx=L!y|qBxeW=sqrW2=Y6^71t zoJ*$haZlk0PnKPyWzV#B57N)GLa^&Ycx*%Yj~}|GV2>f zA5D(@op944@Vp!kow`{*VQ;hyRB~WQLeD2D*<^5P{p&0^ZDZ1E8RuB;5uVxd4&e>| z$~pFK<3L}E-GE_>(_dWAF~Mi++!d4*$2OTW6o%{@V;?_{AeUu1q#867GZ5|2?-_Pw zX&aQ32W0h6TS7jUqlp6|aa)5cfWETt80L>?4igR4n9d;Pu`ilga`8R!)=-7|Om!oW zq2-wEGIq$0VaJW+cZf>xnL0j!>mJ|`n&@8Sw5Zj1;qh6J+`-GP7Hg2_XH?Lpu1^K= z6H)9Zs=(SV_d@4-bUml~$a;m;SferGn3@KZ=Z?NfK8?>#ik`lrV#gDmb=jmVEN8|o#X73}drCB!~_7q|1%VVcZB0WM4Ce2<*k28FHkJBtQajJY+@80Um zB5eP-ND_K9&Ez83PH{`oJ}-2XI#9w2>De7g{$x;yOjyiEHlF#-U2{1`M~aP~3%3+& z79Fyk<3c)z>_sH~Dlf3!t~4-zdSR4l!JA!rCQ(l-YX>h4`k1d=`9$(omh|C@4|v|Y zpFd*cUUwl|^dpa>h2cZ}s_Mzg2w};hv0+{5X=vs@1GsAqCJ%4C0_B_W{m&c zn>*&i71uKc6{=tBtmjnf5<^}E?3xvyA(iBE zt;YQU$r=oMy|$$$ovp%DiYH>_2t4#`?5elh4z`Sn@ASx)eg))Gbz+whwbr70s~0gl zTaxzCdlR>0d9+lsKX9lPSReb%V~MW$d}KB=?Z6MLk8s-v_8?xoadW?)`>9kzVq`l< z;rDA%;3rof(yY+j-;Y!hxwe>8y-ZCo*Po}8Fxs}?=Jk4>NW!9(O!%Madh)K(=x;i# z^2^&28?=`LB4mF$%>z$+x*KpYEW&0*CLwAiN?aBJkMbImr9S=;1FC~WVG;S%__vbm zc?`BNI|#i?_!!p9Rfd|=9(MAhhb19N(1bmFTHJa&5q}rG<>T=%9i+{WO`;)k+7LNZ zL;{h`rp>@D0s`izsxAr$esq_u1m)CVw#-B$>278Xm*U&NQze)<6J8w}M27~(jR@W+ z1>4Js7q_vsTksgM#eSX@7YE`i526aOY?gOJnj;CBv+>@#;#cj6Mi{6~ET(`Ci!Vsv zbV;5lIg}`mJZ2q8BQY7lV4EeFNLU$jXaF01P4UiQO0zfHtfPR?HauxQqpd+G zo|!Rp8=T$=6ROz?4~A>l0h}#jK^}~h17_}4U9M)_DT|yPhfLw5PbYR z*S?e|5`Dxv8Dz^qU>7ehw6lHrp>Zty2)8|ZHlUJFY4pPX3c`ed3E&f=S^lu3&CU4M zeB}MB&Xz+}L9)QZa5mF$eaCr6)NS-Vp^NJ^AlsD?++snN$t9;Oj1U$YgGF3MvtI+4 z>MZoIa0QV~W%C;nRCpI6Q-)^vLxf`R@-&O(#jArR?B~O2PN_soEL+?(ivVPsnuD$e z2#<~CKeqJH2c(=*K{_kP&-!1xSqD>>%ZxeSY9JlP)$?WOYqY#Dd7hO5a72CaC3*3YAGDwXaGc$>Y%6qexU+{mkH|FinZ@OT zIH89w#r`{L(LseHGl&SRlSDG;7!~1HTXucCjJD#tYRMzGPYr&uUQqaU__t6 zpete|_RCnrg>ASg1u~Ns$IAd|5uolAwj>7PL~+I9C*|C2$@Z7L4SKG$xLfvhwmEHV z7YJ-&E38a6)RGFdVX(fyqQcn{Xov-QU!Ytfhjz8fCpRmu(z?+08k+seG$N0IxV(ZO zjN9*js%&gW*iM5|gWSbepw}OlpTAwD>vml!UdV1V%+y{qqOE*YzCusG#vn&zFUI@# zIOdNJWaGyz3z6E2U1wXy4QLg}hFEB>Q0vi%9cgFd0hegNDm>ll7O#mL@>c)$f!u1R z`TwfxCW+-?*|ft!4d)@zZHOQDYFWmxLKdmctmVhCIQQ4 zwOxT}7jDP1B@nL&^fi?C$!k7B7&XAG=#XhLzo4Bk9}UE67t?0phi$Ov@Y`9z)z|f# z{;uL!_+b_cg2b|gZ^PYL1SFa*%8o6b%KDo%>038VC@7gNHD~uVPrEfeMb^%^wJgN9 zES9${^|dT7wY>S&vLe#Drr)~m*7_m7b)&p>v#)h)srBox)@_kHyZU$b-0tkh-#IM5 z^Q-U9pQSs@Uv~h}Hn2e()cxPdAL4o&vcC=Ws*US+8(OrT$Dp0hyI-tE@k?eVJH>vuOr zw8zJw=Rc-@J%QJIg8O?yU-g{(-4ia_%NqSfyZ6Q<^v3>w>KrEY-@V@7*WW+zs{g_7 zeun74kOAvXGw>*3U`!E{iAMN@Lk*}9gK%gd5s^t7*kn2(0s*K99RL9Uv<(njfdq#m z=0on+m?3<@_(p7yb~50eGpfxmOP@ z&Lf-&An*VhpaYKEY&*G(-+l;-6#$rKpiBVcHh2bc@HZJjTme3FV1Q|GKsW>IVRNw! z!a*OzRI+Hm`@91~A<-;f4#Ex$^Hc)H0Af94SSJ+WM+ZY0!#u0^<=WsTN+Z_Mh*W@K zdF;Otb?^U7|NsBMpF7$ZHs*X9L(XTC?vMNZcEtb$wm-SsBgpRRwt#nIw;~Am zq}>@1LyW~iWaP#813Cc&M3@dC9oMVMw*#q=DE5n3H|r|~U21M(a2Ci3*T*{_V@a9= z3&!{D!|;JQ@KH)X4Rzp(0ZcZ&$1bl=f!Ui~Z<-zt*R$%~2Lj+!FeYZ;#->qV2`n!e z1Ih*9>;cg)Y@=-$4L5jK$AG`V5Zws57Q=TDA^u~Kv=R&u53(V^A6gBmKzakHozjcl zv0QlY7zE26L@NU_1gNIYP#;Q%#000Ak+EZ+m}AahgnuI#2!1ID;`M291;nio5%J^TPS{EiM`NCU_CWq) za1)(ZFcBU*!=0!g;%y9w3JRwT z(5aI!yHRz*1Yb%N0id1=uMU4wx=KM@roz6rVUScvEM*e%<+VX9+6N60ADfiQ>xAMU z@Yw0-4&2Z!7^oc+s4!U0oJO98c{YOP0w>HaAtBb?Ucoa+Fv2$%1k#<>#lZzGp>sOW zwggb!CjT7tMKw$nUs9kFVDh=Z4Z<5pGKj$K{1h}Rh(av%Vl3rICWA`Qj|f)$#X@ZpgTK42))2#Mv+ z-XJ56=T4)>VauCu(&sRxn}9lc@V$aUI)Dgg&((CypU@e{fZl!OyNYC($r#XOJt9a2 z83Az4{JVR{z?ZiLA^|AqH&@erl0Je?N52!Zd*@>Sc_A;h@DW(l9^Z;xyh?-Va>o?% z0A1Ewal<8~2qt#~tf?qglMK=TpyA|2gB)qGF`)MMoT42tuG^{afwqXl1e0M7EU@kU zB}@+31_$p=UcRaf63m_dF@l+NgPvrMN}fijUd9OVAX;3m8mLd21t#ETJw;ZRO;&kO z99l8%r8pH5Qo083T($JToZ`K`qKK(sg0$n;2=!~n^OkF^fZ5=w-dGrwiHX^Q$$wcr z&3kjE6i9pyxna;j*ZZI}4uoAsy74fjOb~Y%bDM|p8H4DsC$seUD|5*x9vTX))bhlI z*&A@~bc8M-wB22EAAL0!UMeEShX3GIWF*ELHukEc--|f zFYYtS6O_Eru{4T?ZbBl_LnB*g;EI@!2SlAZTh0@w=q#HPc+h}&WNPjgNfC%18g$?0 zi}3#{=__3xVsf9wCrUxW)Jl*GMcEUl2u*=C{aTai16bo)#IeG{dO8(r3 zf|Z=wRYijY8o%LBzxefbTfKAd;OQl~F#sOF?btallnc@r16vZHzPUfI*!Gnwfe_@k z>7p1x^la4?vFaCC>l{$n)-Qfz8k`F};=KTy1JI{RuMx?+E`I?5G7$4wyb}eD1Q0h^ zU*$Z1N7()N6bHCpk*wMLtq%Nor4NrHd|!Id8hPjY%&8AA-VF+|z=sKN`v+K{Q+-%1 z1tzRWDk3iu(*@dsGF2d{U@!b%w?!jWB_N^z_q=Ms8_dP=?&g8tB zsba90P7zf(6^=Ec`h!yY{vAxcx_Pblmfz=)=a>HQVDdBjux0kaOu`X>?cV_)%(-lc z8?G)zv{feRK$w)C*K=9^L=E-fDidU(7jJN^3zmz&ME;qu`fr(idW=+8?5%SVuR1RM zg)0W_ZNH#rcjLY+dV#X2{Oc&ID^qFVg`utLR^w2CqPi?KuJra|?-*RH~5!9pfoGNh?fs~`4KgUjh?pAZr2uWc^1P6;YuA3B544ib69qHujI!l@DpD) zO+bkXEHUs^{0M*T`lzoi+Krs@gF02iOM{vZxsUjJc@?38IDW>-RfYH{eo~_O82^~+ z@ilFF-|p3}%wIrCg`hNxw5HCr6K*w%!5or)*0LlZE{S9H%l#y+ zJGt-wlg9$|3`LtKz41QH=KL-MAO0tbK0bJ9*~HgfB8tYeH0(9?3qGHS%ybRGWzsP= zgiIPn|C0~^G1<0bUXOa)=xKeRZAtJ!l+GkM#8j0EF^QWu3p(9Dzui(6qH)aMPN)SM zz`j005#V39p|c{Dz0I@QOolQ9rl&j}oM4IvU_`j1`LVP=M)w!XUI}AqmFW-y?ZCh2 zFthjod5C3*a>F@C*dvLg#SR1z7MAaK{MiZniL`Y zcU}6}rMpGPQm?p7PDM0;2_XA>_p1ImRwS$~IEH{muvS5FqaKl9NiG#(ve}ExEtj$> zP8ZiOpnj;T8?9MN{m^Im86~$W2Y*3JEUP}2A%Ueq5VvoI0^lM*zyQF=IyGCH$t>rd zFgON=oJ0A4z6Az)&Wt+=)PFt`p{@+=QrfmSEeeXFq-l<=i+&2;cQ5d0bR?(!m16L| zOUeKb@jR*Zr=!hQy&ZlYpCcw8+k490~o|(?Qq$5(hgb2CUA2g4p>Bp4K#hbO_f>9{V z4EYD}hi3nI3ONR^Q&5B`KqV8Mtf#$*ENIcyXu*Lq1IoAE@~OyrE+U*N|N5Ns0ks5m z$C3|Rly@UY(1hZH)L24@r>AQ?!T9Mj*gbPI_mz-rkaqP1?4B9JDE@R#5J=Up{&lJ} zGY>3cfS2uTdSpC2o|p8CDnB3P^fls`aP!b&*WP-+)5(3gsU>`_k^V4px;o0}zD!1%@+ex8kZ#9dR8jI|g{&^wPyLR@K-9kIZZ8;5)LnPoTJbu$rGL z&`44Lraqb(0`u~zPQjMvdf*>VR%)l!U^2H;6I*v~f4**Kl{lCpy=+oyl-uckg1|rU z^(sdOSXkv(+BLIp`e?S?J=Uv~!26(*IMtfNx)A)l&&R8s&}aiWu{6eUySm5`A@7>1 zCfG0%aWtvW`LiG5XnA5#_&h^mvz6z^s!lv+N&<;6s4zoTneY`H$w%u5!kC%=Ao&`R zRI}|rxSpGlX3N{P^e4JNRSp&_Szm2xu?8R0{}A{XJpGU}KPI6f2;Dp< zg;(;w?`z~52xF~)Wza4{=K$zTE=c(6Px~tf5N^YFf6GGRxP(D5W@~Bsg#hS*d$=jL z7l||ZVCQ~htPcF`7Z>5p?vmo(P45;d*ZL-LKk@I!GHo;kZ^PbBZ0S4gpYI4iWPD6GsvODbmVINFo8{&y76~;w z${LeO(t#s0>`>w6-7;g_A^)xKLw|MGxm3^|PM7aOh2Wa<_NSy8-g{GkV`zMt(~&p6 zdttQOknI>gwrXi9HY!(h^v;zt43n9Fu@^3E$0O`Dd#BS-jC<%^m%~vm|E(UC4FKKM zjwOl_{+THDOf9ojC~}P?!HN}|zgTo&%&KG!%FZQHBpWeUmc`WFz-C9;3m>1ei>EK0 zU^|*qJ|10bfMOyd9)4Sjj#%pj$&CXKZ@HUFknxs8yS7Sk^8r2nAv-*`xvSpx0+`-_yXql|z*9r+hUllMu_aG<|p zx8pl-<^Gf;4?)E*w{Sst5r6aE#Fg##lXL0;Uy|I78uMV`R?EpLwD3bV;<*p3)bY~{ zu-jIGRb?{1zVfH5LH?Pd7z!R)bl|0B_?c{Jzjd8AKgR=>&Sax;>j&Qjk}|f>M(k7A zkTL9Zgc82hiAS~t{cV2THkw->4FxDlmhmcrOON%TM`LX{NR`ZUE&0b^NH2os!~T44 z6(_+k4oBblo%@ll8n6vN4G|T+f|LX7k}G2SsuLqQ}#Q~yyAmKPIUPAt(V*- z!v}eGF}%yiZolNLDJlKx?#Gpv8DHvZyqV{g8uI1p4ZD&s{r|E{X1^CI{fAPKU7yeY z2s|!Lt_{#nT7c-J{^B?;@c^n0O#_Rme4m_Km9D~{(bQxyXDF6w*`NO5NU7Q{|2_JFsc*q zgkVDglfdpj%{6(9|Zh_X<^>=G$qgzlt1;R0in{TaJ!O!mtbu!1a#dJEe z37!36^%Cu^oLR;|ik%y+feEx?RUdWZ^|IN|6z1|3ml?c#6XCb*%EO4e#zbqou5=ug zEzYx2Pqz9ri%?;7;pZ5@SbKMOSMS7w?DYqF^oneNYS7+=!?tS^teM*&lVS0d83tj- z%DBm{`eO=yh@rr;cmAit%BpE*$DRrF5YFb=P9P2hwp(O%SWPgj50gZX^)PYIyYY|D zT3WfdS*z8PvXe|UjjazFcaXYG$S4OUr)?THr{vrCpd8c8pJY2f>3`qbeep?nkmDD?oGHx?Wm=ybVno&TZMO8K zbNae(we-JtWX3-|rJ55Tj`-(ddqR-ar3u94!~Kht{xp8dd1`-mem}&!?;oBjB1hbA z;;mC>QwwvQK!u9X&f296Ge=UNF*OdPK}E{X7+qy{FnSm=6`X}eXQoD1uXtN;n1#}B zC+crbI+d80%<0!2P~CKXM@?ZI8R(W9=+Gs6%L8micRHnM1YbN81}dad|RD%9QS3p3Gd~ z|G;NQt-V{3>e&Vg$v*85tFw zKkD1|Vi1hGhZ-7Rrg1slhwUcbA4*T^{2P<08O~6uu-m_BDX&U|bqKzQ1QM&Dl#zk+& zht0N>%{FobV^#Hak-=;Fwnswy#FLLsO!lZ>T86&^W4Gep=|jPZ$n@)nQtDqn zwsaPuPezzbr8|=^c@K6^aMIa_LUpGYnZ5}nzMXZx>C)twdB*i{M(*;|%*BE9c=G88 zWI`}P^poZN`nIzX2vo#$_Vz$|{=o^J+(E6FDax=PZ+3d*qhGql;Kf*E#hlfJG|Srd z@hifP)$%j_XJ(jG|3Ic^nsZOX=G6V)2k8+R?cNMM(;-8GYcupsHu?=c7c^lx^o;c8 z`Us=IfnnU-k>6o|a|F>Jj_76%&t!qLUk5O`Z_=p4-G^_@+yWIg4wpqR%6%BbY&T&E zi_sp0S>kM}|44f7k&1%h)~4BX!brU?qalJZWz{}y)jrdMFvSI?HIBr!&j{DO=zs72 zCiyKL7-gbI=PHhrwgoa-lkFY!ZEu91b^F&%%Pp)^mo=i>oe|_7^oMTQ7lH7;6v%O4 z9Fwr>ZD`vm+23!97_nyXzL(6s7&$N|Y(B2b0DKtHYUIJ#Hb^kyZ+P&uJ0t#68+hJo z)`t^aGvUbE?OfXMQ{Js@)s?+zeg_0iS^{*w=6ae#IY#<2zRO>|<4L<7BDm68;aeFbX#VZqX3>U>^ zHt>*OHdT6$_IKo&Q3T>zM6f}F+rP$8lOnJPI=hNeB2yF!#F=SN4Q&Y1OnpLaIbad; z-PRL;EaF{3>S1PMz?9EnFOwE~9Ms64X1z}HRK1TCpK+QopzWe|6Ma*9cJnw^0@HRWu z7j+ZCe|82b?SbpSQs))vwgd={O${hTLd-#$gk>%lrO#_1noa#dwdasvf0`M= zlt_Rmk*Ra)RL#+RJ_HzbPEfKs@`m9S-MnpiiW~SJM4r9*g$-zLQ*M*F{8#z4I3#Q= zPHGV>t8wyP3%xQ?CNK^$>1cn!hLLS5V;cuCC8r8uwo`C){C4k}FUTm$v&0-~6h-@^ zw}@h-)Nf^tG9nRXpwu{-2XlzV;Xv?y1jJ98fKJ8dg0Rv^ToDRn3pHo~ikty?bGZh8 zh*CU269FXmP6|Iu5oewH@|y>`;W9K_7gB7E(D5j;kAmP3K0phg@dBOSb@tf+?48fO2H1;#B9Hq7VKq~4~Npfnk8C?RmBo0ln zO=`7u1kvDtpnrn!Vu}W}`i{_SVcr?#O9>8vMFgc?R~%J=eMI;nI7sq|v4(Ex_Iq1S zN^1@h%#9bW0k;k_OwQkQnP$kU2UWWx9DSv=8Sx-Bu!U5P83&Mf@jT+s1(+*AOD+U=xB)!V4sS zYDpfkKF8Bz^pXMD?d>}1?h2TS!ksRp?TmVdGzBAkJ&Md)sQfq)k=!`p15llot>PrX z58H-9LXU_ovGOfIChLcM8Bnj7<0loK;!Kt1oR>!?F{R%=RZB`EygiM9xUDeUQYY=V zAt>Cr{ysp_|D?W9Q`OXhnK^`?$|^Ai{15h%riwGpz2fFD{&orPoi8k-Io)4q>1BAT z-O$hd3GoHA;(u_r!xVw@CFUppP08MiLc{jG&~Hq^&(I{ez{rO^IW_8G5fMCxx^1+Q z-=C+ry|)ML*XZBkV3;{vNaaKsCj(@VPO$mjE#EAU%vu)Hbe*E+}Qh zcMi+!A%-}w`s!REVF5`{4C7U=3MW^^N!$_3(VyF;?a#k59or7y|rWmgC#YQ(aEgdZht`zs!JH7vX933zsWw`qu zj8FAu8lT$weV_}06;4iHFdD-G1Hy1_W7V%Ww*P3WQw;Ht&0zql5p`Pqn;KCY+OiPe z5_283t1Y{C`rR)NpBSex3?Q3?O9^!mz<{>Z{I4r%q5N|}x@fRsz*WY$ED2PE?v?Ny zZluK($>6%r!xdh^uZn_LY*D4WM3@kqitU!*8QDnZQ?U{)_*^?dB$u0ul}VVS zLp2G#%F>wyHyr#<+mRX8MFiQS042UhR!W^j0^g6w#RpiMj8)w5Sua{X==XaUjgFta zu$HSt#!`cmY|b(y1RHAza$a$jWsX=Rt1AqC8si|UL!l7z4Pab?P(ZyQqwLFRgM0RX zG`XiB)F-bKkjOaFbLDcn>OKdX77Oi$kq<7Ocbc_G2oW=1ECC)`DB*lt;@kHsJ3nc| zRHXRz7Hq5*0CJQ|KYMUY`Ka4=-KEg+^}2E$R!yBlP{kTrbh)-|E8r;+ifBVL(7K+9 z!T@?>SO$&eU~bmqAYsdiC-UGzP;yNc)SOBaw2CVJXx~0Hgay^7N6=X>ytv2PvF`0- zA_`enM($fSy8;8y2%24`Ak`BQKnETwk+4_+jMU&Ob_!D3WIM(ggr-ozBH_4hY&ejj z>Top|!+VKIcn&(1_X0tH-yM+VhR$dK)!Y*YjB zY#P>f7YBJML*@cw!pL}#h!Z*b(?O$)3ge=c8}$86@cjYOQi1NqEg9I@IuEETi-0o2qD^xQ~zh`X4SODpxM z(l8Y!lS}yHO9aHv+FiNv{+<0l0&IzM{9p^a?iuiD=<=rwNPxM$+*gNu0<}RUF_i^9 z^;G^QT1AK!jeyPhVT65^1sy1ou$D(5^jRWL<0a}K(hl*=FuU+ z$>9wL$rz)cQFOF9#ksr}qQw9SUm?i5q81^=);&j!$~qO~9syHj`a%MC5vS$LJ5`(y z?w>WRuy>TUS#_bRB&4bud|FP)WYEr}bHJ6PbpX3b5e&fD7oF|Ty)ds2@+4QdMp3)c zHK+yax7c)S<1;$2DWF)P1PXD<2dpZy-ljOiQ#22m3+Jm)xO2)$5w{`#@wsp!h=K>m}j_ks!y-?+aB*3c9nP53qjqPAE}LejpaRg3n6;q{si!io!PqJ3EkhSo z6W;y`Tz%xHIaFjewaiy<*=K+Aox`E! z4)mAfYvD8ABTx$XeYwkJnaQK&@=FMt4p)Hhw2KdO1-x1eR58Oim~l(5F0G5s00>6s zOmwmh4P1?WqrqHiFP0{Bl&C{PRkM04`0gM)Lp&nvAOsTzIC2WE**A8qB6a*+f@OsN_GwCt%?? zxMK@3$2-_d(i?jG!Sg4sUa&mHb6?Quh#sX`Lb~Q-3izB}m_NUd5#*3BAL|r5Q)yq-lq9(Z~GO}`E5=zK7%H=6- z`n~8K&jJviJn~g|K44t!yz%w^&s2G;N?^>xchfkyN;M&YE{bGoDP7a3Hcw+ZSsH2b zpE?`@zv(@%P)PsJH8l^3z>c}LV5CZy8T(@g__PbO%lXY**{(NIm!?ua&C-%>otBqjK#oah@s^mf+S59j1Sx2N41yif%TO6v+PiMP#B?iE0`7^oKk;w zx$aW9Jup9k#2-JA{j`VRpw$D@Sn_=g5=1#qMZI&6EBCOFJ!I7Lu|ZyXwAbt(SBy=M z=QW2AH^kPb1^0wN@8>e>GYXT7i*x=n{_&lAgdQla(ib~UuO`^G@@91;N%IAjw{EZ4 ztKyzyOOZ5G1I~5^+VnuB3j-f_($7LaS1u9R@<+{NzAY6&L})dwR5Hbep28EG!=j?>&}^60wJR#n;F8{0 z8`6K9rRjnU&6{j3xM%t+wt zlw!Agncy0K%BnqKZEHk>*rRc+a8k&d9`wBUy(bB*5$qr28yQs?fLP5LP+B-~;^$e- zigoFM^ALyjdp#Yfc1|fUYW%(!N9)z&7lhYf1{Qr&>c}L*!f&IoM(c(OeBX z>a_k5y4O-+sYpqgEGbic!%DZ--uXQ{!|t9~55T$;@SC6?{2{#nrtDmmT0S%J?1W~D z*2#>M_T=@u4^QYREY>Dy^1p1|aZbgjnM*6Tc@1KHl}j5OwzLChX0Q{N+5?nn(Q{V3 z{=MCcLEHemeHUuhhzLTHMI8rN9t3q>P=tbZ*;VI?8$-bV7HCJ{w9cPZS;)|CAFq4% zXo$WXo+BASM6*W=((bK@Ro{fAj%H6rEtH$Ozc}*xpk&WO5qa-duY*T>It4wtcr_RG zNV+FOPTBNWI_gNd>(~Wt)?vCrjM6~ubzX?TtJ1dun0QF&`k=!-`|I@s_j89#N%_xZ zsUz-?@OrnFz^hRu0lW0gMV-zMG4_n`m*>V`8qw=pWli6>&fIo*`Hb;OBb|5f zY1H%Gt-;DCHvGQ4Y%*U&%o^__O{en)U*3i(CmpwEt_~W`x3L2GeQMR`M^OTj~CB%fcpQlR_x%+2Ob&#PSR0M)IP()l~(n`+x(3z!r3fcgqJ z_jBdg;7_fJn_`!Bv=cq<`}61YuznvxLpF%7HZD^>&ep|HUj~@pk+i!L(8!^dP<2J* zzXz;to%7^1uMGxtwl3Yef_kv24i#i=`Tn-^v!;hF&A+#y$J>1VOL}0BUBBzu>Ao?! zy;1i);el`b8nx%zo-h4e@n=C#oK-{6T_gHLoP&UwShUEHU~(8{`SyZdPx8j8-IzsZ z_qt!ry};iPP(Mn96>~~sTa;&E0N8CG#mFmfpCm#XeKn5Z-{{rnh)Lz>52-a;U)UBf zW+AS|2HuSK&Mng~c;H{36K_iW(0a^)TaCIXqNzt$2)Sib3lq^#6S;LPP&!2daRUtf z!Zv+qM?Zo2cLbwNPdFxr17Z|H4L!XNbvTji9AC)?kCAJ4>!MP3uW|= zJaN$G9phcQC+)4DcKwrt?XSVHDPfe~kL&}|akaw^C-8Yc47O8rIYI9Sp#PGp zKlDG{&p@b25WB;#^#Mk=03n_2neeao;}X`+J|dcM_BrWsa*Vd+?`pn-WpVI^cK~zz z4m=z!i){x}#}EWS9`#@`$c^wA#6C3`rFt9KU2&@<(wFxsoh8mZ2neDb zB$8YgU^upB_+-I@HhCo3tV`Tk*w=ig4HJw7bh zDQnXFfBvDJWc4W`{j-aBex)1noz8EU6gI4v-c zN0T6fB-}bNlcs2ZCdx-5H`yXwK!igOf_@jQCkO#gC=UpRcd4Og0D*7-Cq?(U(JK+d zmv18iDeuofsnB8e*G#7WzoyfBmG)zC{lhYnTtI-rhSh(!u%t%ov%x((R{Pl2@0&=6 zcil*40WFpBy(_`V%4Y#K{}J9X(>*CiFY4-(t@05W4m<2lTHI5$NHbC>?}=lyBe;k? zQ#E`#|7=3OYXq?ecH@b3%cls^`Izrdrd_!KqvlWj&2&)ajs1x9IX#fg z)DkCM)HiRK`$60_Y{P=l=G66tUOGP`+?Wo@tqn*ze})iQ-YazR*L_C6Yci1p$sfXP zQ#%PxS^cYLb|M3NHd2TCuFC7>lC|uLe&n=eUNh>^%y&IRKYj-L%zv+1D{njKNK+!g zgm&O(YR^YC^0({%xfJO46if_e?jEE^J6JZS-S~?wa)LboGR`@({qlv1+jfg5CeRPE zl&e7^2%R%z0ClJLb|kJKr?*sKAZwS^Dt#hCw6*o|Gh&ossZNHPth3mB?~xjZimYB- zb-i0uKS_vS^Y#q5rwKg9Uon}BAr`{Xt@p=HsBC0D1qGzU#Pb5TYw~AJ0-!0i-EYAr zR7m3vwBpQx{2jR4MI*ei`5i#0hk)8MdioL&PX6!djgSU$0FFK1fUvM5Ji8A;K1dC1 zAPpF8F&gi{9^NQ__%95n+7_=$MU4UaJCF3<^5M`&SZ9z<_akllz?JLhZey#$T{g6S zPxX8HP4S=Z^%oo11c#ucYw|>8fLoHE25E^eCR_k}#{}>-zz1cJv*+C6X&5s53$v#( z-mD@1n;Oo%50cT>E!BYTVjQ$`_cj?1bl53{)fHAeKmU19=<3&~GoK~w9greKcNWl2S!Yf?f|08rs&6$ zxeE?YUimyMglQZmNyIux#nS{;^PTt7&b1A`ZmOGV6U2IxN^PCx_6Rd|gEv~fNyXSm zGiYmBAer1w8K#Z*U7D=PH(8y;4gF>%+&3kFh=X>K|7{#yYcIO$@Xm7mNoiVibI!Bq zUWs99M_v#0=KI@0PwnQG-^(E$$ElXqBSa^8vI*3;Iu5F#g}5w-_R;7-hOEvXo9*a; zYzzQHJh+X!Vu$$iRp5Ndn}N(t!j#a4APe-emHy;<`1e!2eHKyug=r&Q;sobsCb^XV zIfv@rNtK**Ku}o>HAd|#U`QDrpKRfM>FKkV`~S{imG`r2D|UeFg~!(qd?nwKfI5q@ zANGw6(?j*bRmaBH`joInf>Gm5QGKQwCdKF(>{5ZozW8fU7MtNvdsI|xWDoN{=Wx8r z=i|LkfMe+5ZB zyR}`nHvNCj;q~wOCp%xz5d)zqp9mXUjBlgAx*vV@c(0Eh9AlvIzfJx-27x#lDQAKt zGLPX21io`99-&3JD?x6D=4y(_YXSm~*g6daXirp~-WVi03~fIl#4I|zarUu)>i zP7^1aw-1tN*$AF0*KWjqeYr&F-vzZ&+8XxK> zMlA)3#qiZ`CQ#Im79kwOv@38(AREefV1X?*sUKqI&TVGOs5|diJ9w5HyKA<+IeBd>atL*PV;@HucNXLW$5}gk&St> z5Jfsls#3kssE>XEb85AYs(T8!e?4(N;9PKBiW-Azom>tuU9j$B!9@eBey!P zhvqWIs%dMj>!EPidO;NJa@p@=cb#l=0#>sX$D9q&$OC8ZZc(?pn~ZgyufMyg|Bv=v zWYFcDEF}Yk6aawHRG>mG&hP^>M(xPQ1{d&If_)Wwx)PRSkZ)|d*P{`&ZZ0ipK=2=4 zUtPP;@kv9ev)Rye*Q%Y9Og8t(c0=^{-CX^Y_9$%~el0Xx-f%SAbk!rNn>E{Hk zZQL))z;@ub^Lgq$(PY;$e(*Y6DdD>mh|SM>+ar!{gGF5WyL@C8jsM(i&G;`fKYA9*~o zt~_3LNDnVueY8&f;ftfu|IzC?@2;H7-e*JL2m5Nak-*{ThSg-~71%M*_hA*==FZIn zpj__XH&CjAl_#|1>2n^sOHh|XgvcX z1E_rE^8Z)4tABDCi7M2u1SrDDe-YummjW)^xe7DM#r+52xeC`LAyLa@U3!#{W0xPP zz*{-%hIF~~__{n=z4G*lVP~8X+3{y1i%Clzy0N_8cRi?+DhNtZ1iiT_8U+PnQ58hQ z!xS5p@NnugB1-ZC8Z~oTmrnL28EikbPhS=^WHLt0WDYi?#Jt4CB1k9@^rM<8$R=nA zZ(WlsRJ4^d>+(v|;Z>TCx~h81?uwuDO-$3DN4RuOm!2pQ_)xi$2c&Rd)W{bE+zw71 zp<*an?wZXJxi#;NM3@n^PlYU@qYx}22PUn@p%%k#5=^Ear8~<)fqhi2xj>gLlZw3a zM;>WznxdPmsDc)1d}I2eD^2EcK2Cgnfp-M;CCy)*4w&sm+U?4)vf|F-@iUW-Ym%6X z&faj80>7hAVBFQsM0s+t+HSNax25BH74l1UqgnBjEILM4eMo~OpX=4UORq$f*|{UT z4yWme*Ep+nIwq{W3<>Q4B&~-~mut}iP*k~eQKa4Igm7IL{miK{HOGXS};6K8E znEMYDsfWj!#Hu>#o$xKTkqDJr$#PWR)@~lA+!qKS1WkB}=Zo|}e{9}6B5}>HBjGVr z|82FB>d-;DR~kIc6!8Z4E3G$V3A$ZZvmCeoO;sxeAJlVC8FwB7-eo_IEbH_aEvFin z_o7!O7}|N6N8D;9YwBMk)OdeB1Twij4;`NAO52-xW3jJs*zst8{Uy_-xXBiovK5DC zM@ms9)BCL14R+Y={xYJO@{B|6MP-$_Prr6xaT{=YH~#IlE-a(_Ehv7gi3B?r5gekKS99K1XPoN3A5O+X%>UMqYkG6GR zrE9OCA0FBMWl_?kDe&e$2Ql1R=*rD8ovVA@x8J&2bQnq8E?4}nejACo9QW8Dpg!_Q zCM$*xWt+*_s8^T~7A}{|DyRK6GwW_Z+n<^&>Q!`xH_q|z2XECreNPZ_vqr~FUtd5N zE_aCD{7mopUVf(2j3^&J*(9y}ayN*kITVTr9L*W{Cw9+{AoAt##s?L#g>~ijS`6iI z+WTBDyTKYS-rBes1@5_5(sV#@E{kz^r7ZjcNz!Iafmz74`B^w}^$oT$TM{^I+=*hM zVVaZKRcbF7FEgJfWM6MyItuJK)c-Ef$i48I`PE3^w{`A4Yh6H)0|;GaeR~-^`4NMO zn%SRGZ~gkLUb~~S&&x;WoS!M^ytlmOyBY@wR#V}g+dn06e}vm10U-Nqa{g6ZkL)9EYTE(em`Y95 zYV%q$FRcjo%Rw3XA;Rd#Jr^F-g!5~S`+(6Zir*0Uy;~h`(6u|q`8`X?NCIGbIFSDc z4om?r3#(NScw*(T>@M^eZi`I(%bz54BfuYj2B-B;UG4%PNKljO^}8@Joc}%p2-Pg96@FH2-415w zj`MPjNMrnwb%9!7Jtt{#mF5E~)eu zg>4}ST4+q-_iZu7T1@XcrgQx&YEhKKFGLa`>NpU8$K%iv)IykXZ40-)rVS`NmOxJG zY-0uXNgQHISVv_WbTyIJEO>zMBLH!Pz^5L+9VddX$1^?d?HzC-d6D(JpX2UvYdY5gw*i6e7g zu5b-iax{|Gzo2pem?TSn2+XYpXDz2A1Iu|RBarm*Bu>@|j>mXjF2;et1c)!4bG;U~P-QZ?SwctD;4L@a33={A$`Hz&acLZR#sR<)LP+ zN18WVpplE>5iZ4?32Zk|!=8L7uf@YQ;I^P#npxL=k}=$y0#RrE@$CXOH5023<26Jq zukM4|oQ$Wgnk13{F*eAE1T!aDQ;HC=Ngy0&`y>DL*cZXsv!RXGahy2U!}nYbRnWFo>Uspb4+DS+ zMc@%d7@(miBk>kI3LZ>=3+|{eclTe6QDalcNFqL~oKj9baOtoUn9|##{s~)77XEe? z{Y`~nczhWQi+Q}jKoeg8!aNpw`3p|Ot^hFrD#wxSy26i~#fiA8hYF~oziOYX4iGBe zaP*3&Btjw+leAp%&;-vKijO@Jz;eN4iU1#!oMk&5N#|B9*OAc>^d4_y}82r*M>a5^q2cbMXQ3 z%A?h0w`F{cb+KCJgz~Ev&4;2v{0LQ~jhsX#B@>p>KXDvc?DkacWN4;Y=rM2b zc=*Q|=PrTT{8A`O#Rzgp6F?vdMhj057k@n`P!uh=ry|ngucDQDbT|q09$grR4-HHC zP>4gYQ|y=G4g9tYC<@c%LYcS=KkAg~qz;;(mCt>ne_4KMv=sB&LD+W%92Ca;7MAOg(!ng7&;+HTRc&rrc7kE^zoC1gSl zK!KSYH*O4%gmWXELUZw^om@6Z+_de!z{uQddVWA7v0EB z7bXJF?;49JzaW-R6`$kIzPXc85U?BtxUovZdX))F+K`{5y?`x^Uw1yKvS4R}H*~It zH5XZ?qN@mU5Xw1+^3}6Fx2;2kH$o$^T=ea`LOh1fzsU)q#9v|nLD%J15cC%=Wb*&9 zcVA&m24I_@zx2=(dN=gmLFp#+rUXzr5)c7t21EftOsJt6dR0SHszyYm8+s8m6cGUx zX<`QzL_ysAGqeBB?95zyvWJuN9OTN^lJ|X{+hy+8PUk9z)gRS4LW5K_zrb(aV9&^i zh;$G+@P;+qN?83a3Er0XUfya`^hdqI#wJGkve7!K8K@eu1QHlpdNn&o%P@_Nnzv3` zk3(fAz9HMRj@~s?OE8D6*?^b}?z`bH0$p0NQd`cR_PJ?Rs>etzO^&mWmLK@T`^U5C zh?q1I*OuY|>b$R$U=AL)xvyX)&j*&3+IN9|lRnjXlG6{d73Ym)T&f&ca3HlZ#s`T5#*H=ZH!3c*p1vp> z=S}<8{+yQ10q%TVktfo~ZzN`iag*ZT>HQ}AM58*PWH8^e3>alp>J1!3BpJPNep7y7 zo3MzXpMBC`2Qw8_&t6WJk*-&`-Osn;swM8YjF%Gbw$u!giJJG>VeRg@g6RfQmo+`= zyD;oH&U{r_XdPYetf{1{)En2DZ))f(^3zkKnROwn2ghX0TR zQ+8mFc!kkl?q~UVbSy;E`G(UPdp3zx(*WjYH8m8%I;8`HYog(QUD*F(zF)Bopv@z( z@ZK(+`IjEMaOpq9MD+unT#|5!YnkJqveiZS70ios8`sd%7rb8EdZT5;U!JtO(638) zR#o#X04u~s0taI###1lR{ip>jT=I3o%Q-HWsaLmpEUT~HdA82;=<1V4?3N$hRHS`g zaY!%i?7OP`1jl~o)utia66Oo{6u4L_7L}-YG}P^&8fMRfDXDR(9UAtV;;YEMfins$nZlt>ox?4V=cW$MS4s z&IBw3o)A>3HZ0OCtK*+q@W#UV%tEQ8-NXg1!DWtCET^L0*B`5fbPF6y?8yY~ziotF zCVf6p{V~6rE%|%K;?0x(KN2E(KD-$D_~3Qjy#v{2d6c430G#OUDe%QQZ2NutcFo%M zC$;a^*{FJ8c^|S3+L7hqo3r_6>+n|Yv*BkO#jGC?fRkkS{b13PPbML57g4+WL8%RN z539YLGwB2p?UG9VCygxM!&w*!AbPk^9R`Gq=hfHvZizsm4ePHR+BRQ%;kxuA#0*y3 zrqkK8Ihk+ic;&#!!b$+K2zq`HOZ%)h0B8fuiY+_PN*MQxydiVOSur zq%HcB>*r~VG@>hE|Bs26nRMBcln=aS12T8;0RNR!N}L@RgxJt}7QNX94{U^Zhk_3) zXHgg}HQFCeO{ugzm5aEp+)iHqw3lt6$s6M6>@SC}b+{h>{ywXA0?d2zfG}xf@O+*} zOYs`FiE0GJx7uqYw*Et%1fTa!UCq9f)lX~I&Xm}y?ms)azBUv6rilaQ*BEq12jdY}#E4r0NTMxd#bl0x)@renGBX(X_F!q=Eu}Aw+%MBcUiGWE(4` z-^PmSt4?es=izqu@QI#@Y_F;46QB)pItpxq3(t+NAPS z-F^I_Vg1I|lvHDHCqKWA;UJ{>WnG9$v~og#&E4KVvY{4^hmDnDXHom&97hC_!XBvN zw6GTX`dy1hMw~+{S}oB@;g7{|Von@ydf}rFSCejkVI@_fBD(m<9C__u16{v%mk(_@ zmG6FSLh-{aqESz%FH|%Gv=e?>_p$q~T(Ia;|18vp`lUBu9qurp!HeExCtX$)oJ|{6ef&*b zqymYi1^gCC5y8;t{KWkC^|uD4ECTK(-uaNc%id*^mT+d@<}`JId9$NLY2O^mJdC$` z{Ma?Y%5CczwR$Y{1I_|O+&{1!al1Yx@Ze~Q(k?b}3%&EkG5YTwzYi|BVdD-m(dqNu zBU4g=7@mLTKDBR|^qph#y`5~|zM+1{fk?XpN6c?qG9YBYk1c=#h>cR!XW66?$rzHL zdtsIbN-EuE060cDq^ie$kopdOcf|^&!^c~jeB@LW)&i+1)R?Zy4I)i=$0GIGn5p`a zrJPUA2hxPs(+!rY*dO=bKjNuC(e)SQzEp3~y=j^8lFh-Xb=N|soX(LPKgz5}-uN)f z4D-nLCyVyWX)0T1o5|L&^Yp>hlIR>k0XDOrNe1NSV7m=jCtm)?a>71G$&xq zJki2#p>$g6UV+qI2jNsc2ja#1g9R1|K~GO7Q8}zwXO&3Q#F@ZhXH?`F&C@m$c1LB) z#=ALnj!gF)2CcM$7MrB>n%K&mEC){=?>+~&bH z0`22B%E|A|f4(<68%~A&YNmjC>5hs1@H0F(8fVK37FgH^?P|7x58lCtTB)3|J8=Jd z7oWnF;6h=?nw#ldsn0PDfDO7-S-(twhCdmg?60q6H}G47LI60`VDIclVp1h-_@qIj zB;hMpX8LuT71=TUQeo_UxBS1c>y|PM5vfT!7`=v+sZtAo3W%VJAv4$EY?F_ z@Vv6yzm*sFSo59G*pKjwk4)9;X*2;RfZOc*+&SsxMou)zX(R;KedQj<>3P=bStlTQ z7_3R>xQac-QWH5GK&XJ!BQLr~U`hcbAVpvWoXhYS50M8e-)Mlu;$OlOA6>yngr7g( zMpDJNJ}i^!BfMAutAd%tF%D(8x)(o!+K0NauI49ATEdkrb42V&MqYD+iQ<ha6`=k^}DGJ$OEdqah z<5M60qbR>DS{m|?=yoU#fbeQ!I>~Kj7>n*s!FzW(Ea@$lQ0h&A#lt;4ITAK>pFIT? z|LyXZFCdter#mNs++qKQD^Z5vpN*oy5&`Ya@sSR7Z$CI6^^_%;MlLV!cv=#-HKv&a zDsbhQEOdFm*`9&^^Q`PyDY*}MIXe$fC3QYu)mep$C%3sm)!8L=t8`qF5XN!0*|z$w zXDJ;2Bca}=y1Z4(hlTz-^T+Vyvr*5p6Ks{b;OgyU2-?zrkcKKD$8;p1Xc19$Ufp$*ZH4n*Ygr978eP>!N zf8mNWoB?|CJneGJX)^5UV+sh$70YX)FY|qFXUVwXp?5CR4BrsDW(`fIhX#P3_K0m% zSUEU?_K~UXf8O8Hk+nc9fm}y_znV1AiO$qrK4c&5zvlbzl2GuKRlprv_wq7wsY&(r z))||?A%^NQf^DQZ{I}p}n3!8@R9F)69v&j|+O^)b=M zex&^9ch{u~fnwN1-BVqIgVcloact_L&P?i;es}FH_o%wm?`~;UNoQpU9>Q7z*~4jS zE}B_EAqol}R_^KW{IeyRu}Ay>Q_V2B8h4lsY&hitViRKQPAT9umaqa;2yqfWC#9pX8V z_2rh>EQusvPEsmgUc^5gEzpKqpCZVv9;HYN8mU*tZ-L8a{5Ys&VMxyW_q4EMXfOui zMaj97bXIUHR4@-v#=D^Sa-a3PLt*3_bMQx{xvu(PQH4NJ`nlm!r5_a4>`P!Xq(_51 zb>BuB&xpzhj49UF5Wakj~ z2~II^r3^K*G&S70{2B_#x-NfGI_6NAD82>rd9SYhLG?67yL{7!g&b0}V`l47b;!c^ zE5U={$ghYnMOvQC2bH}SAqPW{8=GoQWhycw;59`w9OKH7QRJKC+dCK4_lWQXTuhgC z>KydFnO1zBOnon+rosQzD_5nd@;;0g(gIanDv4#2H*h@`Qs=cQUHU}YiJwu3 z1W_FuN?%tOWw`URF^e)pWQPJ(de0n^+ZM&a>$YkNRP{G@!^9 z)t6S#WT1gR)J*J*C7ZI97HU`Ai-Mi)h^(lG)5a=dc*BvTijEA>o@ui%?I|-bV!qUoLHG`o`yji@|N<|=1)KH7k?|G#ZFxo1SZj8yT4$RxV<}6gD{84csmhGQGrlK+}LAyGu zI#7WbE4bpuTVErbteAe8_B#!9Jx8MqgiSdd^)w<6e#r9lu@XAEcHCqFYrq1}JV?lo_;F zTy4}zdxYlOg5etFJ|YxD<{O$ zUpYfMdj4!$6GxMt{sy@9rC)h!Gfw+H$c$he(qu$swVk#|jFqA81E#2IU+vcIsz5P8 zqO|Y>Wus%1{$hVC-*egzK2-&ZY}G!!43%nn5LA;BpOGd^Pm}(XzP4azSrJ`Y))u29 z8;87gy^)@>oqhYx2Qwh=I%S^3VoqJ6^F@LjLmy?Y-sE1qe4Ilz z!oF3DP>#O?vhjL+CHd^~OtEmM4AetXQaI97&XUpbV^?p{-*d@5b#4zW;mW%Ps_`dod z=VI++)iCX>A1za87kF%ed_uosLYlA?AWGB{tmN0=lrSNjeiPH9XKY&ao@QeQZ*h~X z9uw=+e}dYM?YA8KG*HS`3AivA-F<_PoUY67pALn&yL2BvY;Jsl$^-PN57fhMoG@-a zbAV>2Lza|=p>0irL4e};z;UO_hgwl?SI}5ZG!#>GyxpZk15 z1^c)yZ=8y2i16kIVJ=Pm8mA|)$u4(Uf`IpTx)URxrrr-6`hyl0u6Yt>CN8FHgShwz zS62q2ppYZyIVUl*7ugP4m9j)$CWxRD9++YWUV9&3n13J<2!s{g4aPl7or1+E_rW4b z*3^-Y-7Qrk1=ho$yPTpwJ_{9w+!fSjwVOUaSUP-e-;mCSsk?={^V8upKe6jb9%$n! zGo-NZ%oXxxH&aY&>e{j=9zWoG|Xtrpo61V?Z4Ak}BeYUald!cU4l z_dw4iMpkbAKJ76+sn2C)0KbuO6f}SI*($qW$j0bh81zoqY$<=|&Blnl?U_qxPyXex zZP&~?uNSUgZnio&w{nPh-4MjQ2z*<7Z^U?xz7#sZIb;#7>ygt!DM# zo{f%Nz~M@TeE8GjmY%fWc~MIf2dDjBFRdm=AsU^jF4@q%@IBx!{6YtE{%5HFN?$!anjQv(J z-s~E zDBCwC@53)nPii>~TloSss0$eGEg8QX&_9GEoRk64h!4Mh@|Jt8O$Rsr9WH9WJ(9a- zf_**0@%(v2BrmJN6@ZpRk5+De;JrVjnl~wNd3fvN7eS$OtmfMAs&pZyE4uuvyjFAn z*C=Ax=C{Q2DHymS@XR}uFFx#$cW}-9m_4+adrLV88A1nFy)M(eycMdtp*8evXvCI> zC-!y^g!}6=HCnAg-h>dY0Y{1Ec)xus2AN8P3gO?r33#a!`8}p;-Z8WM>*Dt_zfOhq zeJjBNDQbMjj-v%Q$lneoO#WR-C&3*-d6@9;d{_8JY`=U2kL*7Ess0aPO8@fld&v7U zC@UUx$mLsc><=`0cWzi9U9sCA%@*ZwOnr?^9f7&fg~-l;?e#O?ZyV*FP!4?6VGyn@Gvk|S}q zO<*<8c*3LTC3*kcOvzN88`w!p#Ou@qI z-c_64z8LofRrSzq%l6fSTFGorP0Q=>=j9}in0d+TjUF4QCth~%-C|AyF?z2bR`4@N3EzW(ZGbbnLZ~oEh zbE6!}j}Th=&2T;$_{g?6ulX&%!3+V7z@_>7L*^;X-o)R|=EZbQp1-f2QnUC4;FWNB zV9jx3q~Y|vz}E{qq4N-$9-L2s6RU);>( z`JJcr=L1+WJYVSZU)Dd4TyrwuQj#2Vck{!GdqHpC{Ea7*bG@Mi+K`AjdzXf;S)V_N zvlRn1*<;t;!b15@5$i`8?pR~i1{DC)v{{)vmeTsM3WSu%r$RKpdl4;o?RB>;_}^)- zWiKcvDMM5a+nHVD*7B-`54_BdWt=5APuk~q~kgZFP=2~)K);7Y-W;9q(eu6 z95cLFEoV}vW#8DC;q(JL8v$faTId#fU z2bv>@y_82%qVlnZ{*F&3` zFV7abxO(8sM@vc1ZvaGWc2OwHIowSPONNw2@?s&nCx_#LtFumqAH@=hB?@d$co%}} zYl=Ht+ReWH9%Z#iCo>wlcK?LJ*?vnW=Y^W(r)&4Q#)m(;nwgy~P&|xOMihqaM|A&4 z%O1^`91hRK{uE3g_QzFxrLb)bf5{5sU^$0ftJ4LhoLk8UQ4@ltJ*v5I+J?ko zrF|H;xqsRYp2C)ohZNMjOpL#{?m{8~w0u^EBVgq)LHy@6iSIlZO-&LBh98yQ`pI$* zXJ2V|Ui$}wfd3m|SPZD112us)AfNtc!Z0qKJ2n*&pUIY(jfzS69~47Ut|&Q|J*9wy zQo@;CA(Wi=Ull|CoXY<_VOYykQqNP?@PGS-^#842SpC273(d-J{||m)?On^dR+~F* zxQ0h||LGUrrhDAE@6+($|K%5+XZeM9|0lojZr}gXFZAsmC3KJY_m0OsW?b#;|4+g& z@c)Z2jQ;Nk!-R$Pl%65Vlac>Q7#0psl#V{X@pP)@+3X$Wi^l1fEi?b=7rrIETuokB zPksF%3Be0Ag5`sUR84=+A^TKM$!?bog4 zZ`-ZnvH6?fwtKu%xyYc`|)M+C&AX zYuod8fA7bq$0swMUw$J0E^S1%_Dj$*87W`C>>a}dXpX|&Qnq9c*Wh=l!h!B+xeMJd zCGh;J+cvBfv*4ACBYrO_(v+<}gmk7Rcq~?NPEknC(|cIRNm#rOnQ;`Z6kuNDkWZ1g zpqgjSrCU$xFL0d3n{(TB`&mopb2ijD7lu`>p0V+|%X;IfF2kT~k*HXJ2xp{!_jn0StqEEuQn{IQ{3Ue{Jq(YSP$EeabIdUx=Q z5Ze*r#GHub<0)(@eaI>lB}ZOcZgSS0$BogaFNcc8Uu2>bOGQuML0nO?W;KsHTw6zZ zY1%9?om@EfwWrSSPC9BlE*-~x1)FuRA#VcbNM-Lay^TC>1;uJ;^+*hBZ;v}UJciXM3Z{c^G6ru6IR%YJm zZ#PA<<>{?g+FOiCND4;qvtL5J?zobLQt$K~QgS=I zy~29;x4=^ZgAeUaQz6p3yc#~T2BRIq>=VbnCA>c$f&1ZXvT(I0I=&Kb(+`mSnQt5YmEn zn3we2JX-a`KvSy-JGd^+lKZ;9CIvKENF)fAuyfXvF)0&M+<{L9b;+j$9je;!!xDqD zq*K}sTyja&%3T9E^6*8LANR#eZLV^3H33@kuQYd2Tk4jU;%M?rY5fC>=r5G;2AuS5 z8_SVXW@wY2erGj-IxlqwfiF1%J9uv9On2mKz>HN>TCxgyd3)AhXs~HvI`%Z%kFEAp1G6 z@G^sqHVfh+V5E=E4@g;hs9LJF=4VuqRi$k0YxSk0t+Yzucq-Ijnao3;huEhO!CZto zDMk8#YJ7%@K^R?&U$F+&@T$NnW$LmhDoIj#vn|SOgm(zYs2fnRcWw-R#BupX^)LpET=Ejp($PDyNt zEKXQCq4%bADsMXRgN;ql<1%fiQHU`T_J-k7Q%&JDb!qfYsC912g*JG?GT^fB9Vr2h z8t}4^(>>)?n)e6RVttwOMz=aHzCYRQ+f zPdGnWDH0%2t#iCN?rYfU^Glx^6?p56Gdr|VP(#AldDOrF@AuZFBq%6tLyk@9VN)K* z;Jf=GtX`MJ^kkpJV^3x?2Gx>Zk@Y7wZ>?7jN`&CaX={wfNI_fKz(w&0#uE{C9JrqUBNXeI|k$)2d&*}!^Di+S!e?C}U8J9q zZ=VF>d1J`CP{1#7=HSb|;{1r%`J|SQ&F8c>2(P}(iGiD1(CkohWk(C>;wI;pgc^BX z@He`(BJ;W7oq$%z8167LJV<_UQkHKNNIZKL`Bl+xh5wj-z@c=XTVf0prg@+)SI8V7 zBdZ#uSvQbV-uZ^7G#MsuvL-nse@r`=acn)a;Y(@`G5&l7Y&ReMTueJ7yuw&Up)~du zMC(2`RBO#Xh*NHZ8dOmDZSK6YHvAFoXY+9bZYysQ4-GJ`SJ%(N_*neeq{W^5cJ75j zy!Pn0dQ6IH{|AK+47OBvddBJHuf1QpLKsU?x9T|-icm-TgNfq1o$e<&0SezRjNg*N} z=ob>mVo(H0dR|b_ElH>f1UYrZNYEtzJ6y9QS#(In*j;_w8e%|&=##)ZGZNMPK~{?5 zIzrKcTCu*jy|xuj=m!VETw)a7DX*;u>`G82o>5! zLW%`+iOB-O;kCO7_ER1~`WgM(E^SkM!gxh2lIq0IVG z!MJ5g;ZfxbA-2oFHE}v3e=iG6mf*dZq2L6vC!Kvbnw=v>Xqx9!q{9NF(NsL*WQl+S z_Db(w`203pvWQ=R1RWenpW76>LJvP)1+ph1ciy22>BuOok;fE>;+FFi!FGn1A}J+* z-8%i-ylCDQTnHgG^%%Jg@y?+k?1_{LCr{tf3%OhHU~_(v5-93JF53sO_lO*^KHWIh zZZL{X*pe+DU^$bAh!e|3@l&AVrFp+yHFZ&8m}!voN`MR-%X~!C>ZjpqpwV-XjucliCNBRk884Ewsb7Q4hy-bi}q52M$r*DSaRX3itCZu*38PK z!;8>=?v>Iu(gk$n6-|T#6{5=o_1U5dlE4OZ=x`x2L$G3wOw$$8YX(&ei7OyAjpDr7fiOixR zRpyb`QMV#Hs@~@z9hk~iRiLv;#fs(OD8m|2(HbU*Es`h_GT(h={D{}o)SMDsE#o{mdj_9Hg znae(=?6<>0B$dcWR(eN>PSgbuWM)n1!tE=b5+fqWXgc&M&c3iG-Rw@9o@589$Y(W*F4L`xyD6Qxy@9L;r?6|q# zK@;n&HtMYP>bxD_SzpoF*wxv**m-xqlP=cPYSh){)%ECqLl`!=B12g+9t~o+1tDx9 z(g@wObI3$IOzCh7fU*+RG(eaE_QfNoRC>ZJdrW8mKtQonIu}jkJC$A&%bsH>fV~em zzKrq9#lj0QgnWU*oAnN7L!m+_R(P5B zWF^Q7=($#TEEx+wh8i@x4=8WJl9orZK5Nc;!Fat#<@0)th;ZwKF-;w0Fb%@V7~_05 zNT@`+he1OL$YRy;A%A2t5vG?t&H@^RsIXHc(Dy8~MJ4z&VYt;;6Iuy|lKz7m6b^&q z@nAUVDHn@XWPm-E5vllz*Z#;PVDL#8Yhn)$0D1$NFgyU^!H$aH29E*o`R2(Ee`LxQ zOq4Mw2m%6{;Zvc=z-3r57G_KZ#a5zu=n#L>kg7d^#HdbkNF4&gR9ICQn}7+*2L;o_gLrzL1th?cCevol z$Z$MN0X6xl68t9&6+)PT_`yu+tR(sr6!XlWWk%i^c?|-l2hrz$~MA~GL z+YhEq2eKw-*$){Y7wQX!ghc8x!k-CIcs=;E5_Y`@HSrg9=ETbpE;N|H#?Jt+CM>-C zEBxxjk`QV^bgF;uFDeWL=k7c1EuQ^Dd=m zfLfkh50m8e*xrCFuSvce6e2=`wiYjaT@fe07hx{Q;aE%dAO#x49lK0E3Aa7m#A6_$5+C`thk0nAtK8$H-Vc0Iig4^|x+E|WwkG@z(a6nf ze+JBne<`muTznVeMjv>b`-$zo&~f!Og=eg<^Rvh{VnCAD8w=B+f*)~xG7kd^`oUI2 z=5y{ZvA|CrI6>adlsN=6%vU5-)==aj`K@%TOM?lP!GKV#D+lwJl;5l4 z^sRf>(8*iB?WbNC6Tkutpes>uAr#v`U3qOpGj1ws)42*7WV0Cpz9 z&z#|Z!t=+LJR5f5p#1{>*b{&Ut56aFWpRra!rAEFyASrE#h85z{;&CkKWH2v!~g?Y zut|)0G3S3H47r53m1lRdA6>|Sf;{Qx0rTe=KxD8oL`l|ASJ;CO&Tk=U2HZc z%+lC%|C2C;ik{lUS6k*tT9)%~7AR<(X&2rG^^*Zikvbzm%czxO*TSnF$IFRwh}^r!sJ^#19-f#`~U2eurBBiNDkU*2r3UfC_zAnI4G z4Cfv(&vs~VUbidO@E@(j4Ln{(N<~Oj1hT7YVh;(_d%b^xW%~7)*wt*EQDBurwUOFS zIdZvO3N9F3zj7TsW3I(YGX&(-3wcuPSf5c5+xY_Jf=Sgt`sbo_+P${BvR#))f$N^p z6q8+UcGh@DvK<5AS~jY(Q@Q6L1ru~{$00PHEcqccVm7M~+E4ji(#6aIq*9d)ma!~5 zk#@LDMhLR{U}fHUl9D7HEVS`Bgq*Iy?VCwjDLetjG!lSyVeKBPf@Hha*?&hezjdM< zA&6{?d(2w^@rzpf%EAw|`NDvr7kT{pemQ)Wbq`&=E=YV}-ti_yPBo~?aFJjq_dwZt z(EDtb4rKmlml;iL4geyC=K+Fqw4+|(j|KR(FZg2m+^jD|tEzCRHh{UXfnOqCdEMCY zgK-LLIs;K1YU&^vc;92+YyU2BP6vOno142QS%?hfxPM9!jIWWBF z?7j^itWLnOYcK4b-SFhHg?y_1`zQ%143EKh#)}=Xg$?=LF$sTk!FN&Vwa>CoRGl@g zJBm$~vb-k3gZJpfLj;yV_7POG?4zn>H<;5xzbe>|_-jf**gcPZ+gT8?tNOG3{NBUx zw?*<*SAV@mNbc3GUiVEIKhC(e_bw+LShor-E_3B{R%2*IJ-56R(2Pqi)v7OfMN2L+ZX=LYw_1|uhS0aIx z6kQ!mA7Q!we7S(%0&&W^-(k0FiWFyJ5Ji;g+ZGI>eE>3Emgk>clSRZ4aT zu@{&2u{+?CI0Ir-`|J9LILZ)(>EuIS*G~A(gMpHVQ?OWrpNcQ~zQ(La2AdUZK*O3^(p1a%7%T zYb7-nzi8o%!`W}^RdBYsuoJN6Vh5N*is{K#u7Imek7hm5ur@tFfcRZ{8^ zs3c@7k8i%*qjGX1sje-8{M43K2-?f8M_ARHT?5Y|Ofw_8irc9&NF*DaU^7+1 z_Z4saNZt>?aRxCt2mvd;hx32@IA8Z@UQ|p#C$8^3X+PNDNhI9XX6s;;skC0r#-u6- zkdG5$wMemiQp*Q&nmW6Y_^|9%Rhgg>L6AksH;%Q;dJJxU@@{F?k94u7G6PNg=Oata z-r6p*krz*LS9D|tjSOP%Cob!Rtp?_Ohb`z|IocMOyAp1|G@!R(wi3P;P{_SC9=^Ps7(A2L*pn^Ur6SkA|O8bJE% zb|2+z(TIW*u0H??kpu3tt$uP>=~6VsHw#yuut$2!7SF)5-056`!M;$=#hU>S)yzPm z$zF@gC+*Pu`>^Okg!7Vs*7>gMQ4w)MF!szzv!2(&oY9r5^_N z4nR0NE+Y8F0-N1x14X`dN@!Fk)3Z)|63V;yN}~VRLq}OX!4A;aVxlGwR^wVy`h!Qt{ryPIbPxPPFb2CDdO1bxjGs1R(c!$ zq-F40o(jhILH-d{%lY!e9hFDRMgLSjtRBznpMK(6^ALHxsry}H_p???-jCy+AV#LU z!I%tote~YttQV@9x#(;#8P6EbVq{{~*;V;D+9;J`j9)X@+Z9+IarPmzPPD8EA2Nf_ zqK~F&n5HNuINQyS%qY#m$(Hq{GC{(!ddGzI#`aq?iJcN*d4?5~_NH#NnQrM?Bo5n; zbuvpQ92yTc>5e7qv{jhNHuR^poAp2KAO7(m3usdhK-<(%%nG`-EQ}onC^^7O$P3k;!_+c&pvd9e98xtEG=R2B(?J;+_?)`w`b9T_T zpxe5c@~U9)tNzg}n@9H0F8ZgVS(`m4Kj+5OP&Pu1N#@o(cMuM2Q{?(BuDxF!VK9X!s-2)1sZey9>jNdmreOL}xP|P)sSd<4wjx4=Bd1w!^W;eKW>4 z3%i+K12M8=Rc#bg3*#4|#G zL?&vuT{nBjX!uE?@sH%keQnmG&6M*N4!joKe=j28bcaiW4w+lS!(u9byC{c;7aa!N zv6&Qo#F|6D4(l*uya?kSYP24FiXE&tk-4Y3*geV7);GS0%|wxy2Ue(NN@`g5YuWCV zSvNn$F_HtMgXNa%C%9)iNzA?GTgrL6yPVKk>DIQ@W!4VCbL&^eLYnyIq1k=(JAYjPVK9 zszSGGNJ>R_dG@JS=zBs(;lglR2TilR-Ri(D8SIxBY4WSuP`8u7l1Y2VY3LQye;fbo;9+rLy}Tv&3BrU4vg%3 zx>7j%POP)>v?D1?)>f9rDy79)vM+AT+sI_wp0?~Rszm-sc#%grovCj-xNkH0;B-3a zx%Z0~R4m?CFS)DIsJxOQjB%|5$kbANq3-zbkFnnPxjc$%b#r%!rEx<5GfaRDjbytc zYkWb@m>5psL%pQZ?J}`?3o<>EbmZl5x2)Kg8I18eho|Nqt=d`Ey4X&*r8Aup<$Bmq zz40x`Hr*lmY2UXsaR<|WF2?quTWuAy4WaHV_N@_ZU*=K6YX zqKZel@MH!fDeKEb7BE>HPAR#BG?D9`nKgd?(WB&2yv*Cf0S=dE` zQ(p73CR=St#~sh_4oL48Cw?~@@2qLvJ5AX?Mez$a7W?%43CueMwUk11MVokMZN3=v zVLhviA6@fO)14c%q`<Sz{5Z>!b60-qm7(bV?ZkYQN{R-7 z%z<~iEd#J?vQ#e6n;}DmOBCr7OODM*Ig<`EOtOSNh+UueQLrQ*74-S4A>{vJ>fGa* z{KNl$?`US2^O|hn)8`COU@xl*=97y5R%ZynF=9PKBI|rLM5p*I;m8M zl4^bZzQ2FI|K9)J_v8J(?(4c<&u7A}8Reyk3rqXy;B%>6hcy7f8x#TnWS%CAXRN}8 zb&E%MTT~|Id7cE*#Bev8@VWs*LzU8TgRM0Z9t951MWX!jRhj0cV3cKO{UBdenHF;X zw#RAKbKVz^yte0g3QU7(n#Qi$&=7=6S~_!KId9tU>aFG6ZI6?`A<_u%+Z3AI{Hrqx zPYN*poJ!9;%9G4aFe=9D4nPxLqZ^r99;{<^ZY@{`BihLpyZLr$Dsc1FLs%(@G-qKu zu)ynwlD!cpQnvnIXFiPd1Z?ECcy8ffl%A}|?xM@swz~K{j8RwCe_9;cfi=QV*XY&O1Gc5Jw0?UCm6V0l&F7eC0LBZDS}AlcPYPX}|$E9y|dT#K9@P8G|O8j2^JgtFY42$?8S7dK|`+M`Ea?Bp_ZHK3pbOO?!r^i+ zgIT(Bf#_(K$(*$9Hl#n8j{qD1T_Ev&^{Yq9`7-Ainid6mC0}YM*Cczuaxv@e8+4Wb zSZ45-9r3Ka`!|T&U%HKGN{7Yh`UXej;(ON;wI%^xy{AM{;@h@06h{w<_Xzbm^Zi^fO|o*%&DkPfv?c_;n16|%PJYbbP3Mc7g&fA(e|Y`wXlS@am0(4 zd1goR2obSb@o!rYz@T)o8FRk_J=PVFnq-)xp^(>tYL6I_fb;;6`kn_ikjV%6(p&g4 z*CG-2@WAdmgvlkIFus6X^aS#cJ*n1qQy2ImBU-ab+tgK&dWr!Y>6$v9JM;cmmT88`(VC`9RLfXD z5`_7JKIx0-pd-r+X|mKG*@pwJK7Kp+u8LF&c28shJlYPqWIz6PJUIVfBz@OqYBbqt zzEUhWgm#`}Xl>IK96-VuK%4;*NCI$4@y(?m0gfJkr+WyTuW3Qt4)%9_77(w+)MjVo zU;wGo^|u(NE+(_uhBZLBDt3uxZ;aYy0(e9f7@xM_v|scmBKg2H(6C>`77cm9m)$uP-&FORs4p+O_K0Wp zDt9m@8^n|#{8D>Pzp5#0vx`;yAPrfgPah~6m&pf!w8n<40?RqB-l^Qu%mgE-F+S_j zFe5&sh&0LQ9*}w#v(tJErNVw+3eZq2@aLbhbH%nUBLA2GOQH%c{(lsPrBtk{sIv4; zLJNAlNM39pv}av)vQz+M=rGD)*h7r%daYxcNwlI}HD~wihQ`BMh>v^VrSF>4Y|?3Q zy;#!~P=R8JG3;Zs0KHguPBwO@n<5357v%QwwZ&;*VcUgmITAp)gR;A+eK6Tvl`due zeD<%Us%p(}=Fg2UpPy-io4x+cnlUwC3q{~e1kSoUeEGBxwX1siX%BJNGq@S!@sx5w zqD)ENcj??DV@4R_**y!p7OtET`uIxx@AStUQ8UyXmp*j0P=~_)>e(At8?^kj;J(D% zf-_Q5jkECIZyv3aBE(TX2=>^*EpJ0aspI$l#9RA^HPz1Y_x;)45He@8mbSBMX-%@! zi)b1=g4gP!q8(#L6btm7g-O|QN=E~-#W+N%Y)NAt#wyUhMsWEuddU{rG!4uArPQxX z4yzu-73yWeKx7%z%JP9zT!5C%N941VQap4^X8_~-792 zg%N#Q{TxcJh^drn3p%_D)fu!`b;Iw6!p|S>7;3RM+;2y(h%<)PB*|-a=U|hKw*-Vj zq&YJ2QkZkQRL~DJj?$^1&^rmRQVvAEd+oMNJgR&Kqge5C`XD9l zc!iWPV(lXVUTxUYp-ZI4OTQ}En~*6+;nKR^$T#MI=l#VA@RLnCk{D$-C;{$C;lfgl zn@T}2A-t9cfA`gK0GQ$m1t!n9e_~puKd+i}#WpQ8S85ven*zu>I43x~cK3u$s$W<= zH&njwm^}UzE*0WpVFgaK$@4$^6%x$Db91R3Rp}No@`BlSQ*;8Fz(- zcF3~IJ{$^*V7sA?z43gTBNSNp#`{Hyi9x_g%8zTP)V7(W9C#uMi24$35J-y63DL4w$Fu*Kqj2fi>@#GhF_qFUj)EKN7 z?ahi0TIXgLb{`sx)cZ+4@$OLyXOv?PC4i)4L8#c6+bWG}71{@x;g@F?e^7Y@W+29s zwC6StA4a=j`8Ld(#mF%?1c?r)LHwPT2!og#xvM~7FzN+T3ygRx7>4xujqok<&Nb;8 z70to09Z+QqabqU13Mr7H5)R}BVgfgJA#f7z41y6e#2P;e0hf*xb@3DFS}z+(scYko zRk}r@zaSf^B>^Sf4Gfe+Ks90Dro1&0jtD_DYyk;>xk%R&XH{~-SY}yYv7*#v;vfK% ztDqJXM7*RB@cjnzG@J!n&3GKfDB5l~nY#;fPZg)ZlGp+vyM4v9HnGocYWjpYL751^ zkx2oB>_A*m^gNc4ghg8O*xtwQ&`?P}%ylPR(1B@gHPq1~n(H?{-Gu|Ts4 zD~5h%g=H#2PBPqI8s)+;Q%^ewSQdL!wgLkYHKgHg_3ppjKyeo}Lfd!@YluZ~H8)J` zL>Ig&9!w`yG*^_%s?DLnal8u_WuX1}wlfVV1|N39lLa!SfRT7iQz{6H)jGcKbQ7W3 zTm3P@-^qqJ*sP_thbY=hfSVCMT3R4tZ6$e-iv!TM0jPo-D%?G0>)l=-yZ0%IxYEvz zG_qf_L-5MaTLf`+x5D0!Dt}7tPIu>35|cl-YeY*%k49?@F0?`_W}iKH_~EMPo*abm z(jLZuT^{wzsHcLv{J=ok6;voKq7aw+WC0FFzdqO~D|QqXb1arb-14_^M{%;@kkk z-6RneqEkJ3(y?ZiFCNXcUn~^j)GY6x7)bDwa zcWP2-#N5%Pez(A*(w}w+Ng`3#@YeHswkVor3kp|fFGzzpaUj~IE8|&8sicSLD_)}N zGm`mV8bLF8CRs$J6`#i`*dhT=M&kk!leHp9Js$kJorxrREAR4d9x;)9VJyn5PiXnm z>A_(YRfjjy;lfQ)G2^7OeUz}7Ic(uLagc4?^uNo+YLQwWB=qC zulebHNPR=sDm(!9KK#oT%3)NCj*B)9$$*q8jM}~8E3l74wx_UqIQnmS^DbTo8BH>&B3%s==?j zwqOISKrX^A*a7gICSAIp@(^}+VQF{7b~6pmW!5^u4RZu`|_b zej>4krP~Aaznc)bTef#rPP}ei#O^>du~2M^(I4RQ)p2!?7}3j;i2t+Z6xQ4@@WqL*%1r zpb{mh71P;;H?N)xt69WQIIWhnxZOybJ6CWM6y!iJ(t`qBvk!?1n`TV;ZYpnxZL3RO zX(0Ylg0fS20_I#n2euD;R8X7=ep&hLDbE&KB?hibSgZQzLeEl%-kgR>M$`toH7stu zb{!?4d*x-UpfM-0(@!UC1F@aA#19XKdf3tB&7lHaY#*-clX&3Waizb_EG2MVyD9f% z#YOn4G6aS702P(PT2m<)C4< zgY#?0k>uKWJSjj+AKIa){O9?BAPQaQtG%xOxQgzgZD7^6{QG=c?yP>V|5RRg~`^nR?6~wrJwBef2y`0DlDS<`R!8D4EZC43kJ@76MkgN@h7yL{~O^?Z1F@j zhIk%_{d~KW(L+}0S~M0>AzRt?2dULWz9ku+S!y6^X9~cx8Y#>s+wJ1u)gb%S*B|}p z6FqMmhMIPja*MD`2BU|Fyn^&aL|z0_*GI;xJ+cwXHM3RKkJ8uxsE zKiuQ(%vY(I;6CCNEvD43dTBTA^Z0jVX_2;`7oVl^D_eZS{65XtvYUhdfYSDHq4z^q z%Gk?y)qSFvzmEr*))m;z=IY3`sBg{$qsD}@oEX9vzw0p_aV@N0k8PQ}c|Ep|hN1`a zY(&-LVDy+IRoxH17^Tf!Ki-l}Z?WyhPBhRDGxC*@yG2Qq6+>0tK?8`nv=pjJx~~zR zDdW6l$BP_2SaKoRKi96#DJe7e!sx60r`|4UMH07{QutNT?Npu|{aDn!Bj&IOF#*Ed zIBZoJ#td7j`#=b!W)ysgD|+SUXpfv7&os76-h>64Ga)PQ=3kx1EVgDBN87$sop>-~ zYsh)|G#7K@nuu!PaMA zT8Qiz)(@}zJzR&BT4gX$tPIO>%q#3AyM~_m_7_hKTrA%3DlzBM-nEo#FoDgMOvk*D z=Ey`>4v<;*$_#o~U#ldFslT8gi#hyaGRA{j9g(FNGXH_33$&jPuFznfXMB_yBG?ly z-CCda{gGQ?#P+stPSIvIaj`WI+W$QN7`3ED4ji2q2A%9+Hhkhd2zAuD09MeBp+cnVteVlwqbu^2^soH3JPSXx?xnS!Xaci7rDbGFA z_Q_>izB~S{NsSibxmqVVl;86Flh;zLElR6X4*aYC&G^2$^W_RXpW2FR8eUZ^*T_Rb z5jxijghs?3&C^>+hCny`bH9FI$f{f)rRKWv>A{lDj*8E=-R-xw=of0Ru&yJ{gjX9c z2}@>Vg_kN%IPD*|>P6=|Zysy2<0{bDmdjy0qg9gS>g@ug z_nqcjCl9eUJwqaNZ5>{@d296H>;T&8P?X(hRTm<(*|=P*kJn=F(r1Vqv zWHc{%g-C0D*iyP}WEVXbAf5Hm`3k4YoGkVyj_7dav41Ys`mpVNpjTP`vAkWlwVpcp z3kjv&x&Cp3B^u(uS9wCY7*Y{q%OO0MuQ_DJ4eQX8?ztS78C0bwYVsBK%KhoHN)FohdzaXFM`){vx@p*f=Z*gMjrOI;=$gP>&F$dR zy}=R5QNAYD&hk$O z-P=u4(`7yiEDu!_fDXV><_6&$nBosZ8xBPAsId+WtVT1jH31zoG3#kF++aj zVxViua-2woGeJLfgLBHl;AgO#pxEXEG2h9`jvA2*iH^^z1nbx4=eM3z{kXf*Pn!Qa zFMH={^MvDfSnQa1XvEblGyzs&_^h;tICweXY+<}PQ^dUl%K}B-nn?OaPTmWJaeG2G zb+TwRi{2%EGSJim*9T3bq28|2F|?rHc%XXx0`783Vd zove88J&(cLs;%YTbIdbfs+<+V9Hj4kedqLda;|;bl{vCo^W9^UoWQeA#WK*8>w|+u zE4JO&24%-o97d17fN%bQ6S&IJ__|4WoayGxPiM393%v$IA$pPhPN7U ziP@QjtPWd>Q9E!f>xDg^pIac&;qok3g|kD{<)AQoca5M}TOw98MP4W1bftg09`q?; z(nprFlzy*HbWi`;{C*2)#xZAlGH2k$9q7Dykf(P2-|@kT&sA@j`th_6zo>_;t&1~a z|2uZ?KNG0-wY!)sV!F?PNQo7QruBaTByfZwoiijlrE{*D(`B1f=^=9`m-dP(qpvA5F1BH)kw z;nIQNIHM;5m~yV>6Uv4QF`;Q zTMkGT-7i}Tl7nu^{Yj<#>yz&Sy*Zt#vQ1a{1F|?=Fc)xyRS^&}nBrP;(lr$%>Pb8Q zObq6^zqsq~VE^AX>(LjTQ;U22He(3V0K;AaY#+j!AH`R0eF@$s+$b<1b&Xca*tI+( z%S;E4s@6j$$J@FG)tUQ0T}6yo*$uYlUl`SP0005nsOvvy>W_~hnhOJA1%ux?iOm;%Nq}sM>?M~2)$FW=WLWqHDL9% zd+2P_ZW)T;nL1*|<(Sqo<)cYu0J%x&q~{=>$9r5DW0`779Pi-jduQk-`C*-WuIZhr z_qtIPA8WSEW1g()f_XqVgg zZ$s5gQ{(5JkE2&&>>d@SBCMtm0?;VQ~-tHM8P!hp|7m<1{{it=^{JruPKUL zL@8t%8g#~STv$W^Kf2s!>g?H{Ptabg>4QmR1l<;!BjOQ%YUC0-&4*UA# zPt4Hc@gKoehBmnWChtysp1RSf<8UY_O&esi{Dlcn*+{~Q^yRdWSK}hVoRH{AXn~K# zz0~{;#Nu|e>dIt5>^Cc!bmSG;rXMr1HmH}wZL+>NVZ$q(#bKe(_!-yiugAPxpZV#* zD6zWVD=e~_qco>GAa%L))m|{aYqjp{DXaCzrz#u`pmHnb#4D zoQJ1xn0Ee=E}?Zv4bNN+;hP?|{Y+hkeP%9*D}?_o$jWvwnLYWdc}T5cbu9fBhc zx5qiWIOQcaGL$Q1G^j?z^X?8HmaCxHS{)a0=lno{>hUZj!hTjD+?b1w@vXNz^-EfR zl6?+L4-T56xHtoB=zjnALldF^UlY2^SnC>{K6`tQP!R4IPH$B9R1_-Er z$h3ZpHJtrmCXhYV?yDGJ!soIPe4k3 zl?TI}9vAXN*}9Pq+)u_iwN^|JjEQ%YDW`Arr-ElmpL_xg#sB^F&{8^1vv_3;>H7M( zBhJkcY}E_;3rdX_mwV>}lAkM4T)+5cX=d+(#<{YQX}!E{uK8v{-l&Sd%b^$54?LqDDM_%P-wRT?}7Y~-xEz93uT_HB&5CE#l zWs5X9%0*2H>u*ci)^g5>_;I#IK1nW=%I;!P1QYIdyeil{r?-E)n}h(uuS4RCa|NnX~s_Rr+nOyI7eozr5VPPGxQhx4X1_^N)~j%ac(wFm(su z2Qd&8Nf6RbpiN$9>`Bw!l#fzk2E<>NztYjLPcp|40xgTllwP?6$$8GBoc*aOdH%R? zr4y-U)YfFTL=WeCUws~40^j0v_AOoGGoIS^Erct7}hU&=z{I${E^o>u1}hjzl+WS zqZa^FCJ$Plr~#(^sVDh1kykSs(bg#a{S2@Z0M9h|Q-udfEZ>k#DppK7ilcx}f`yBC zP;uH<2k@TzjO=Yu=&>=hyRd2Cr4QbO&mwEI0VmwXXIM{6UfjJh_$b_i2SQ+g)M+(e zLyfFyoH6GcBS{!YGJ+by3wS?0HUGiE~5TROmS>CGJyucQ$fn_wGh0O`sJL# zN!D;M!EH-^ zd5V&p@9ntH@N%+RHyXYq`h<-PFq|V@gyV?k%0LyL9;9)_pi3)w(!xFdL z@^$Y8mozmrdV~kZ^Au!MA(qn`JBUr+LJd@CU2mx&0=QjrT2XI#`r!<1HuN-wI8K8y*emX>LU#{c zTjd3Kq&}>s?_*7A7}_1!(WVKoIRX(>m^lsHv97+$2In&p6%UkSsvf8bBh>Y9U*%iT zW1aj@4AAzp#&WwxP`3tqBLa?7%`6w7vY~jM`qM_OC+L`AwzL%KWwkL4`suBAw6G^Z z`N5dkd=Vgy(puKif{isK%#K;9FO7haESkWn6xH@#GifSpdOD64kJ(vk$B`;1OJ!h zvXKh}bd|&dU6ASL7!Y$t!@CbBP3w+b7Io^yQ6_DI7(!hbWC2IhhhP+t11?`n9z0k? zlRU}v#AVFH@iCf5aE@La1P2iQL&$VZFiy-BxSVP#!;=hIKIO0+yOTtWrhz{hD2|%O zEIhfpn3}cx1gp(Y2@iDMUHx?2Lp{x*3PV9o3S(&w421Gg^%$XA)KhgnM^+C~87JMH%;nAbj+sgGz?KAo4jwAzgL*eO0$Qn2D^yE0(|Abp z(OZ&!zMNxKfx+8dQ~q!usKclD!|wg4W7hAQy>2VW0q_J^6ChmGqXrK}t|Wlbo9Zo3 zaZipocY5I{EqW0eq!(QLZLi~#W*G8^&#MB5%wt^w2XsDgkJr|eL?U!H2j!jlG zF#Lcq(RA7afM@rT;f<9BBx&<+$&nUakzOAn1>54X!miun0R8``y^MYkCfvOhlRa=i zkA6Ff;h?mva;!q5cj5;CgeVADUGk1~Y@O04Ih*yPJ2*e22}p;2jg8!|@+R&s;20z4 zyJ3yO!=4qNlJywskb}~YDUSFjadG7vHgtTVA0bmHA9*yxY1Tmuib+Z{7*A55?S$L|>tD@oxqA<_JA{)ZSdaxy#th zYFx11Sd8zSI2gbPhTA)H;#H`U^gD-PU;sfs@#xNp58xQ3c?pNCf<|npdZmqLUl%+DoA;}yQKiC?-@Fq|pk;!}3>O6=n!aU9 z;1&{^83Byk{zJg3k7Wie925^wF?!BqCWv6`G#E#*#8w#xbB~?se2`^!8xeQSW!JSA zG?q7UWWj$7-NY`~2ZpdQjMIpMps7r{2JVGj>RHS1H5c4V<3MC+3c(&G-mCYA25UQJ zMx4h&MW&?()gKZdMc(m_;p+z_gNl03{I$zfAgRCb4PTtc_VTa$ZC{RY#6dW`tiJ|A zXkTN^pE$nn!q<5m09w?r>!ghfq;7F2=HYhf*kR-H+mYpoM}v_dA+|3lkH&no?3I=T zN~%tNa&{Uf@3qw#7CnB!QwbN|MXCtpssV>jJSSznN;k_N zO1ZTKje3r?zVhi43%Fxx)d-|Gj;Wg6sg-Hm_kGCk$Mc=H&1u*^g!z&*k683?lH~}Spv%PxgKIPt?j3?GoxK^ zY~7utohTn+$taV7WNS_VcGZUltZZ)i2Xhv%`+qt5AL|AYkXgU)4x{o+7<2tJcoFgum6^-qiwGqKDx23E18q+<+Sv z*&v+Gy9sN=k1EU!QX8!YW?SFR?qf8isUNkfglz|!&T$AItzax#&{sDFzkBF0q3JJI z!8=y(puIRk-JB11?#r3tzi&_7Ier05*yW3vy`S$d><33sT@tf!XC9s1{sLc)R^N>$ zzo4ica$NYu)k&i^Jww`%Xe@mr+9yH?7&4o z=HkS?=3j45rPEyb$HI!)!kPQbQ1@Q{+Xn$Jio^Na9aLmC0TN+R-B>C1Y=ey1e`r~J zx_04E7710ft1!&m#cn)Z@UTlH)~oL-xxE3TH{pUbVb?VX@vWN)SbR5b(iyHyp1bA} z%lE9EIr2RM-NCN>%-TS@04Tz9buiguVQCmMBnX~w4JLPtU}H|KaxGT&rRo8k)ndgj zkIr6v5$v>Bk6qpS4ne&0`?gtW`2DjYtbN1ZE~?q?#ohjQ1??1NvpU%Wo4R^joLC_gwle7v>r=t?9|pt+WO3yq@zZ?h;`(ekz2( zY%J-9uxji(+nn9&;L@Yyt$)2gy|{rojKK$oHb$*YcY!9-m)*y`zMQwQs=b&|ZTvJ` ze)l0C6tm+p-v9BsifP*%7Wqf^A5Un0L=TFwq5OkA(jR^NnlSet*7YVvFjN=_n*=*U zh2*XOS7BHMP)dop4gW`BsJJ(w+kyT66^7RN#?4ceN+E%!W5zAJ3PVSEu$uj8@NTmn zoYdXOs;svwl;0QI4RvTbc){u3o8E#%YEiw3&VYZZbR8brdnEorpC{EJ7k z6r}B>kj0h23J*Pgb)iL~y={E&3I{_~2f&g}1nW+Vp5;Of-BUrRJ-u%)9a28DYP9EQ z@a3>mNo)Qo-Ob2|)3N(+4JMO;Jj#tz!Y7s`u1g)`j?|^0YxvsxTn*X9MqTP)l=*!Y zYww-~sS+WrY>}Y#xI(MOfUAcceo8r8xCT;yEGz&LGKQL++;_|EeWyTsw&=x=XF<}5 z-2bwBr&UZtIyk0n40YY^QWDa5dpFICoZ>2z0ic)46fZHoNY*{bYOv2kZyZp7U7mr< zc~e4RnR4}QVyKe8^sqvGY0pqHXv9I4oL%G=ULrout5&h%vtCQUd@I1E_Ts5;$_`BN zs!u!Z-_;dL)d9^Vj^5{0&vss>N1p3eqKZ`p591Lf;lq}<$+5L}TOz35T;c`IDyy3FNV8d-i-s{s=UXfM@C*AZhHW6Y>-e0agK=E|k*UrA-M<-rS*Q0Y+G#}hfI zh4#z}f2e(1%Usi8vSe-StJW@mA1*oMrqdCpcK1!f<*A{LBPoLZ738a9>5_Evkcg1N z)ya_`N622fLhYN|iB-!UiivK;9*th0wM?3oWy%$R^2-S5?YR5QLX6zo{xeQ=hTKkL&c<7#!T5@E{ z-5EQ@t3ILpU*!5^QnHwPyvAqbMlAYDQ56<`yVhGq%fnOYLD#@4rqC)t{hEwT$kSZV zmTxyO-j=APHIo;v4{Mob{fWL|DVlq5S2xCI=mGj|K} zbapF?hggk0KPnN)l8<}6@9~S!jmy!mI^PLyA3XjoXxk~slIm8Qe@$yJhqeFV>{7+V zlkpzOzsHBpsae|Ff6(^R&vXjv@-Ms8?DL!vUUem*92<*I-0&bSw@G(8Iu6Wn=#)eFCN5^-o;Uu^2*>79Fx8#XuI)9kDC(fiV2B@8oeG}ef zMNYbS5xf1cH^fch{p~|;I}*7r|CsuIPZId3AtRfAdT&*wjA{VYzW)l=KGOt17>LxE zbivD2`g(gISZkgGgq32%YA5fQXYiGT+?zr%sThP{qr5=f+P=yjhY6>)QQ?*(T$f*H zX3M2siJCQL%F$9zoUD@Ka$IhL;bTDsJKHjln3Yi@>!j<7fGPu>FAkz%s$}hUSn;_& zRt*K-Z%lNxTk|F46c9HMB<0I@4umOQs#v~5)(S%-p{eM(g$xDk-!IIVCaRdZ;iz__ z@R{RT5@arvWEEN}WX&O9V2%zitw&2Gk^^z?@C2PnHuy{zZV4xMVZRsiX#V{~th5yl;LG?`?N<)b!o2K?)RE`j{w( zxh?v*T`t)r0<^-#3^aX&98a+WBI%1S3W?#jPLhEdaCB!<;aWd1`rAN zbL6T?=5mOcbvF=Pw7Ug*2!l8s<#|a4#DV1T1S;QOjac|hlJw@#O3)a1PU%M{)oX47 zdIW)34*qY9_C9?A7PkGuK@?bee3A4Xq7lRbd9DpZa9+oqlw7^kNgyqzTSsd{hdq={ z*S&c^+xSNH#xRhZd@2nKnj}cgIn6z05ens!Sz`0m|FQR66|yV+5GX|gM0^ddUO7xO zF=_;q__Ze8t|vaDJnxEuYdP$qlMi-9fsa^q>^3*A#f5@sn5-qHPaI1_PE!^h>PKlK zzkG&qr#*hu4IJZgo9)xB{GN}z7c7wy1SFH5&A%^6?S4a&bf+FHf${{hDOZxPj~NIQ zuNx_MUnIxx=k1|YT)6$Gb0uy0>f??ge_!O&> zheAJM!*igR%PP4+WfIYkmEBX@c=0Kj{z)|aZz#lm1+q5v({iwis%aC<5yh{*`#cDM z9fBtzshkMhHEiC|&y16M4|i#2SU%K^xO&E-@vUOO@zcjT6XC!Y3@QTjkm>qJh=7i& zOQHQ&_}=9Cr@d|k2?JA=1Dm-ZOccYKjWpC(y7V{-rqX@B5lkJGa|nuc?i^Ij`9)O7 zLk;?zcz`r%dw&Mz`6SSQH7Gu5NcN+_sjpq;JyoMpwK`}DP@m_>Ofb#k6tHOw;k`REbzsxV$zlxE#p+I zYsOK7;GuuMVHr-b0!x6|e(8vGi{=)a8MyC*CwK!9^ogFv($=`H#k_oiWPQm|2P zV>hz`N^_meD<&W+P8@t^__zt;9uLGg?|m=*H`;TOjrz zIC$^oMLnhPpl;Ie`0A`O-s6*g=0-#Ijl+SeE@h@dA1;mZY5$e~J#Yv^Y-xTm)8k%T zwa;MeMfSmOLy-Kz)D}xvCVH#?#^dlFWz9mBq_EM)ucmq48~W#exD<#5Way62#?`Z% zG%4S{DqsnM+|r|Mk*BCjeO#!!5>4Wd{N|y|(e~qif&Nc71Noi*$;j9bj})PK@RRfV zzDR9?#h;j4BJoG(l;%zx%YFP&G5PzznX7717x!6$Ip4nv{5VwP)&RZJ67zDa>+9Kj zHlQ-;se0oH?bnTAIfj9TkXloUJOID*lcqTf7GJZMj07~PNy^u}-p!`9LuqgjK!h`} zEZpY<$xs@|(85>;q0bRGv0$EKnt?kcO}%Lk@?ocM&U$~{IAO?67$pKW)F@J$CU-0Q zdz9e#X(MM}{fGTvrR$N|QcO=4ZZR)Z@(Oox=mK7SEUiTiaD|i%7TTKdmz zZ4VIGR8w4refo9vzJBo|LTkGaWq!n9WNCk6@y4M1)0M<&Mig2LGNPWP#m@~ zdZDp+uv$mwxfVH9E9g2HmoFxShQ!LAFWWln^+i!FJi}#bX2J^P zKVs;~N4k2`;=(*ao<%+3n-%sr;tkMX=5wD5QD@GTUkGpXq`j?qv~htWh(Cm;znB#B z$v<_byf(Noi8}8i$v*u^u#V||4E#*2>}llW@x-{<49N*lG*GqlQD0mjp~mdQ%8+Kz z1f*zBsak%`ZpT}H4aChCQ>Z$dKbD@-=y<5Q+^95;|Iu(^yGrsfFt4VS^-P27nSEc= zkN1&%j+AjH60l0Dr-d~{y9Xm<#lm_Z&z?8@#bu^H7lRYZ3&c-4k$e@X1oq_As7QFK#q@Eu`EhU9p4Qz~ zx)H6hvjNzfTbJfc#Qhb^J~x4t*ceHDw`FsH0y;9U~bCJ>H=9nwG^q z9XFf|CNpyDe(DB|<=XTf7n29-ueVPv=oA%%;*#4ukZLnEs^aQJiiVBzpUhNaDpY?7 z+$~UvlfBX*b;*cw<^3l!prhzjewEEKOJCge;8U@uE5(~N<^!5eD2u~Ry;t#LH4au{ zK62gQ3w(3t&lZJWknc{af)}vnm7qI2*2##T{5SDchCNcD$L+x-LL^_QT}sg?ZFr~W z;G1|tjo*dz%dN@1+oKMWoE|_mVRffh<2%&kXOkr!)|=Tg!ot;T0%F>LrQbChA${i0 zCWSdjR{_@IxAGDcVs+9H(Cp*9velSPpdevI_#O!0MxKy#>2fVzzvH26pPaU&YEbw$QaIH2b?;gnj4W#wCm%zVttS zzhBws;h(eF!fS1koRFKH(kJqV&mjvnw*7CN*eC9r@`ZHMD5v_a(aB>-aSLkC{eZoV z_ri47`jKHb*FZi8Vd?NS2&w(n?Dxh~HDXY~nxA4LpRgsTbd*JTZXZAIoAlkK+k*TE zv~{uno)Lo;?u9wX-P-praHUsgXT zc7)~N)}wh&I%_oT?ucF*YY9-E<`_ni_JDIB;&PgjgCIsU)x?AJm#8q^m3k!23Sm;lGJjBh*Qzfg+`q z)IZ7heP4zA1X@h(v73-QJAyr9jJ1HB$HPIWtEk zHGzE?ZaMK@@@S=;6J4_A{?z^8B&pEGFy|3PQ6q_{l#)X@Av&(*Y}U#@4xT=+w0nOy{^};*Y$kdANSiUBPaW|hsq>cPP$S_n}TvCsPX;D zg)9~%@7{yKkf*NY=}2ZrwfJGm{{9@n`;sa=_ynY+dYL8`ZJJ=?E` z6clMR#8s9>=fo$%haPwr54dH8m&?gZ$cu}guqC9c{&nr1ug~}BePJZ8eM64XQw}*< z^5*(5*!JL)9)R;pAP>5EjKw^2Ews>Z*iwSL4FlS9D#(cTJZI*n!XWkjq;JxnmsAN0 zQVuYSCNM83cmxl3H}}>Lfj;Go_M3ra8i5fN6>y@UM?70$x2UtSZ!Z*xXn%IF!d`|q z7X8{&44>}Xflf=g5 zF&y@^N!{y{J+I*0E@=(G*I;}m7#Glg4|mUtQ1QkdHuWIlTo>9*N^wWG_G9Y%fq{y* z_r6ZxuY<2%lszpcEB-rif1=Rp`$WM7KbZtsYn1E^Q~|bfTju70q^*TGUtjf0vM;yD zxbA(k*DTzh&%vwB{vO<)c|Oq@%Xh{e?wj)69r%c#HhVL9TrTuvNYXpUnPc?xeutOd z=|6d0sd6$PZMNoX_L;1=yNrWw-T+ROPvL~K-GOtPW|iI->%8_v&wpwjbCYOE;ZMj^ zo>L!?o;%)eG?w%rctN&iOo=x%eQn(Q<^|iK;`OOumhbyd<{;ZO$QE~pkMEymynIjp zc*3ne*V%UQ&R%G87l`>L`0uXwdNYq=@}-d$T~}J7a_l}_mGcty)7ejyjd6A!e1H{+ zj=O#z*z#cE>LvG#Mz|I2t@2Fi-WZvi`Pd6}@45;BL4>eb&F>5y%DJ@fY%Tni*oxfH zaRYo|Qwn59{>rCws{V}(`|of3h)epRPxWVl?&r>pl&lu{A|n~#(#;S_n$TqXN8Qiw z=MN8lFitd9fsouCjK8mJ5AD9lr^KsHxn2Ey+zt9=rllj;`HODR#V7i}tI;TR17fN3-iYuSfgQoc*4@~qcFX1K zZFQG`&k&uS{bxBpqC@QCM9%JmqfYqm!&0Y~ zKT_%Pz!+*Ib}KgN(;xU}KwW=R{-n&+J+Tq3y0WBkIO}r$j{`XRn20bu_y0;5=AJ{# zPTmHHj)0gqcl(HdtF%qLomNPi(Q*Xqj1>>~{jUf^51#VvpcX3gaR~{%r^ao(#}$o` zlV~i>8d>&j4E>*kq3$$wp?g<0NM8X&k(n8}zUkwm53~}UU)^KDq;!M+D`7Y_-Qt7* zT!Fe9cq3b(oaJP>?kHPt7{oAZw?0N-wS;3yF+{x4zpLKJQ@i(%w7!4ei9TdlzFT)zqs zhXIM-((7vu7zbQzcPcvST_%F}HIIoK!>n}@paCu!4MeNTJV}?4SZ5Jo=wartS*n?~ zIr~V62JOx*6gQ+N60AV+o26^chV^&9xEd9hgmJgIkFQt*a{+87|?gq_pAccxK+m1GJE4aoLtPh3se<2xlEZcdRjKx zq?!t#Yw))`Xb!T+z31R{v!LA%wTKWofZD?M=TXJhkvHxht&CLW8pbo#sE z4cM!3QZTpq*ZRTgvp%P4o%8rSdOB`#X8vk@^RK1c=7H2SU&ST2>?^nBPDkHSeDrc6 zBc&go)7YQzd-aZbc-NKm6rJWHEnmk@f5=PW@s?Qty%1ga!~74U^WpgJ9)dqZF}7Fh z(*$?NIu6f#3nqxlV{3~491}Q)Ffb;5iA?6;@kE>WvB0B=q*n*7nd1K&GFbdCGFS&T zf~@{$Wbk;Z`0-SDV#a?$2Gjp9$RO)~jSR}|)Nzo;V z0-ogA|3C&y|L@44X-SpUxhk`=8mkL6W);`1E3V62xr@8jDto0Vjy{Vy_j`@bQBbo|G;;mMYVa<{s6-+Q#DrN`$k-@o~hN9&W|ww}Em&q5yb{#RQtskQ5W-xfUn zpKQV8$@#SZZVTo<>O1>n;C%1%vj5-(s|H`z{8wIZSOF!b)(J0D)wdWn$1wr_h}vKLimru?h+iJ3Ldg;tN>`}CHdCa&)O zXR+ETkt>kQ9oi;lo}ngt*}bFf+wyqw&fV2vreE^|qc#PW7d!p~8LU^g{4k`7D|d9~ zGr~MRd=nvqZ(lt8RizUEiWr6}2{l}f{?(}!rlQSD$Fwt4W-9jC?&gw|=PYYyGE@>4 zH5`k^S&!MtpsOtDY`0Wlrcrb6kT%!s4plQ#A(f+XUNB)HxPzFRtWE>!&@^NX2_>W&eYP!A>T*tu+$`7`zC6OCA?80b_)9o$@hyR(L( z)l!|)*+q}YGN-7x!%=Kv?=z!Uxj6Q-*3+IM?&o&npsjl< zA}O=ek%c*!j9wqsbxB2F;D@JWVEX*f?Jt!Lt0-5Gg)$L*zs%$!?Gtmvk2D$H8vN+~ zqZ{u~o)2ZA*In-)x$hWu@y4-Dntn^y_t)aOaYv?OLWxfw9f#aZbRfTDbiE6qNCugAe@yke*sX5nXVyZeOTLAK9$qBc_o-+&LcC}0D|BV- z8-gLCvMbRa;?n2c;E2tWkwQs-^DOH>H`%dueB~nZ?w4+le5vtnh&g<>Zb&pXaEccY z&C4_lz?$SoR)!In=~5{k^s{Rfa-*K0oz-i(1=vu;81lRp0h|BrRJUyOc&SQne`;cU z&U_M85igYDvb;;w7)0lLVSr?WTXm3bS4QpV9+RN;D(&MtP)2@VigGQ6 zTrB`^yCVw0<27f8v<>$5aPVevTMc<>MhEN8xr{RpJ9SC;uP`&M2SDNv*;K@v#$6%i zu6Z6oZm^pIw}ZOj(#LWaMj|npltrqv5Ur;zw>=ZPg97oZt=aMFE_9b`Mk*mlFHo1% z%M&_D=4=v!HowsY=cNYTfmLY8*74M4+LpQ~*O*e&frk7*SDXb*_X{)ZQw$R4nyxpYwr$(OdgN zP2pus%=O8=aF;5$c*y{GVp6ocu&u$auS-2lsnA9L(K%kZVes;#x+5pnL?!Yu9d)tL zg#x~1)5lj?cNt+(HKn*602SLe4xgF1Mm#=HCO0*aLos9NVs-ZEec@fSUy-jevps1)_qD$UR0d_}nMO4~Z`(*- zrP2fsW{oM*#n&%4mY#mSGVXrSzDq*xBM<3pGmFh{8Hf(~fRPp4xHG?c7=sy?(J`y4 zQz+|}F4~29S-A7zn8w+JCy z(+!!j(pmOFTQpQ#9$%O+;yThlYRj}7Ekl4&E#Wy}SG@7%-;m(T3_$#W|LO?|(0E!r zPxACalXl9)Z1U^#S_K3%9W(xb+qMfk^6dPjd)>TU{;(q9t#|7t%Aw$k+BM2i!-c2K z-+R5&8zAkRz!U9JsTt?XpGZrEJ?)RUqs?RdoYYyI#&x z_N#qiuZ&Pm=QzCM_fM0hHP}@L!vYr}9%=+t4r-S(4uforuPtAEXMb%ymTfeSH#jNdy;BKX8p25Fu+v%BLD_GHZ8vgpo zIfacWaXl1wD{95~*6&WyBIT3JUadE4CyVHK#0l;>2er*gM9FVQm}`FWx}H|%gUitL zq#wV1@_CD&?b*W>n@E^92I07(uaN+XY|s~coNa%*GlP(z_xbo?-Gr1%P_*#OKk}$! z+$5dY=oN^`fTs)Ncl!eiA-nxNBP$5JHl+-AH ziIiX|NV7{+JxL^!##Lgui3+S(P!R~#ax&>V@)+@?@U|>YkTD*oFT()Gol75|K^l#x zD}bPyC$MLUh<*>qsfdi|F>ND1oU{XG(@Q%l-cRMM$m5HUR{82AJET@VChtN#ma~W{ zVjvY?$?1JbEK5|)1fYi!u|!;a5e6YM3_2!AsoV&@ToN8dQV;u{J%&Y&AjCnFuS7orEIfQQGk{+f%hS&X|pWZtcLyGWKH< z3Zx9=GkK?p+xOm=M(Lq8-QVF5jC*N~KMMbmKQW^t0uCMY%8JHF=F+H083D+JhTsU1 z=Htk848n5FC3AM)M^1tJG0N5~wkf=LELJ6&maW{iEqF#&i3_S<&zLAOkIN_;(nE3Z zNwOx61(|09CKMh#%1vBkpNn&mXPiA`nNlP`>L#9-Wr4_aq@?Bf@fkBoiyU7Xm(#lC zTr5n}Qd-{>VFJ%DFrXG-5O6OGGCs0w!uLchtoRG|?-%$`VM*ml)zul7)IJ&1*;8>* zIcDJqUphpgQ8eX&9${?pYQ8W(WM5GxhvRd5k>zf2Dv26UeeOjW5~y^)g50-@z5Z%g zlX4f2@*A5LC8HC2G8t}U8swO!HmXZjl?S$DLSqO@Ugj4^QHrmAUeKtlu>W~U=JuX^ zE+UQ(r_yxHX%I6aWCsmmj+b*4!jChM#aAzUk5c=55@+*x>(dEd`=dRD0%SG=nZAZF zzk|$Y6ro)!7l+P`8{m3==9T{BuC`Xm7*@^Ch;C7p{dN$s@#x11p3$i*#@CfrLlM#M zWpGTG^7wh{fNF_Zzf7*9*A?&y!cl`m)wDMCpC^t&zC>~ur5+cqz65Kf3*csqP`pR6 z3j<;HqdMSJ%|@(EA`@mNELZU;rVHk;AKtUc z!62x3z25H_k!5)5PKe8RRjN`Q)AK+&9^t};%tpy72wgL4Tow5seImqy0bTa5;TqP} zTGj1MK#E*K4=~gM;K2-`0c3 zjKH)_K7!r&;D{{JhX(=y0K5yZqQTkRj>&q@Gy)6HmnldGKCsgMuSMvCL4N6fcu^Z^3-Cq2n>eEbk;`XLkSRQfIEF8U1+1CyXIr`$ zX2?hkM2y*mjTNPo`D)RQBGAtW4`>@ z`7l7%Zdd^SZ%P7d)cwK%nY;#pGrHxl0Ga_|3cB5GtPhIh8gXfW4k+>-2D;g>L}a1x zkroyZ`Fp2%J>f|^4+$VrYdt!ZfD-;OL*=QPDKeA~-jtt~i5>v|YJZxfV$!7yQz8N+ z5}>#yLfv{ZjRJ)1M??`}+X-=pg=K65~ZN59W!7;P8M7>!B9|zGNeCA$J8c zAjcc}#rWV$Hkf2!2wb@NuN&AZ0tiLg9u2NDI0RKihOddf)}h!1cwoA9^M)axp<9Tc z&kwNexzA0F1ZExTYyvWg26JiiYnBK2f@MQi+P5kl~jk|017yFRgXtS(rU&4c?eAZyVha2_ZKgOnsqHNVC;Tjyei zJ6R3n0lE;!654UW+ufz1jsIeBLEQO(d~38|zL@^n=`XNpNO(^Q!9?UQ$W|_F5dw5I ztS$Pz5e@bs_`UNCAWrBwZ~IC~FnA^glg3z3AuVR4NM}h_SOatUYB)(E3f?%SQP?fM z26;1pEi+zJAT7$$=MI+xQcRE$^MRf1lE#oc*L_)4q=Ys?;xA!usYz!@Kor;BUfNs` z)IqAAFCV7PoeG&flm}N$!LoTDG)XW=JVb{lw8H{$#S~CY(2({)8q?ZWoU4dV^)t;Xh)e zk0nz7O-9Jf@KHJT#Zl{4OZEhhCN98Oe%aK3;_+??5pV%r7l4RYmi|4cyZ(Mt!bz+ zVI4vHCMxxvQ^p-RihE=HEq3>Y;?QF_{f9gc>?E>IUyr2hdn_^p@gl^K0DMxD26I6) z;aAS5?@k)eb(tW_#|`7%0GtOT+ycFi`I$;Uwy1yZ*z&y?4-!2#ur(P;J6JJyRj+Wv z74$=g5X_Ikfi{VN;H|JF2AZIX98*W$fB2mj_(dB4cmDJ9=37j4#j?_kzY2x$+RK03 zF+W}^Z+58xV9Y=7cmH;v!@_uQ**Az3=HG>Ft;A1YU}%4LCK3q;c*V3Ca)yMeT|AOV z%24ncL8q2_ymQKnYGyzcJ?9?jnYw!W5rG-%xvlD8rlJ=p180@X&^QLqyI`C22l{By z^S>j5-XA<`c30S?EA72Lq`UXxgGiA!*j0x`5d;D)H#|Am@swGhcfX9Hj(&Ae*||u! zHmE*>e)};MwFO=SG^;-~BeOnRtNGGtd;OQ=d{@ye z8m@=$&o@u0>S%$WYm)d|lRcfo!VH6=Q6KAw6N6RNxWzzbz|q?fI?H6T<6mSjeaTQB zD#pTV^=x^y1B~P0VOj#_aQ}%`+q}$^26R3%6qMq|RG`jVgcUk3EMDIQQxfgj;v<>U zUm9|_>R=}Ur+7s+MRl@(0LOd zT_SW3thN(#wu$X=YaU5wdBA6^*CdVUHeaOYJv7mN3aL4!PJ`{wI*zIRHdChqNdY~9 zaq-7r?R#GmHL8Xj%V0N!PHz@oZwua4c5$)!(#G{R_Y{V2~UJ}#OFARmrnDe&1 zJ0I!{`35bmuMZ0k#}M)0&ExVQl$n4f6{q2xPs zd(AZ>e7hfO(|nEGg3m*{bnh>?KukqO8|9oYLyG6F!OSqa`^gZt0(ZkPgGLf_*H4uy zM>;O-rSCP&>TQ0+ce2}m4TjxNmjKb3h)5#Lwv?>E@g<+R8k?7#M3vM347HH%LYx<& zezd0#e(~9&1t=YwVEqf~ zVRg02*UeXt48&Y_A12p;i=%*u&OSRel`K8WUb}GG+8)6+~CtYq_Nw%3UgKZu062Hc}A{Bv$C{VV;{xKsFVFBP&xw}x6aVAOP z87NgV9)i}XMQyf%6}s_o6K)sUhrfHvgO^vLeiA{wE?I*l7WzwCh_$_#?CIu_OOl1x zwp9>bmVv*bI##aQ)Dicb|9eHVfOZmRHJDk47qeYBR+V}$a+XaMV&^BR? zRqG8=d0TE)^LJ}O#~QT?iTCMOnd0R{1Z@%Ao?(ULtND0(3l}g(?f!Y%3BLUPE#jEE z-fQIJcS`0P&et+Va@XG3H{tZy5XZ@fj`1nfW`zU zHtRPi=9!KUegD2Ahp&KD|1h`h(@#6f+O?O=^J%rUGN#5izW#Koxb^D9K=6^%sSgxb zx59DmC$mg53VP2w!;vn{D~Bh(b}qDLivc@OT)?C(3yf<4;D8xkZkmp;Cp=0`YC3!A z4^*F~dGt_w;M>1#h==%4Qie6!1;g-yoKm8Rtx(fyE8O4;48DinsW?x~aprR@k}0$Z@P)X-ZKSBwgg)ww~W} zYtpC+j)J+aE)`ZPX}_ud<{eP6TuaAmOO@`p1zG^-i&-1Cnxmzl-}hc# zE&lEnIHBReY`W2LBQi}}Otd6Fs-3tQA{>j~)avnGwR1(0$w2($)1J$c zE}^Tti%)zyt^Wn?0xYe5a^9iQ1eJGvhrm zLf~F}>$Z?A!bK*{Q4egTJUJbgKONm-w6E96VZV84PIQUV(9uDSqI>6;gBI|g)1Dtu zD^g&VkFCqJIneooV>*BL?R-JyRJ_4d?+Mm05iY1TeB4%;THPDyOC7zR|BXwPT6wc% z_kk+?N4K5e&uTCQdiS! zM4sJ)dr$hXyPATp=D&@fJ0WYtrPDvxbpDyh;qMMQys73}{+`pY)qb=oP*z)Y$KMZU z{+^^|s;%67kMuckroJ_f4Z8d3uJ`GXugw{AQ|%}Ae%d)4-F)Tv20=ZV`X>92OJ9Q4 zL`>(2`)bMD#f!fR?{qpX4kpYzOTMS^v+IYB>}D>8{?2Qg{Zt*E$!+oZ%l$&6f{9;m zJpE_oiQ~=RX~j|))MiuL$5VEt;@k2CAW#wxjLv#&*)Fl%F7=M1z#wk>uq{8b?Zy>i ztFj3O(ut;IYeP^?5NmborW;cxx0FfJW@1>OE)HsKbhcg2yIr15s#-J6S7>U=x!d&E zlE45v`MPJV#X!j)t|;XiKCpG9(DGU^Ve*Q zyQKo(A>FO5!=|kK-XT3r9exlW=jq!v9&o7tde1NIkp()-as)XZ_;^csTQ~$of9J5e zXr2#HtgEG)wJ7=YPKWM%$~5wI;A1D7_BaS?E}p zCK<w6V=p$xdm8x(((Y5<<~xl9IFA1D$TWwCv~Eh{;TG<$qjH_{TyJCb9G14fn_%sI|*52@;UADz3nvJeaKH0F&M?PqJY~B2_-J-p>hib#Oeqwp}LDO$4xAqa&Cbw{ovvrO-25EmPj@l9C z^0@Rtp8n&erj8p|T)4D*7j4iZQ%H+Bm$K=$A@M9LoNE)_HILSDrMS27aYvqCcg;%n zwE?6w^G z>f>E2y%F--y5r|0PDv2?gInA7Y0k3)?pN2yT)?5x^hMp-J$d7OzbIm&LV%0YZPw*h zJEu9dP{9=pjYD^>H>F+ccgPn$gYC$MCv)oAv<+OF^E9&QF6|1Bl7}&Dmbu^bm6pfs z$Eapw2RV&Kf>4zn?)WabtzrQqoOcHt74KO|mhSvk?5Hw`Y`<$26mJzgA__7NdqJOk z40LLB82;n8IqV+onNJ^3U2WeF%`#Y}gjYMMRkTH*QGItk3I$G?rA|K3w4>;!CbHS4 zN07r%>!Zci3^acV5rOi&Mk+L zPOsiP9?4k(MNLPhQAX=!Ti`{Oz;leFMrq`2ttY#)})vF7;aA;Xt1V)g1>^ zZ%0;GT}|pZ^qLcqjD)58>^t6eYk(vD&4Zpr>n5rH^c8$rk_Xs*ZwB2 zU3)jneUJB;N3S*}!L0csNX^w(?8Jc#i~En)M{*uFa0Lx%M>y#rt&X!TcIN>=;chGFO8eLV(sK7i$tY*Ujr8j}|BvfLdgDZH zCa(l@n7K8HGx<_)< za)%bVZa4B4tZx-Jb>Zvtyfu#|$3UOGQ=O)F*UhGWqkUSZ_FP+jk;{8=sfU({7f7sH zLr0NUpg}QW&xl6TT+FL{iRp|)L0yiZ`l28&@>TwE4~~HLEI6=q*U){apXv1UW+vD7 z8O-aNcrZuUeQ9g3$XRq+vG$ziq?ZI}q;vK*Sdx)!J3*W2IA&|9fdMbIDaVsT=(*JM zI+NhX-jYAR2oWu#tI}CGAprO{i@-taJdipU>>}OvE*Z%(oicpQ;mnIB6%bWEFt#BL zA^>9gEF2T0sUK4M(lcKn*tFP!^X|2Q1;|wpP^eHXMgS?Sfea(Z5B9&!!@oTF&GU>n z+gPN0B?2}k*@LxASuX2ShsDi#4#M5nA{==^bthQ}5q$v77hdIZq`53TU|(vJ7nd=S zvei4i1(c}8wnL_=@t6xrVi0Dio*&(}K6Jz^FjS*0!F2P2h&{j2Y{$c6I8Rs2-i(6E@|3NbBg{;F zp9k-ciQo*Z-X+pOBsCN`k!e*41@$qBoB81!B!CdIJZtV9Gk>jf(>D|F5WL%82{575 z^A~wgm1UH;21K7bmlS~n7)-^r_j{*a<#ApYt1f1=__~O*m8r~DJoCr)R6_051Xjq7 zMzEZM@LbDcZho=sEJ(d}zFK2ESMa*{uU~p(u$wqkmBvhZlPk^v8PoJKW!Q_bh-`PH z*y2Iotb(6BCaUzTv=CH15ygpolk)cin;PPx42@J11Ni~6NCCqx_2IXcURrD1G$kO_Txs{~Z!jIGC`0Nw(%Fjbbo zG*;A>;esD#6#uM$xT*8}A+tSnr!v%p&PerT4FNPXhfMO*r(E1C8m0(5vLmUNd zg|!vu?f&`1i3>-($Xd`H$o=P$fUJeVk+iv9IWcfA^Z89_^;+OjpS%HHaUuaJb8h@{ zIx+!T`d*f8F!eTXai-{S7JC!KAxYXL&ik1&Wobh7La+?;J-`KB_;|i*kmI=O|0#vT zn?LtnC(VFEFj<5={8C6{f?dDkv?5n)*TQ5um6JLL)ce4S)Ro|AU`4J>RCK6Q6R=C- z6Hx&yMqnO1wWeb5DMNuxh@9bK05m6cV@Zsf&r(2SEq^@ncnyRW)`<0f;ATZ-Mjoh> z1r;`K2E?%DaJ{SP<7f$5ft)XrOoZSMW+~oJec>>p-@CGI43c_U@M|n4vz9rzP^x*9 zWA`z@@#FbfACRgqN3mc{Z6-|>SV{L|s?!)X)O8)2T6m9}0<$sUtC2iUnZP>-Xo7P?HvxgnBki2(o@6smEv9Tw}{(j^!6d z-#-#x*fM&=5@IB8udjb(8P7Hm0@=^yRf%h=UfHu5U-tN6Th87 zEo2IqI=Z03-tfbUP-E_4v5nLxl6lqz?a5 zg-mfjCM`k?!DU5BNf^||fD@RSf=?;ir*m6?GuOsW&p=d#x?lmzY%JfDe(WkBGr;_) zjH!R)nTEdIOTZWEZ?F_BSZF#>a3&kzGsEvoZq;YGoI!zmk5;w@)mFzTjh$(myW&?f;``I0M19XGsUCH$OOCbS4TLv zUX>6zsS99{ZVx^%pL$NcENKSR=_^+B;#d{~T!>J3c!I-~{Ii*u{MCg1%hLw*jW21} z!U}s)5_RsQfXdo-d8YzDiCGz(hg`}J4jKO@FDi!A@Bvg8k3GS&w>c@*@A>&y09NP! z&O2LH%e5qptTPo4xWa7ZY-`iY3r}m%?dp|FLk&rF5q7>O0{t;VD-XwZ)O{1HG z*+s2}GHD`YaA(}g;=jnCrgM>z!EF>X+urR?bXKF3I9Lf(zLqvL?`)>xIlJP&9Y|L; zQixtJ?77x$oYPm=%839c>7>AGf->R1)UJvF$8!q-HoU%V^-xtvPE? z!FkX}ZONia|15*#k!fz(ZT8tVPZL2hk_nQkJ1(!~Rv3$U*IT6L6%o`jlmE;gwY!or zF_UV{)w(jo{oI%SlwX`Sa5aQYYaT?!-C>Z@Ky&#BsZ_W*7Z^ z!)$K;V=t0qcMu(SBK@S5j7raAK~}Y0rAmrsz9etBOP7NfZsT4l*f74!C!x5uEA^HCf>TB2z+lLdb6ag_BR4?|l3>2&5W#DD!fK zRv&jL?dtV5!(%XSZYy>+)jx<%?=jtFAjKokj_&f`SauNWJC#|}uGHf< zq^NN*DQ*wKyBqWjiA{x<%5KHLM3qV2Fb|Wn*9+wyf5AA2>4eclbYV0S3zFPZcy&-Q zwvkRDqTUxh@x=6ZL7bhnBd`kh8!%FeC7*Xpgdbz`pGC-kMekg;45ybC6})>6&|+db zRrxCbfo*yJtVmXB+&t|S{@cLqj1JWYOmyPK*R*lj!hey$ZR}=>Qg?C;-pG4;8kH0s z5R4MKE#2X4;b4RqpKSQN-@w@oN2xSTr<>}YSl`2cwZu6yhCk+d~ zl2gBV_I{wU$A^gI56g)zdm4=kmyP{nNyjMk7elLiVrXWcI=}j}r26!{lN^Iv?9cRL zyyID4Z%cpq>jY)YIOChmN)ESjKz91&&X?$^VRHb|%u4DcuF)9lwMUwmohNCFfsN=NgPC?=;&rw5JWy%+S@Xr@& zQrTk4Tjbz!biz3(K2ay0T+={%WbkB(jXlW}J8(5aVc@w&2Z{(l*8o{cB|4cGDyLe+ zT4Y6p85NSnkXJ$YX10_S{fdJRft2B$ha~h82ZG3~kwQ$iY^;>5Ow=``_a++@6(pqLvjVt|2M_5km9h%FA~lyI?OXxk$9)nEJPB3z6`Ncz5Nk zjEOAF@ynOpxy8L;wbtuIKNd)t;+G?06Xo1M63GBvVhb6m8ef=pI4%q4L##!!EA>vd zkZS2n+cSN@VK`NNFMzRu2DpornUJ@=tJ6YxYl9vIm8hrCbsMXpfH;3neuVMl8xg8? zsg4S}#FR0N^wLzYP;*CqPEU5yhS)JutMbF|9!Ln|W>#Ic-U8lpvS^*SUW^3Q?rpVO zVP8Slm4M6|A;z^VDWGA3j2udT;Rv-**Fia;zR@nPX>8`pp4<&r5#GLu;iq|5gVhx8 z6cu@Xv)9Yx0N$>aWYIqgbtcQ?03qFEWJGF6g(Aj-7ozSSt=z)7PA1?VUP4!i8^3l1 zTxpfpp1Th4B_|bK+G#M-H-+nTmD4$b|(Rt0d6s9gOjgm(lx? zZ8!Sw$T2PtUuY)QCmV+cY{4qG9+mp}YY%L;iDq2IXsLLe=4$|90{Uo3-huaj62%Iw zNcTIAgFqJ-u6cPbJ&h^Z;UX8t2uh>z#5TPPRl|`4kjw_&Fo5{!52GdIhe?ak+70UU z=@WJ3+YwG)qE!HFRxy98(_NfC3!N<*tY~heRVE=Dlp6Nm;NZ1xU3{xnt5|_vxvghH zyXBz93%%TE)?|lWg_ty^Dq?0(-t?Gldses!H(L6<6-iD?`uofliG3v+#Ox!v?=o!Y z=e=Eud?@Wqv1mHXhVf|R(lYa|W$U0VE6#CI|E;aU40L960HT?RQ`8^VKr_ick)|c# zigb{=E>9nV{6rbn%#j0%5og`iN-pL86J! z2v*mg>_|S_E2+Nqa3L43^?K874*wmKVem%?*K6T>_NC4@4Dg?c8x;9e(WAL7PQ4qJ zjI6!CmpFnGV`JZ`;wIpskbru05aE%eH;)C|Xwf^V`~A)dYv_&gbZya#Ioy-6fYtKv znIg~J`#M+{?aOY`(P869)?gt|nGmH(S2)g9R*kmtui|LC!=%0-*B7L2-oy!9T{z?r zHuP(A!(n49_7gY(lcb*}%fFGT{k&O&|58k9Oa%*D$ImLwkiij}fXE4g=rCDQxuWSn zx00rWy4A4EY^vMOR~>95R0+Nbkz+7Hd{xvty74iNV0ytg!ru`N96f2TFT^&kE9MR zf^V7bj&b#*Y_Ti-?w}N($U$qOeUJ7+*K;@0n6{Z0)&K63-8P(rAWMXn{zg5!QYdp| z{)_%-*9Y}G2!ZB}`?c37^S3YjetQrhQs2+IanUCv%TmY6oPQyXK|>%Dg7 za`I!^<&6%rP6|-4PV%mtruZiMBr%Rw-zL^m6}#o_UU0=)iZ*--Ykp*2s=M7_i?QWC zB%673+-Co>bo_m!=jGL@n8N-~;S&xm`!)wJ{8XewtY3z^3BlcfF9!6~k^(dWq2WC* zc_ZI9HPo(AC`czB)Q56NqvD=6P)Q>OMmb{R@vF5&F?ZN;c9w+X8x$FeujO@q8+C}J z4@-a*0UkMi(gz2c+yMoIbYC{>&5rJ|%1fU}(Br7ed)P{c##aJ~RII*+=x6y_gqBwG z563#uJpl>-MDlWJ0*w{ zg*`EIWk!Qy!RthUn|Xq-u>CW)cd5p~a6y#_PrjyAfEKwshg5Z?4&AP;`e5ZeDHr8y z(WUFujap&(B3&F6h!-R-DLb;uEB9Zl+fON0`?A}+w3v>UekUro*E$5-RA1C^RfH{t zS2?&T5tDu(@oB zIS1hjK`0dcXp(X$9eiV8+aXb&O3Md3w3tqF8>3NKOHPfQ2;^=hjpAN3CWH$OB^u{rq1P1^no3zDzahE+6-z=Z;x0Y z@ft$ecG49we{@J83qC=vHGIClxuW-8=s#Jy@r5;E^TMc5eFbX{?ZHqKQ<^*Ky6fW7p;4$=ymR zK~m#$w?S1tLFeR6*o+cK{Pctao#`rh>9jGsu0rqB6Zu|{AH{-r(9+ch#%gXuGx=EB~ZqM{Lm7h65(tF14#DSOq|?d+Ba;iA8u11~H+K>s>koov

    b@;|=JzxeN^;!UAn2tnFA99fM= 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 z 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

      EKi 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

      d?J_x}AuExEMq$$d7q`%OX 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

    1. ${e}
    2. +`}checkbox({checked:t}){return"'}paragraph({tokens:t}){return`

      ${this.parser.parseInline(t)}

      +`}table(t){let e="",r="";for(let i=0;i${n}`),` + +`+e+` +`+n+`
      +`}tablerow({text:t}){return` +${t} +`}tablecell(t){let e=this.parser.parseInline(t.tokens),r=t.header?"th":"td";return(t.align?`<${r} align="${t.align}">`:`<${r}>`)+e+` +`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${Tc(t,!0)}`}br(t){return"
      "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:r}){let n=this.parser.parseInline(r),i=kZ(t);if(i===null)return n;t=i;let a='
      ",a}image({href:t,title:e,text:r,tokens:n}){n&&(r=this.parser.parseInline(n,this.parser.textRenderer));let i=kZ(t);if(i===null)return Tc(r);t=i;let a=`${r}{let s=i[a].flat(1/0);r=r.concat(this.walkTokens(s,e))}):i.tokens&&(r=r.concat(this.walkTokens(i.tokens,e)))}}return r}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(r=>{let n={...r};if(n.async=this.defaults.async||n.async||!1,r.extensions&&(r.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=e.renderers[i.name];a?e.renderers[i.name]=function(...s){let l=i.renderer.apply(this,s);return l===!1&&(l=a.apply(this,s)),l}:e.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[i.level];a?a.unshift(i.tokenizer):e[i.level]=[i.tokenizer],i.start&&(i.level==="block"?e.startBlock?e.startBlock.push(i.start):e.startBlock=[i.start]:i.level==="inline"&&(e.startInline?e.startInline.push(i.start):e.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(e.childTokens[i.name]=i.childTokens)}),n.extensions=e),r.renderer){let i=this.defaults.renderer||new HT(this.defaults);for(let a in r.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,l=r.renderer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f||""}}n.renderer=i}if(r.tokenizer){let i=this.defaults.tokenizer||new UT(this.defaults);for(let a in r.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,l=r.tokenizer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.tokenizer=i}if(r.hooks){let i=this.defaults.hooks||new S2;for(let a in r.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,l=r.hooks[s],u=i[s];S2.passThroughHooks.has(a)?i[s]=h=>{if(this.defaults.async&&S2.passThroughHooksRespectAsync.has(a))return Promise.resolve(l.call(i,h)).then(d=>u.call(i,d));let f=l.call(i,h);return u.call(i,f)}:i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.hooks=i}if(r.walkTokens){let i=this.defaults.walkTokens,a=r.walkTokens;n.walkTokens=function(s){let l=[];return l.push(a.call(this,s)),i&&(l=l.concat(i.call(this,s))),l}}this.defaults={...this.defaults,...n}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Mu.lex(t,e??this.defaults)}parser(t,e){return Iu.parse(t,e??this.defaults)}parseMarkdown(t){return(e,r)=>{let n={...r},i={...this.defaults,...n},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&n.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));i.hooks&&(i.hooks.options=i,i.hooks.block=t);let s=i.hooks?i.hooks.provideLexer():t?Mu.lex:Mu.lexInline,l=i.hooks?i.hooks.provideParser():t?Iu.parse:Iu.parseInline;if(i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(e):e).then(u=>s(u,i)).then(u=>i.hooks?i.hooks.processAllTokens(u):u).then(u=>i.walkTokens?Promise.all(this.walkTokens(u,i.walkTokens)).then(()=>u):u).then(u=>l(u,i)).then(u=>i.hooks?i.hooks.postprocess(u):u).catch(a);try{i.hooks&&(e=i.hooks.preprocess(e));let u=s(e,i);i.hooks&&(u=i.hooks.processAllTokens(u)),i.walkTokens&&this.walkTokens(u,i.walkTokens);let h=l(u,i);return i.hooks&&(h=i.hooks.postprocess(h)),h}catch(u){return a(u)}}}onError(t,e){return r=>{if(r.message+=` +Please report this to https://github.com/markedjs/marked.`,t){let n="

      An error occurred:

      "+Tc(r.message+"",!0)+"
      ";return e?Promise.resolve(n):n}if(e)return Promise.reject(r);throw r}}},Xd=new z9e;o(nn,"d");nn.options=nn.setOptions=function(t){return Xd.setOptions(t),nn.defaults=Xd.defaults,CZ(nn.defaults),nn};nn.getDefaults=h9;nn.defaults=jd;nn.use=function(...t){return Xd.use(...t),nn.defaults=Xd.defaults,CZ(nn.defaults),nn};nn.walkTokens=function(t,e){return Xd.walkTokens(t,e)};nn.parseInline=Xd.parseInline;nn.Parser=Iu;nn.parser=Iu.parse;nn.Renderer=HT;nn.TextRenderer=x9;nn.Lexer=Mu;nn.lexer=Mu.lex;nn.Tokenizer=UT;nn.Hooks=S2;nn.parse=nn;M6t=nn.options,I6t=nn.setOptions,O6t=nn.use,P6t=nn.walkTokens,B6t=nn.parseInline,F6t=Iu.parse,$6t=Mu.lex});function G9e(t,{markdownAutoWrap:e}){let n=t.replace(//g,` +`).replace(/\n{2,}/g,` +`),i=P3(n);return e===!1?i.replace(/ /g," "):i}function FZ(t,e={}){let r=G9e(t,e),n=nn.lexer(r),i=[[]],a=0;function s(l,u="normal"){l.type==="text"?l.text.split(` +`).forEach((f,d)=>{d!==0&&(a++,i.push([])),f.split(" ").forEach(p=>{p=p.replace(/'/g,"'"),p&&i[a].push({content:p,type:u})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(h=>{s(h,l.type)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}return o(s,"processNode"),n.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(u=>{s(u)}):l.type==="html"?i[a].push({content:l.text,type:"normal"}):i[a].push({content:l.raw,type:"normal"})}),i}function $Z(t,{markdownAutoWrap:e}={}){let r=nn.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
      ").replace(/ /g," "):i.text.replace(/\n */g,"
      "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

      ${i.tokens?.map(n).join("")}

      `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:(X.warn(`Unsupported markdown: ${i.type}`),i.raw)}return o(n,"output"),r.map(n).join("")}var zZ=N(()=>{"use strict";BZ();_A();pt();o(G9e,"preprocessMarkdown");o(FZ,"markdownToLines");o($Z,"markdownToHTML")});function V9e(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function U9e(t,e){let r=V9e(e.content);return GZ(t,[],r,e.type)}function GZ(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?GZ(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function VZ(t,e){if(t.some(({content:r})=>r.includes(` +`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return b9(t,e)}function b9(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return b9(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[l,u]=U9e(e,a);r.push([l]),u.content&&t.unshift(u)}return b9(t,e,r)}var UZ=N(()=>{"use strict";o(V9e,"splitTextToChars");o(U9e,"splitWordToFitWidth");o(GZ,"splitWordToFitWidthRecursion");o(VZ,"splitLineToFitWidth");o(b9,"splitLineToFitWidthRecursion")});function HZ(t,e){e&&t.attr("style",e)}async function H9e(t,e,r,n,i=!1,a=Qt()){let s=t.append("foreignObject");s.attr("width",`${10*r}px`),s.attr("height",`${10*r}px`);let l=s.append("xhtml:div"),u=kn(e.label)?await kh(e.label.replace(tt.lineBreakRegex,` +`),a):sr(e.label,a),h=e.isNode?"nodeLabel":"edgeLabel",f=l.append("span");f.html(u),HZ(f,e.labelStyle),f.attr("class",`${h} ${n}`),HZ(l,e.labelStyle),l.style("display","table-cell"),l.style("white-space","nowrap"),l.style("line-height","1.5"),l.style("max-width",r+"px"),l.style("text-align","center"),l.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&l.attr("class","labelBkg");let d=l.node().getBoundingClientRect();return d.width===r&&(l.style("display","table"),l.style("white-space","break-spaces"),l.style("width",r+"px"),d=l.node().getBoundingClientRect()),s.node()}function T9(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function q9e(t,e,r){let n=t.append("text"),i=T9(n,1,e);w9(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function qZ(t,e,r){let n=t.append("text"),i=T9(n,1,e);w9(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function W9e(t,e,r,n=!1){let a=e.append("g"),s=a.insert("rect").attr("class","background").attr("style","stroke: none"),l=a.append("text").attr("y","-10.1"),u=0;for(let h of r){let f=o(p=>q9e(a,1.1,p)<=t,"checkWidth"),d=f(h)?[h]:VZ(h,f);for(let p of d){let m=T9(l,u,1.1);w9(m,p),u++}}if(n){let h=l.node().getBBox(),f=2;return s.attr("x",h.x-f).attr("y",h.y-f).attr("width",h.width+2*f).attr("height",h.height+2*f),a.node()}else return l.node()}function w9(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}async function k9(t,e={}){let r=[];t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(i,a,s)=>(r.push((async()=>{let l=`${a}:${s}`;return await eH(l)?await _s(l,void 0,{class:"label-icon"}):``})()),i));let n=await Promise.all(r);return t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>n.shift()??"")}var di,zo=N(()=>{"use strict";yr();gr();pt();zZ();tr();nc();UZ();qn();o(HZ,"applyStyle");o(H9e,"addHtmlSpan");o(T9,"createTspan");o(q9e,"computeWidthOfText");o(qZ,"computeDimensionOfText");o(W9e,"createFormattedText");o(w9,"updateTextContentAndStyles");o(k9,"replaceIconSubstring");di=o(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,isNode:s=!0,width:l=200,addSvgBackground:u=!1}={},h)=>{if(X.debug("XYZ createText",e,r,n,i,a,s,"addSvgBackground: ",u),a){let f=$Z(e,h),d=await k9(Ji(f),h),p=e.replace(/\\\\/g,"\\"),m={isNode:s,label:kn(e)?p:d,labelStyle:r.replace("fill:","color:")};return await H9e(t,m,l,i,u,h)}else{let f=e.replace(//g,"
      "),d=FZ(f.replace("
      ","
      "),h),p=W9e(l,t,d,e?u:!1);if(s){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");qe(p).attr("style",m)}else{let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");qe(p).select("rect").attr("style",m.replace(/background:/g,"fill:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");qe(p).select("text").attr("style",g)}return p}},"createText")});function Vt(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function Go(t,e,r,n,i,a){let s=[],u=r-t,h=n-e,f=u/a,d=2*Math.PI/f,p=e+h/2;for(let m=0;m<=50;m++){let g=m/50,y=t+g*u,v=p+i*Math.sin(d*(y-t));s.push({x:y,y:v})}return s}function Kd(t,e,r,n,i,a){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d{"use strict";zo();Xt();yr();La();gr();tr();ut=o(async(t,e,r)=>{let n,i=e.useHtmlLabels||vr(ge()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",Cn(e.labelStyle)),l;e.label===void 0?l="":l=typeof e.label=="string"?e.label:e.label[0];let u=await di(s,sr(Ji(l),ge()),{useHtmlLabels:i,width:e.width||ge().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img}),h=u.getBBox(),f=(e?.padding??0)/2;if(i){let d=u.children[0],p=qe(u),m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=ge().fontSize?ge().fontSize:window.getComputedStyle(document.body).fontSize,T=5,[S=ur.fontSize]=vc(b),w=S*T+"px";y.style.minWidth=w,y.style.maxWidth=w}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return i?s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"):s.attr("transform","translate(0, "+-h.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:h,halfPadding:f,label:s}},"labelHelper"),YT=o(async(t,e,r)=>{let n=r.useHtmlLabels||vr(ge()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await di(i,sr(Ji(e),ge()),{useHtmlLabels:n,width:r.width||ge()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),l=r.padding/2;if(vr(ge()?.flowchart?.htmlLabels)){let u=a.children[0],h=qe(a);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:l,label:i}},"insertLabel"),Qe=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),st=o((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");o(Vt,"createPathFromPoints");o(Go,"generateFullSineWavePoints");o(Kd,"generateCirclePoints")});function Y9e(t,e){return t.intersect(e)}var WZ,YZ=N(()=>{"use strict";o(Y9e,"intersectNode");WZ=Y9e});function X9e(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(X9e,"intersectEllipse");XT=X9e});function j9e(t,e,r){return XT(t,e,e,r)}var XZ,jZ=N(()=>{"use strict";E9();o(j9e,"intersectCircle");XZ=j9e});function K9e(t,e,r,n){{let i=e.y-t.y,a=t.x-e.x,s=e.x*t.y-t.x*e.y,l=i*r.x+a*r.y+s,u=i*n.x+a*n.y+s,h=1e-6;if(l!==0&&u!==0&&KZ(l,u))return;let f=n.y-r.y,d=r.x-n.x,p=n.x*r.y-r.x*n.y,m=f*t.x+d*t.y+p,g=f*e.x+d*e.y+p;if(Math.abs(m)0}var QZ,ZZ=N(()=>{"use strict";o(K9e,"intersectLine");o(KZ,"sameSign");QZ=K9e});function Q9e(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(f){s=Math.min(s,f.x),l=Math.min(l,f.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));let u=n-t.width/2-s,h=i-t.height/2-l;for(let f=0;f1&&a.sort(function(f,d){let p=f.x-r.x,m=f.y-r.y,g=Math.sqrt(p*p+m*m),y=d.x-r.x,v=d.y-r.y,x=Math.sqrt(y*y+v*v);return g{"use strict";ZZ();o(Q9e,"intersectPolygon");JZ=Q9e});var Z9e,Qh,S9=N(()=>{"use strict";Z9e=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),Qh=Z9e});var Xe,Ut=N(()=>{"use strict";YZ();jZ();E9();eJ();S9();Xe={node:WZ,circle:XZ,ellipse:XT,polygon:JZ,rect:Qh}});var tJ,wc,J9e,_2,je,Je,eRe,$t=N(()=>{"use strict";Xt();tJ=o(t=>{let{handDrawnSeed:e}=ge();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),wc=o(t=>{let e=J9e([...t.cssCompiledStyles||[],...t.cssStyles||[],...t.labelStyle||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),J9e=o(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),_2=o(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),je=o(t=>{let{stylesArray:e}=wc(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let l=s[0];_2(l)?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),l.includes("stroke")&&i.push(s.join(":")+" !important"),l==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),Je=o((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=ge(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=wc(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0],strokeLineDash:eRe(s.get("stroke-dasharray"))},e)},"userNodeOverrides"),eRe=o(t=>{if(!t)return[0,0];let e=t.trim().split(/\s+/).map(Number);if(e.length===1){let i=isNaN(e[0])?0:e[0];return[i,i]}let r=isNaN(e[0])?0:e[0],n=isNaN(e[1])?0:e[1];return[r,n]},"getStrokeDashArray")});function C9(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),l=Math.sin(a);for(let u of t){let[h,f]=u;u[0]=(h-n)*s-(f-i)*l+n,u[1]=(h-n)*l+(f-i)*s+i}}}function tRe(t,e){return t[0]===e[0]&&t[1]===e[1]}function rRe(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,l=[0,0];if(i)for(let h of s)C9(h,l,i);let u=(function(h,f,d){let p=[];for(let b of h){let T=[...b];tRe(T[0],T[T.length-1])||T.push([T[0][0],T[0][1]]),T.length>2&&p.push(T)}let m=[];f=Math.max(f,.1);let g=[];for(let b of p)for(let T=0;Tb.yminT.ymin?1:b.xT.x?1:b.ymax===T.ymax?0:(b.ymax-T.ymax)/Math.abs(b.ymax-T.ymax))),!g.length)return m;let y=[],v=g[0].ymin,x=0;for(;y.length||g.length;){if(g.length){let b=-1;for(let T=0;Tv);T++)b=T;g.splice(0,b+1).forEach((T=>{y.push({s:v,edge:T})}))}if(y=y.filter((b=>!(b.edge.ymax<=v))),y.sort(((b,T)=>b.edge.x===T.edge.x?0:(b.edge.x-T.edge.x)/Math.abs(b.edge.x-T.edge.x))),(d!==1||x%f==0)&&y.length>1)for(let b=0;b=y.length)break;let S=y[b].edge,w=y[T].edge;m.push([[Math.round(S.x),v],[Math.round(w.x),v]])}v+=d,y.forEach((b=>{b.edge.x=b.edge.x+d*b.edge.islope})),x++}return m})(s,a,n);if(i){for(let h of s)C9(h,l,-i);(function(h,f,d){let p=[];h.forEach((m=>p.push(...m))),C9(p,f,d)})(u,l,-i)}return u}function N2(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),rRe(t,i,n,a||1)}function nw(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function _9(t,e){return t.type===e}function V9(t){let e=[],r=(function(s){let l=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))l[l.length]={type:nRe,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];l[l.length]={type:A9,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return l[l.length]={type:rJ,text:""},l})(t),n="BOD",i=0,a=r[i];for(;!_9(a,rJ);){let s=0,l=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return V9("M0,0"+t);i++,s=jT[a.text],n=a.text}else _9(a,A9)?s=jT[n]:(i++,s=jT[a.text],n=a.text);if(!(i+sf%2?h+r:h+e));a.push({key:"C",data:u}),e=u[4],r=u[5];break}case"Q":a.push({key:"Q",data:[...l]}),e=l[2],r=l[3];break;case"q":{let u=l.map(((h,f)=>f%2?h+r:h+e));a.push({key:"Q",data:u}),e=u[2],r=u[3];break}case"A":a.push({key:"A",data:[...l]}),e=l[5],r=l[6];break;case"a":e+=l[5],r+=l[6],a.push({key:"A",data:[l[0],l[1],l[2],l[3],l[4],e,r]});break;case"H":a.push({key:"H",data:[...l]}),e=l[0];break;case"h":e+=l[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...l]}),r=l[0];break;case"v":r+=l[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...l]}),e=l[2],r=l[3];break;case"s":{let u=l.map(((h,f)=>f%2?h+r:h+e));a.push({key:"S",data:u}),e=u[2],r=u[3];break}case"T":a.push({key:"T",data:[...l]}),e=l[0],r=l[1];break;case"t":e+=l[0],r+=l[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function hJ(t){let e=[],r="",n=0,i=0,a=0,s=0,l=0,u=0;for(let{key:h,data:f}of t){switch(h){case"M":e.push({key:"M",data:[...f]}),[n,i]=f,[a,s]=f;break;case"C":e.push({key:"C",data:[...f]}),n=f[4],i=f[5],l=f[2],u=f[3];break;case"L":e.push({key:"L",data:[...f]}),[n,i]=f;break;case"H":n=f[0],e.push({key:"L",data:[n,i]});break;case"V":i=f[0],e.push({key:"L",data:[n,i]});break;case"S":{let d=0,p=0;r==="C"||r==="S"?(d=n+(n-l),p=i+(i-u)):(d=n,p=i),e.push({key:"C",data:[d,p,...f]}),l=f[0],u=f[1],n=f[2],i=f[3];break}case"T":{let[d,p]=f,m=0,g=0;r==="Q"||r==="T"?(m=n+(n-l),g=i+(i-u)):(m=n,g=i);let y=n+2*(m-n)/3,v=i+2*(g-i)/3,x=d+2*(m-d)/3,b=p+2*(g-p)/3;e.push({key:"C",data:[y,v,x,b,d,p]}),l=m,u=g,n=d,i=p;break}case"Q":{let[d,p,m,g]=f,y=n+2*(d-n)/3,v=i+2*(p-i)/3,x=m+2*(d-m)/3,b=g+2*(p-g)/3;e.push({key:"C",data:[y,v,x,b,m,g]}),l=d,u=p,n=m,i=g;break}case"A":{let d=Math.abs(f[0]),p=Math.abs(f[1]),m=f[2],g=f[3],y=f[4],v=f[5],x=f[6];d===0||p===0?(e.push({key:"C",data:[n,i,v,x,v,x]}),n=v,i=x):(n!==v||i!==x)&&(fJ(n,i,v,x,d,p,m,g,y).forEach((function(b){e.push({key:"C",data:b})})),n=v,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=h}return e}function D2(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function fJ(t,e,r,n,i,a,s,l,u,h){let f=(d=s,Math.PI*d/180);var d;let p=[],m=0,g=0,y=0,v=0;if(h)[m,g,y,v]=h;else{[t,e]=D2(t,e,-f),[r,n]=D2(r,n,-f);let D=(t-r)/2,_=(e-n)/2,O=D*D/(i*i)+_*_/(a*a);O>1&&(O=Math.sqrt(O),i*=O,a*=O);let M=i*i,P=a*a,B=M*P-M*_*_-P*D*D,F=M*_*_+P*D*D,G=(l===u?-1:1)*Math.sqrt(Math.abs(B/F));y=G*i*_/a+(t+r)/2,v=G*-a*D/i+(e+n)/2,m=Math.asin(parseFloat(((e-v)/a).toFixed(9))),g=Math.asin(parseFloat(((n-v)/a).toFixed(9))),tg&&(m-=2*Math.PI),!u&&g>m&&(g-=2*Math.PI)}let x=g-m;if(Math.abs(x)>120*Math.PI/180){let D=g,_=r,O=n;g=u&&g>m?m+120*Math.PI/180*1:m+120*Math.PI/180*-1,p=fJ(r=y+i*Math.cos(g),n=v+a*Math.sin(g),_,O,i,a,s,0,u,[g,D,y,v])}x=g-m;let b=Math.cos(m),T=Math.sin(m),S=Math.cos(g),w=Math.sin(g),k=Math.tan(x/4),A=4/3*i*k,C=4/3*a*k,R=[t,e],I=[t+A*T,e-C*b],L=[r+A*w,n-C*S],E=[r,n];if(I[0]=2*R[0]-I[0],I[1]=2*R[1]-I[1],h)return[I,L,E].concat(p);{p=[I,L,E].concat(p);let D=[];for(let _=0;_2){let i=[];for(let a=0;a2*Math.PI&&(m=0,g=2*Math.PI);let y=2*Math.PI/u.curveStepCount,v=Math.min(y/2,(g-m)/2),x=lJ(v,h,f,d,p,m,g,1,u);if(!u.disableMultiStroke){let b=lJ(v,h,f,d,p,m,g,1.5,u);x.push(...b)}return s&&(l?x.push(...Zh(h,f,h+d*Math.cos(m),f+p*Math.sin(m),u),...Zh(h,f,h+d*Math.cos(g),f+p*Math.sin(g),u)):x.push({op:"lineTo",data:[h,f]},{op:"lineTo",data:[h+d*Math.cos(m),f+p*Math.sin(m)]})),{type:"path",ops:x}}function aJ(t,e){let r=hJ(uJ(V9(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:l}of r)switch(s){case"M":a=[l[0],l[1]],i=[l[0],l[1]];break;case"L":n.push(...Zh(a[0],a[1],l[0],l[1],e)),a=[l[0],l[1]];break;case"C":{let[u,h,f,d,p,m]=l;n.push(...sRe(u,h,f,d,p,m,a,e)),a=[p,m];break}case"Z":n.push(...Zh(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function D9(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+or(i,e),n[0][1]+or(i,e)]});for(let s=1;s500?.4:-.0016668*u+1.233334;let f=i.maxRandomnessOffset||0;f*f*100>l&&(f=u/10);let d=f/2,p=.2+.2*mJ(i),m=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;m=or(m,i,h),g=or(g,i,h);let y=[],v=o(()=>or(d,i,h),"M"),x=o(()=>or(f,i,h),"k"),b=i.preserveVertices;return a&&(s?y.push({op:"move",data:[t+(b?0:v()),e+(b?0:v())]}):y.push({op:"move",data:[t+(b?0:or(f,i,h)),e+(b?0:or(f,i,h))]})),s?y.push({op:"bcurveTo",data:[m+t+(r-t)*p+v(),g+e+(n-e)*p+v(),m+t+2*(r-t)*p+v(),g+e+2*(n-e)*p+v(),r+(b?0:v()),n+(b?0:v())]}):y.push({op:"bcurveTo",data:[m+t+(r-t)*p+x(),g+e+(n-e)*p+x(),m+t+2*(r-t)*p+x(),g+e+2*(n-e)*p+x(),r+(b?0:x()),n+(b?0:x())]}),y}function KT(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+or(e,r),t[0][1]+or(e,r)]),n.push([t[0][0]+or(e,r),t[0][1]+or(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let l=1;l+21&&i.push(l)):i.push(l),i.push(t[e+3])}else{let u=t[e+0],h=t[e+1],f=t[e+2],d=t[e+3],p=Qd(u,h,.5),m=Qd(h,f,.5),g=Qd(f,d,.5),y=Qd(p,m,.5),v=Qd(m,g,.5),x=Qd(y,v,.5);$9([u,p,y,x],0,r,i),$9([x,v,g,d],0,r,i)}var a,s;return i}function lRe(t,e){return rw(t,0,t.length,e)}function rw(t,e,r,n,i){let a=i||[],s=t[e],l=t[r-1],u=0,h=1;for(let f=e+1;fu&&(u=d,h=f)}return Math.sqrt(u)>n?(rw(t,e,h+1,n,a),rw(t,h,r,n,a)):(a.length||a.push(s),a.push(l)),a}function L9(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?rw(n,0,n.length,r):n}var R2,R9,N9,M9,I9,O9,Ps,P9,nRe,A9,rJ,jT,iRe,co,Em,z9,QT,G9,Ze,Ht=N(()=>{"use strict";o(C9,"t");o(tRe,"e");o(rRe,"s");o(N2,"n");R2=class{static{o(this,"o")}constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=N2(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};o(nw,"a");R9=class extends R2{static{o(this,"h")}fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=N2(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],l=.5*n*Math.cos(a),u=.5*n*Math.sin(a);for(let[h,f]of i)nw([h,f])&&s.push([[h[0]-l,h[1]+u],[...f]],[[h[0]+l,h[1]-u],[...f]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},N9=class extends R2{static{o(this,"r")}fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},M9=class{static{o(this,"i")}constructor(e){this.helper=e}fillPolygons(e,r){let n=N2(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let l of e){let u=nw(l),h=u/i,f=Math.ceil(h)-1,d=u-f*i,p=(l[0][0]+l[1][0])/2-i/4,m=Math.min(l[0][1],l[1][1]);for(let g=0;g{let l=nw(s),u=Math.floor(l/(n+i)),h=(l+i-u*(n+i))/2,f=s[0],d=s[1];f[0]>d[0]&&(f=s[1],d=s[0]);let p=Math.atan((d[1]-f[1])/(d[0]-f[0]));for(let m=0;m{let s=nw(a),l=Math.round(s/(2*r)),u=a[0],h=a[1];u[0]>h[0]&&(u=a[1],h=a[0]);let f=Math.atan((h[1]-u[1])/(h[0]-u[0]));for(let d=0;d2*Math.PI&&(A=0,C=2*Math.PI);let R=(C-A)/b.curveStepCount,I=[];for(let L=A;L<=C;L+=R)I.push([T+w*Math.cos(L),S+k*Math.sin(L)]);return I.push([T+w*Math.cos(C),S+k*Math.sin(C)]),I.push([T,S]),km([I],b)})(e,r,n,i,a,s,h));return h.stroke!==co&&f.push(d),this._d("arc",f,h)}curve(e,r){let n=this._o(r),i=[],a=nJ(e,n);if(n.fill&&n.fill!==co)if(n.fillStyle==="solid"){let s=nJ(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],l=e;if(l.length){let u=typeof l[0][0]=="number"?[l]:l;for(let h of u)h.length<3?s.push(...h):h.length===3?s.push(...L9(cJ([h[0],h[0],h[1],h[2]]),10,(1+n.roughness)/2)):s.push(...L9(cJ(h),10,(1+n.roughness)/2))}s.length&&i.push(km([s],n))}return n.stroke!==co&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=ZT(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(D9([e],n)):i.push(km([e],n))),n.stroke!==co&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==co,s=n.stroke!==co,l=!!(n.simplification&&n.simplification<1),u=(function(f,d,p){let m=hJ(uJ(V9(f))),g=[],y=[],v=[0,0],x=[],b=o(()=>{x.length>=4&&y.push(...L9(x,d)),x=[]},"i"),T=o(()=>{b(),y.length&&(g.push(y),y=[])},"c");for(let{key:w,data:k}of m)switch(w){case"M":T(),v=[k[0],k[1]],y.push(v);break;case"L":b(),y.push([k[0],k[1]]);break;case"C":if(!x.length){let A=y.length?y[y.length-1]:v;x.push([A[0],A[1]])}x.push([k[0],k[1]]),x.push([k[2],k[3]]),x.push([k[4],k[5]]);break;case"Z":b(),y.push([v[0],v[1]])}if(T(),!p)return g;let S=[];for(let w of g){let k=lRe(w,p);k.length&&S.push(k)}return S})(e,1,l?4-4*(n.simplification||1):(1+n.roughness)/2),h=aJ(e,n);if(a)if(n.fillStyle==="solid")if(u.length===1){let f=aJ(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(f.ops)})}else i.push(D9(u,n));else i.push(km(u,n));return s&&(l?u.forEach((f=>{i.push(ZT(f,!1,n))})):i.push(h)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map((s=>+s.toFixed(r))):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:co};break;case"fillPath":s={d:this.opsToPath(a),stroke:co,strokeWidth:0,fill:n.fill||co};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||co,strokeWidth:n,fill:co}}_mergedShape(e){return e.filter(((r,n)=>n===0||r.op!=="move"))}},z9=class{static{o(this,"st")}constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new Em(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let l=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,l),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map((l=>+l.toFixed(n))):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h),h}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},QT="http://www.w3.org/2000/svg",G9=class{static{o(this,"ot")}constructor(e,r){this.svg=e,this.gen=new Em(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(QT,"g"),s=e.options.fixedDecimalPlaceDigits;for(let l of r){let u=null;switch(l.type){case"path":u=i.createElementNS(QT,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke",n.stroke),u.setAttribute("stroke-width",n.strokeWidth+""),u.setAttribute("fill","none"),n.strokeLineDash&&u.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&u.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":u=i.createElementNS(QT,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke","none"),u.setAttribute("stroke-width","0"),u.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||u.setAttribute("fill-rule","evenodd");break;case"fillSketch":u=this.fillSketch(i,l,n)}u&&a.appendChild(u)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(QT,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},Ze={canvas:o((t,e)=>new z9(t,e),"canvas"),svg:o((t,e)=>new G9(t,e),"svg"),generator:o(t=>new Em(t),"generator"),newSeed:o(()=>Em.newSeed(),"newSeed")}});function gJ(t,e){let{labelStyles:r}=je(e);e.labelStyle=r;let n=st(e),i=n;n||(i="anchor");let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=1,{cssStyles:l}=e,u=Ze.svg(a),h=Je(e,{fill:"black",stroke:"none",fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=u.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.attr("class","anchor").attr("style",Cn(l)),Qe(e,d),e.intersect=function(p){return X.info("Circle intersect",e,s,p),Xe.circle(e,s,p)},a}var yJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();tr();o(gJ,"anchor")});function vJ(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),T=Math.atan2((e-b)/a,(t-x)/i),w=Math.atan2((n-b)/a,(r-x)/i)-T;s&&w<0&&(w+=2*Math.PI),!s&&w>0&&(w-=2*Math.PI);let k=[];for(let A=0;A<20;A++){let C=A/19,R=T+C*w,I=x+i*Math.cos(R),L=b+a*Math.sin(R);k.push({x:I,y:L})}return k}async function xJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.width+e.padding+20,l=a.height+e.padding,u=l/2,h=u/(2.5+l/50),{cssStyles:f}=e,d=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...vJ(-s/2,-l/2,-s/2,l/2,h,u,!1),{x:s/2,y:l/2},...vJ(s/2,l/2,s/2,-l/2,h,u,!0)],p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Vt(d),y=p.path(g,m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(${h/2}, 0)`),Qe(e,v),e.intersect=function(x){return Xe.polygon(e,d,x)},i}var bJ=N(()=>{"use strict";It();Ut();$t();Ht();o(vJ,"generateArcPoints");o(xJ,"bowTieRect")});function Bs(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Jh=N(()=>{"use strict";o(Bs,"insertPolygonShape")});async function TJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.height+e.padding,l=12,u=a.width+e.padding+l,h=0,f=u,d=-s,p=0,m=[{x:h+l,y:d},{x:f,y:d},{x:f,y:p},{x:h,y:p},{x:h,y:d+l},{x:h+l,y:d}],g,{cssStyles:y}=e;if(e.look==="handDrawn"){let v=Ze.svg(i),x=Je(e,{}),b=Vt(m),T=v.path(b,x);g=i.insert(()=>T,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),y&&g.attr("style",y)}else g=Bs(i,u,s,m);return n&&g.attr("style",n),Qe(e,g),e.intersect=function(v){return Xe.polygon(e,m,v)},i}var wJ=N(()=>{"use strict";It();Ut();$t();Ht();Jh();It();o(TJ,"card")});function kJ(t,e){let{nodeStyles:r}=je(e);e.label="";let n=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],l=Ze.svg(n),u=Je(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=Vt(s),f=l.path(h,u),d=n.insert(()=>f,":first-child");return i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(p){return Xe.polygon(e,s,p)},n}var EJ=N(()=>{"use strict";Ut();Ht();$t();It();o(kJ,"choice")});async function iw(t,e,r){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n;let{shapeSvg:a,bbox:s,halfPadding:l}=await ut(t,e,st(e)),u=r?.padding??l,h=s.width/2+u,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Ze.svg(a),m=Je(e,{}),g=p.circle(0,0,h*2,m);f=a.insert(()=>g,":first-child"),f.attr("class","basic label-container").attr("style",Cn(d))}else f=a.insert("circle",":first-child").attr("class","basic label-container").attr("style",i).attr("r",h).attr("cx",0).attr("cy",0);return Qe(e,f),e.calcIntersect=function(p,m){let g=p.width/2;return Xe.circle(p,g,m)},e.intersect=function(p){return X.info("Circle intersect",e,h,p),Xe.circle(e,h,p)},a}var U9=N(()=>{"use strict";Ht();pt();tr();Ut();$t();It();o(iw,"circle")});function cRe(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},l={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${l.x},${l.y} + M ${i.x},${i.y} L ${s.x},${s.y}`}function SJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,l=Ze.svg(i),u=Je(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=l.circle(0,0,a*2,u),f=cRe(a),d=l.path(f,u),p=i.insert(()=>h,":first-child");return p.insert(()=>d),s&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",n),Qe(e,p),e.intersect=function(m){return X.info("crossedCircle intersect",e,{radius:a,point:m}),Xe.circle(e,a,m)},i}var CJ=N(()=>{"use strict";pt();It();$t();Ht();Ut();o(cRe,"createLine");o(SJ,"crossedCircle")});function ef(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),S.insert(()=>x,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${h}, 0)`),s.attr("transform",`translate(${-l/2+h-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,S),e.intersect=function(w){return Xe.polygon(e,p,w)},i}var _J=N(()=>{"use strict";It();Ut();$t();Ht();o(ef,"generateCirclePoints");o(AJ,"curlyBraceLeft")});function tf(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),S.insert(()=>x,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${-h}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,S),e.intersect=function(w){return Xe.polygon(e,p,w)},i}var LJ=N(()=>{"use strict";It();Ut();$t();Ht();o(tf,"generateCirclePoints");o(DJ,"curlyBraceRight")});function Oa(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dA,":first-child").attr("stroke-opacity",0),C.insert(()=>b,":first-child"),C.insert(()=>w,":first-child"),C.attr("class","text"),f&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(${h-h/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,C),e.intersect=function(R){return Xe.polygon(e,m,R)},i}var NJ=N(()=>{"use strict";It();Ut();$t();Ht();o(Oa,"generateCirclePoints");o(RJ,"curlyBraces")});async function MJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=80,l=20,u=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=u,y=h,v=g-f,x=y/4,b=[{x:v,y:0},{x,y:0},{x:0,y:y/2},{x,y},{x:v,y},...Kd(-v,-y/2,f,50,270,90)],T=Vt(b),S=p.path(T,m),w=i.insert(()=>S,":first-child");return w.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",n),w.attr("transform",`translate(${-u/2}, ${-h/2})`),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,b,k)},i}var IJ=N(()=>{"use strict";It();Ut();$t();Ht();o(MJ,"curvedTrapezoid")});async function OJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+e.padding,e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+e.padding,e.height??0),d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Ze.svg(i),g=hRe(0,0,l,f,u,h),y=fRe(0,h,l,f,u,h),v=m.path(g,Je(e,{})),x=m.path(y,Je(e,{fill:"none"}));d=i.insert(()=>x,":first-child"),d=i.insert(()=>v,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let m=uRe(0,0,l,f,u,h);d=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",Cn(p)).attr("style",n)}return d.attr("label-offset-y",h),d.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),Qe(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(m){let g=Xe.rect(e,m),y=g.x-(e.x??0);if(u!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-h)){let v=h*h*(1-y*y/(u*u));v>0&&(v=Math.sqrt(v)),v=h-v,m.y-(e.y??0)>0&&(v=-v),g.y+=v}return g},i}var uRe,hRe,fRe,PJ=N(()=>{"use strict";It();Ut();$t();Ht();tr();uRe=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),hRe=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),fRe=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(OJ,"cylinder")});async function BJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=a.width+e.padding,u=a.height+e.padding,h=u*.2,f=-l/2,d=-u/2-h/2,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d+h},{x:-f,y:d+h},{x:-f,y:-d},{x:f,y:-d},{x:f,y:d},{x:-f,y:d},{x:-f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${f+(e.padding??0)/2-(a.x-(a.left??0))}, ${d+h+(e.padding??0)/2-(a.y-(a.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.rect(e,b)},i}var FJ=N(()=>{"use strict";It();Ut();$t();Ht();o(BJ,"dividedRectangle")});async function $J(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await ut(t,e,st(e)),u=a.width/2+s+5,h=a.width/2+s,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Ze.svg(i),m=Je(e,{roughness:.2,strokeWidth:2.5}),g=Je(e,{roughness:.2,strokeWidth:1.5}),y=p.circle(0,0,u*2,m),v=p.circle(0,0,h*2,g);f=i.insert("g",":first-child"),f.attr("class",Cn(e.cssClasses)).attr("style",Cn(d)),f.node()?.appendChild(y),f.node()?.appendChild(v)}else{f=i.insert("g",":first-child");let p=f.insert("circle",":first-child"),m=f.insert("circle");f.attr("class","basic label-container").attr("style",n),p.attr("class","outer-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0),m.attr("class","inner-circle").attr("style",n).attr("r",h).attr("cx",0).attr("cy",0)}return Qe(e,f),e.intersect=function(p){return X.info("DoubleCircle intersect",e,u,p),Xe.circle(e,u,p)},i}var zJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();tr();o($J,"doublecircle")});function GJ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=je(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),s=7,{cssStyles:l}=e,u=Ze.svg(a),{nodeBorder:h}=r,f=Je(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(f.roughness=0);let d=u.circle(0,0,s*2,f),p=a.insert(()=>d,":first-child");return p.selectAll("path").attr("style",`fill: ${h} !important;`),l&&l.length>0&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",l),i&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",i),Qe(e,p),e.intersect=function(m){return X.info("filledCircle intersect",e,{radius:s,point:m}),Xe.circle(e,s,m)},a}var VJ=N(()=>{"use strict";Ht();pt();Ut();$t();It();o(GJ,"filledCircle")});async function UJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:-u},{x:h,y:-u},{x:h/2,y:0}],{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Vt(f),y=p.path(g,m),v=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),e.width=l,e.height=u,Qe(e,v),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-u/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return X.info("Triangle intersect",e,f,x),Xe.polygon(e,f,x)},i}var HJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();It();o(UJ,"flippedTriangle")});function qJ(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=je(e);e.label="";let s=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,u=Math.max(70,e?.width??0),h=Math.max(10,e?.height??0);r==="LR"&&(u=Math.max(10,e?.width??0),h=Math.max(70,e?.height??0));let f=-1*u/2,d=-1*h/2,p=Ze.svg(s),m=Je(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=p.rectangle(f,d,u,h,m),y=s.insert(()=>g,":first-child");l&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",l),a&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",a),Qe(e,y);let v=n?.padding??0;return e.width&&e.height&&(e.width+=v/2||0,e.height+=v/2||0),e.intersect=function(x){return Xe.rect(e,x)},s}var WJ=N(()=>{"use strict";Ht();Ut();$t();It();o(qJ,"forkJoin")});async function YJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:l}=await ut(t,e,st(e)),u=Math.max(i,l.width+(e.padding??0)*2,e?.width??0),h=Math.max(a,l.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Ze.svg(s),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-u/2,y:-h/2},{x:u/2-f,y:-h/2},...Kd(-u/2+f,0,f,50,90,270),{x:u/2-f,y:h/2},{x:-u/2,y:h/2}],y=Vt(g),v=p.path(y,m),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),Qe(e,x),e.intersect=function(b){return X.info("Pill intersect",e,{radius:f,point:b}),Xe.polygon(e,g,b)},s}var XJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();o(YJ,"halfRoundedRectangle")});async function jJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.height+(e.padding??0),l=a.width+(e.padding??0)*2.5,{cssStyles:u}=e,h=Ze.svg(i),f=Je(e,{});e.look!=="handDrawn"&&(f.roughness=0,f.fillStyle="solid");let d=l/2,p=d/6;d=d+p;let m=s/2,g=m/2,y=d-g,v=[{x:-y,y:-m},{x:0,y:-m},{x:y,y:-m},{x:d,y:0},{x:y,y:m},{x:0,y:m},{x:-y,y:m},{x:-d,y:0}],x=Vt(v),b=h.path(x,f),T=i.insert(()=>b,":first-child");return T.attr("class","basic label-container"),u&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",u),n&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",n),e.width=l,e.height=s,Qe(e,T),e.intersect=function(S){return Xe.polygon(e,v,S)},i}var KJ=N(()=>{"use strict";It();Ut();$t();Ht();o(jJ,"hexagon")});async function QJ(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await ut(t,e,st(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:l}=e,u=Ze.svg(i),h=Je(e,{});e.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let f=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],d=Vt(f),p=u.path(d,h),m=i.insert(()=>p,":first-child");return m.attr("class","basic label-container"),l&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",l),n&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",n),m.attr("transform",`translate(${-a/2}, ${-s/2})`),Qe(e,m),e.intersect=function(g){return X.info("Pill intersect",e,{points:f}),Xe.polygon(e,f,g)},i}var ZJ=N(()=>{"use strict";pt();It();Ut();$t();Ht();o(QJ,"hourglass")});async function JJ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await ut(t,e,"icon-shape default"),p=e.pos==="t",m=l,g=l,{nodeBorder:y}=r,{stylesMap:v}=wc(e),x=-g/2,b=-m/2,T=e.label?8:0,S=Ze.svg(h),w=Je(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let k=S.rectangle(x,b,g,m,w),A=Math.max(g,f.width),C=m+f.height+T,R=S.rectangle(-A/2,-C/2,A,C,{...w,fill:"transparent",stroke:"none"}),I=h.insert(()=>k,":first-child"),L=h.insert(()=>R);if(e.icon){let E=h.append("g");E.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let D=E.node().getBBox(),_=D.width,O=D.height,M=D.x,P=D.y;E.attr("transform",`translate(${-_/2-M},${p?f.height/2+T/2-O/2-P:-f.height/2-T/2-O/2-P})`),E.attr("style",`color: ${v.get("stroke")??y};`)}return d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${p?-C/2:C/2-f.height})`),I.attr("transform",`translate(0,${p?f.height/2+T/2:-f.height/2-T/2})`),Qe(e,L),e.intersect=function(E){if(X.info("iconSquare intersect",e,E),!e.label)return Xe.rect(e,E);let D=e.x??0,_=e.y??0,O=e.height??0,M=[];return p?M=[{x:D-f.width/2,y:_-O/2},{x:D+f.width/2,y:_-O/2},{x:D+f.width/2,y:_-O/2+f.height+T},{x:D+g/2,y:_-O/2+f.height+T},{x:D+g/2,y:_+O/2},{x:D-g/2,y:_+O/2},{x:D-g/2,y:_-O/2+f.height+T},{x:D-f.width/2,y:_-O/2+f.height+T}]:M=[{x:D-g/2,y:_-O/2},{x:D+g/2,y:_-O/2},{x:D+g/2,y:_-O/2+m},{x:D+f.width/2,y:_-O/2+m},{x:D+f.width/2/2,y:_+O/2},{x:D-f.width/2,y:_+O/2},{x:D-f.width/2,y:_-O/2+m},{x:D-g/2,y:_-O/2+m}],Xe.polygon(e,M,E)},h}var eee=N(()=>{"use strict";Ht();pt();nc();Ut();$t();It();o(JJ,"icon")});async function tee(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await ut(t,e,"icon-shape default"),p=20,m=e.label?8:0,g=e.pos==="t",{nodeBorder:y,mainBkg:v}=r,{stylesMap:x}=wc(e),b=Ze.svg(h),T=Je(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=x.get("fill");T.stroke=S??v;let w=h.append("g");e.icon&&w.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let k=w.node().getBBox(),A=k.width,C=k.height,R=k.x,I=k.y,L=Math.max(A,C)*Math.SQRT2+p*2,E=b.circle(0,0,L,T),D=Math.max(L,f.width),_=L+f.height+m,O=b.rectangle(-D/2,-_/2,D,_,{...T,fill:"transparent",stroke:"none"}),M=h.insert(()=>E,":first-child"),P=h.insert(()=>O);return w.attr("transform",`translate(${-A/2-R},${g?f.height/2+m/2-C/2-I:-f.height/2-m/2-C/2-I})`),w.attr("style",`color: ${x.get("stroke")??y};`),d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${g?-_/2:_/2-f.height})`),M.attr("transform",`translate(0,${g?f.height/2+m/2:-f.height/2-m/2})`),Qe(e,P),e.intersect=function(B){return X.info("iconSquare intersect",e,B),Xe.rect(e,B)},h}var ree=N(()=>{"use strict";Ht();pt();nc();Ut();$t();It();o(tee,"iconCircle")});var Fs,Zd=N(()=>{"use strict";Fs=o((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD")});async function nee(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await ut(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=wc(e),T=-y/2,S=-g/2,w=e.label?8:0,k=Ze.svg(h),A=Je(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let C=b.get("fill");A.stroke=C??x;let R=k.path(Fs(T,S,y,g,5),A),I=Math.max(y,f.width),L=g+f.height+w,E=k.rectangle(-I/2,-L/2,I,L,{...A,fill:"transparent",stroke:"none"}),D=h.insert(()=>R,":first-child").attr("class","icon-shape2"),_=h.insert(()=>E);if(e.icon){let O=h.append("g");O.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=O.node().getBBox(),P=M.width,B=M.height,F=M.x,G=M.y;O.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-G:-f.height/2-w/2-B/2-G})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-L/2:L/2-f.height})`),D.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),Qe(e,_),e.intersect=function(O){if(X.info("iconSquare intersect",e,O),!e.label)return Xe.rect(e,O);let M=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:M-f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2+f.height+w},{x:M+y/2,y:P-B/2+f.height+w},{x:M+y/2,y:P+B/2},{x:M-y/2,y:P+B/2},{x:M-y/2,y:P-B/2+f.height+w},{x:M-f.width/2,y:P-B/2+f.height+w}]:F=[{x:M-y/2,y:P-B/2},{x:M+y/2,y:P-B/2},{x:M+y/2,y:P-B/2+g},{x:M+f.width/2,y:P-B/2+g},{x:M+f.width/2/2,y:P+B/2},{x:M-f.width/2,y:P+B/2},{x:M-f.width/2,y:P-B/2+g},{x:M-y/2,y:P-B/2+g}],Xe.polygon(e,F,O)},h}var iee=N(()=>{"use strict";Ht();pt();nc();Ut();$t();Zd();It();o(nee,"iconRounded")});async function aee(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=je(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await ut(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=wc(e),T=-y/2,S=-g/2,w=e.label?8:0,k=Ze.svg(h),A=Je(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let C=b.get("fill");A.stroke=C??x;let R=k.path(Fs(T,S,y,g,.1),A),I=Math.max(y,f.width),L=g+f.height+w,E=k.rectangle(-I/2,-L/2,I,L,{...A,fill:"transparent",stroke:"none"}),D=h.insert(()=>R,":first-child"),_=h.insert(()=>E);if(e.icon){let O=h.append("g");O.html(`${await _s(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=O.node().getBBox(),P=M.width,B=M.height,F=M.x,G=M.y;O.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-G:-f.height/2-w/2-B/2-G})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-L/2:L/2-f.height})`),D.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),Qe(e,_),e.intersect=function(O){if(X.info("iconSquare intersect",e,O),!e.label)return Xe.rect(e,O);let M=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:M-f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2+f.height+w},{x:M+y/2,y:P-B/2+f.height+w},{x:M+y/2,y:P+B/2},{x:M-y/2,y:P+B/2},{x:M-y/2,y:P-B/2+f.height+w},{x:M-f.width/2,y:P-B/2+f.height+w}]:F=[{x:M-y/2,y:P-B/2},{x:M+y/2,y:P-B/2},{x:M+y/2,y:P-B/2+g},{x:M+f.width/2,y:P-B/2+g},{x:M+f.width/2/2,y:P+B/2},{x:M-f.width/2,y:P+B/2},{x:M-f.width/2,y:P-B/2+g},{x:M-y/2,y:P-B/2+g}],Xe.polygon(e,F,O)},h}var see=N(()=>{"use strict";Ht();pt();nc();Ut();Zd();$t();It();o(aee,"iconSquare")});async function oee(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=je(e);e.labelStyle=s;let l=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let u=Math.max(e.label?l??0:0,e?.assetWidth??i),h=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:u,f=e.constraint==="on"?h/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(h,l??0);let{shapeSvg:d,bbox:p,label:m}=await ut(t,e,"image-shape default"),g=e.pos==="t",y=-h/2,v=-f/2,x=e.label?8:0,b=Ze.svg(d),T=Je(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=b.rectangle(y,v,h,f,T),w=Math.max(h,p.width),k=f+p.height+x,A=b.rectangle(-w/2,-k/2,w,k,{...T,fill:"none",stroke:"none"}),C=d.insert(()=>S,":first-child"),R=d.insert(()=>A);if(e.img){let I=d.append("image");I.attr("href",e.img),I.attr("width",h),I.attr("height",f),I.attr("preserveAspectRatio","none"),I.attr("transform",`translate(${-h/2},${g?k/2-f:-k/2})`)}return m.attr("transform",`translate(${-p.width/2-(p.x-(p.left??0))},${g?-f/2-p.height/2-x/2:f/2-p.height/2+x/2})`),C.attr("transform",`translate(0,${g?p.height/2+x/2:-p.height/2-x/2})`),Qe(e,R),e.intersect=function(I){if(X.info("iconSquare intersect",e,I),!e.label)return Xe.rect(e,I);let L=e.x??0,E=e.y??0,D=e.height??0,_=[];return g?_=[{x:L-p.width/2,y:E-D/2},{x:L+p.width/2,y:E-D/2},{x:L+p.width/2,y:E-D/2+p.height+x},{x:L+h/2,y:E-D/2+p.height+x},{x:L+h/2,y:E+D/2},{x:L-h/2,y:E+D/2},{x:L-h/2,y:E-D/2+p.height+x},{x:L-p.width/2,y:E-D/2+p.height+x}]:_=[{x:L-h/2,y:E-D/2},{x:L+h/2,y:E-D/2},{x:L+h/2,y:E-D/2+f},{x:L+p.width/2,y:E-D/2+f},{x:L+p.width/2/2,y:E+D/2},{x:L-p.width/2,y:E+D/2},{x:L-p.width/2,y:E-D/2+f},{x:L-h/2,y:E-D/2+f}],Xe.polygon(e,_,I)},d}var lee=N(()=>{"use strict";Ht();pt();Ut();$t();It();o(oee,"imageSquare")});async function cee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var uee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(cee,"inv_trapezoid")});async function Jd(t,e,r){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await ut(t,e,st(e)),l=Math.max(s.width+r.labelPaddingX*2,e?.width||0),u=Math.max(s.height+r.labelPaddingY*2,e?.height||0),h=-l/2,f=-u/2,d,{rx:p,ry:m}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(p=r.rx,m=r.ry),e.look==="handDrawn"){let y=Ze.svg(a),v=Je(e,{}),x=p||m?y.path(Fs(h,f,l,u,p||0),v):y.rectangle(h,f,l,u,v);d=a.insert(()=>x,":first-child"),d.attr("class","basic label-container").attr("style",Cn(g))}else d=a.insert("rect",":first-child"),d.attr("class","basic label-container").attr("style",i).attr("rx",Cn(p)).attr("ry",Cn(m)).attr("x",h).attr("y",f).attr("width",l).attr("height",u);return Qe(e,d),e.calcIntersect=function(y,v){return Xe.rect(y,v)},e.intersect=function(y){return Xe.rect(e,y)},a}var M2=N(()=>{"use strict";It();Ut();Zd();$t();Ht();tr();o(Jd,"drawRect")});async function hee(t,e){let{shapeSvg:r,bbox:n,label:i}=await ut(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),Qe(e,a),e.intersect=function(u){return Xe.rect(e,u)},r}var fee=N(()=>{"use strict";M2();It();Ut();o(hee,"labelRect")});async function dee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-(3*l)/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var pee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(dee,"lean_left")});async function mee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var gee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(mee,"lean_right")});function yee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",st(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),l=Math.max(35,e?.height??0),u=7,h=[{x:s,y:0},{x:0,y:l+u/2},{x:s-2*u,y:l+u/2},{x:0,y:2*l},{x:s,y:l-u/2},{x:2*u,y:l-u/2}],f=Ze.svg(i),d=Je(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=Vt(h),m=f.path(p,d),g=i.insert(()=>m,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-l})`),Qe(e,g),e.intersect=function(y){return X.info("lightningBolt intersect",e,y),Xe.polygon(e,h,y)},i}var vee=N(()=>{"use strict";pt();It();$t();Ht();Ut();It();o(yee,"lightningBolt")});async function xee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0),e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+(e.padding??0),e.height??0),d=f*.1,p,{cssStyles:m}=e;if(e.look==="handDrawn"){let g=Ze.svg(i),y=pRe(0,0,l,f,u,h,d),v=mRe(0,h,l,f,u,h),x=Je(e,{}),b=g.path(y,x),T=g.path(v,x);i.insert(()=>T,":first-child").attr("class","line"),p=i.insert(()=>b,":first-child"),p.attr("class","basic label-container"),m&&p.attr("style",m)}else{let g=dRe(0,0,l,f,u,h,d);p=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",Cn(m)).attr("style",n)}return p.attr("label-offset-y",h),p.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),Qe(e,p),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),e.intersect=function(g){let y=Xe.rect(e,g),v=y.x-(e.x??0);if(u!=0&&(Math.abs(v)<(e.width??0)/2||Math.abs(v)==(e.width??0)/2&&Math.abs(y.y-(e.y??0))>(e.height??0)/2-h)){let x=h*h*(1-v*v/(u*u));x>0&&(x=Math.sqrt(x)),x=h-x,g.y-(e.y??0)>0&&(x=-x),y.y+=x}return y},i}var dRe,pRe,mRe,bee=N(()=>{"use strict";It();Ut();$t();Ht();tr();dRe=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),pRe=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),mRe=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(xee,"linedCylinder")});async function Tee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-l/2-l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:f/2},...Go(-l/2-l/2*.1,f/2,l/2+l/2*.1,f/2,h,.8),{x:l/2+l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:-f/2},{x:-l/2,y:-f/2},{x:-l/2,y:f/2*1.1},{x:-l/2,y:-f/2}],y=p.polygon(g.map(x=>[x.x,x.y]),m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),Qe(e,v),e.intersect=function(x){return Xe.polygon(e,g,x)},i}var wee=N(()=>{"use strict";It();Ut();Ht();$t();o(Tee,"linedWaveEdgedRect")});async function kee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{}),y=[{x:f-h,y:d+h},{x:f-h,y:d+u+h},{x:f+l-h,y:d+u+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d+u-h},{x:f+l+h,y:d+u-h},{x:f+l+h,y:d-h},{x:f+h,y:d-h},{x:f+h,y:d},{x:f,y:d},{x:f,y:d+h}],v=[{x:f,y:d+h},{x:f+l-h,y:d+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d},{x:f,y:d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Vt(y),b=m.path(x,g),T=Vt(v),S=m.path(T,{...g,fill:"none"}),w=i.insert(()=>S,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-h-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,y,k)},i}var Eee=N(()=>{"use strict";It();$t();Ht();Ut();o(kee,"multiRect")});async function See(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,d=-l/2,p=-f/2,m=5,{cssStyles:g}=e,y=Go(d-m,p+f+m,d+l-m,p+f+m,h,.8),v=y?.[y.length-1],x=[{x:d-m,y:p+m},{x:d-m,y:p+f+m},...y,{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:v.y-2*m},{x:d+l+m,y:v.y-2*m},{x:d+l+m,y:p-m},{x:d+m,y:p-m},{x:d+m,y:p},{x:d,y:p},{x:d,y:p+m}],b=[{x:d,y:p+m},{x:d+l-m,y:p+m},{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:p},{x:d,y:p}],T=Ze.svg(i),S=Je(e,{});e.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let w=Vt(x),k=T.path(w,S),A=Vt(b),C=T.path(A,S),R=i.insert(()=>k,":first-child");return R.insert(()=>C),R.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&R.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&R.selectAll("path").attr("style",n),R.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-(a.width/2)-m-(a.x-(a.left??0))}, ${-(a.height/2)+m-h/2-(a.y-(a.top??0))})`),Qe(e,R),e.intersect=function(I){return Xe.polygon(e,x,I)},i}var Cee=N(()=>{"use strict";It();Ut();Ht();$t();o(See,"multiWaveEdgedRectangle")});async function Aee(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n,e.useHtmlLabels||Qt().flowchart?.htmlLabels!==!1||(e.centerLabel=!0);let{shapeSvg:s,bbox:l,label:u}=await ut(t,e,st(e)),h=Math.max(l.width+(e.padding??0)*2,e?.width??0),f=Math.max(l.height+(e.padding??0)*2,e?.height??0),d=-h/2,p=-f/2,{cssStyles:m}=e,g=Ze.svg(s),y=Je(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=g.rectangle(d,p,h,f,y),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",m),i&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",i),u.attr("transform",`translate(${-l.width/2-(l.x-(l.left??0))}, ${-(l.height/2)-(l.y-(l.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.rect(e,b)},s}var _ee=N(()=>{"use strict";Ht();Ut();$t();It();qn();o(Aee,"note")});async function Dee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.width+e.padding,l=a.height+e.padding,u=s+l,h=.5,f=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Ze.svg(i),g=Je(e,{}),y=gRe(0,0,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-u/2+h}, ${u/2})`),p&&d.attr("style",p)}else d=Bs(i,u,u,f),d.attr("transform",`translate(${-u/2+h}, ${u/2})`);return n&&d.attr("style",n),Qe(e,d),e.calcIntersect=function(m,g){let y=m.width,v=[{x:y/2,y:0},{x:y,y:-y/2},{x:y/2,y:-y},{x:0,y:-y/2}],x=Xe.polygon(m,v,g);return{x:x.x-.5,y:x.y-.5}},e.intersect=function(m){return this.calcIntersect(e,m)},i}var gRe,Lee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();gRe=o((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");o(Dee,"question")});async function Ree(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0),e?.width??0),u=Math.max(a.height+(e.padding??0),e?.height??0),h=-l/2,f=-u/2,d=f/2,p=[{x:h+d,y:f},{x:h,y:0},{x:h+d,y:-f},{x:-h,y:-f},{x:-h,y:f}],{cssStyles:m}=e,g=Ze.svg(i),y=Je(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=Vt(p),x=g.path(v,y),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-d/2},0)`),s.attr("transform",`translate(${-d/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Qe(e,b),e.intersect=function(T){return Xe.polygon(e,p,T)},i}var Nee=N(()=>{"use strict";It();Ut();$t();Ht();o(Ree,"rect_left_inv_arrow")});function yRe(t,e){e&&t.attr("style",e)}async function vRe(t){let e=qe(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=ge(),i=t.label;t.label&&kn(t.label)&&(i=await kh(t.label.replace(tt.lineBreakRegex,` +`),n));let s='"+i+"";return r.html(sr(s,n)),yRe(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var xRe,kc,aw=N(()=>{"use strict";yr();Xt();gr();pt();tr();o(yRe,"applyStyle");o(vRe,"addHtmlLabel");xRe=o(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),vr(ge().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
      "),X.info("vertexText"+i);let a={isNode:n,label:Ji(i).replace(/fa[blrs]?:fa-[\w-]+/g,l=>``),labelStyle:e&&e.replace("fill:","color:")};return await vRe(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),kc=xRe});async function Mee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),l=a.insert("g").attr("class","label").attr("style",n),u=e.description,h=e.label,f=l.node().appendChild(await kc(h,e.labelStyle,!0,!0)),d={width:0,height:0};if(vr(ge()?.flowchart?.htmlLabels)){let C=f.children[0],R=qe(f);d=C.getBoundingClientRect(),R.attr("width",d.width),R.attr("height",d.height)}X.info("Text 2",u);let p=u||[],m=f.getBBox(),g=l.node().appendChild(await kc(p.join?p.join("
      "):p,e.labelStyle,!0,!0)),y=g.children[0],v=qe(g);d=y.getBoundingClientRect(),v.attr("width",d.width),v.attr("height",d.height);let x=(e.padding||0)/2;qe(g).attr("transform","translate( "+(d.width>m.width?0:(m.width-d.width)/2)+", "+(m.height+x+5)+")"),qe(f).attr("transform","translate( "+(d.width(X.debug("Rough node insert CXC",I),L),":first-child"),k=a.insert(()=>(X.debug("Rough node insert CXC",I),I),":first-child")}else k=s.insert("rect",":first-child"),A=s.insert("line"),k.attr("class","outer title-state").attr("style",n).attr("x",-d.width/2-x).attr("y",-d.height/2-x).attr("width",d.width+(e.padding||0)).attr("height",d.height+(e.padding||0)),A.attr("class","divider").attr("x1",-d.width/2-x).attr("x2",d.width/2+x).attr("y1",-d.height/2-x+m.height+x).attr("y2",-d.height/2-x+m.height+x);return Qe(e,k),e.intersect=function(C){return Xe.rect(e,C)},a}var Iee=N(()=>{"use strict";yr();gr();It();aw();Ut();$t();Ht();Xt();Zd();pt();o(Mee,"rectWithTitle")});function sw(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),T=Math.atan2((e-b)/a,(t-x)/i),w=Math.atan2((n-b)/a,(r-x)/i)-T;s&&w<0&&(w+=2*Math.PI),!s&&w>0&&(w-=2*Math.PI);let k=[];for(let A=0;A<20;A++){let C=A/19,R=T+C*w,I=x+i*Math.cos(R),L=b+a*Math.sin(R);k.push({x:I,y:L})}return k}async function Oee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=e?.padding??0,l=e?.padding??0,u=(e?.width?e?.width:a.width)+s*2,h=(e?.height?e?.height:a.height)+l*2,f=e.radius||5,d=e.taper||5,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.stroke&&(g.stroke=e.stroke),e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:-u/2+d,y:-h/2},{x:u/2-d,y:-h/2},...sw(u/2-d,-h/2,u/2,-h/2+d,f,f,!0),{x:u/2,y:-h/2+d},{x:u/2,y:h/2-d},...sw(u/2,h/2-d,u/2-d,h/2,f,f,!0),{x:u/2-d,y:h/2},{x:-u/2+d,y:h/2},...sw(-u/2+d,h/2,-u/2,h/2-d,f,f,!0),{x:-u/2,y:h/2-d},{x:-u/2,y:-h/2+d},...sw(-u/2,-h/2+d,-u/2+d,-h/2,f,f,!0)],v=Vt(y),x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container outer-path"),p&&e.look!=="handDrawn"&&b.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectChildren("path").attr("style",n),Qe(e,b),e.intersect=function(T){return Xe.polygon(e,y,T)},i}var Pee=N(()=>{"use strict";It();Ut();$t();Ht();o(sw,"generateArcPoints");o(Oee,"roundedRect")});async function Bee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=e?.padding??0,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=-a.width/2-l,d=-a.height/2-l,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d},{x:f+u+8,y:d},{x:f+u+8,y:d+h},{x:f-8,y:d+h},{x:f-8,y:d},{x:f,y:d},{x:f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container").attr("style",Cn(p)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-u/2+4+(e.padding??0)-(a.x-(a.left??0))},${-h/2+(e.padding??0)-(a.y-(a.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.rect(e,b)},i}var Fee=N(()=>{"use strict";It();Ut();$t();Ht();tr();o(Bee,"shadedProcess")});async function $ee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=Ze.svg(i),m=Je(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:h,y:f},{x:h,y:f+u},{x:h+l,y:f+u},{x:h+l,y:f-u/2}],y=Vt(g),v=p.path(y,m),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))}, ${-u/4+(e.padding??0)-(a.y-(a.top??0))})`),Qe(e,x),e.intersect=function(b){return Xe.polygon(e,g,b)},i}var zee=N(()=>{"use strict";It();Ut();$t();Ht();o($ee,"slopedRect")});async function Gee(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:e.labelPaddingX??(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return Jd(t,e,r)}var Vee=N(()=>{"use strict";M2();o(Gee,"squareRect")});async function Uee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.height+e.padding,l=a.width+s/4+e.padding,u=s/2,{cssStyles:h}=e,f=Ze.svg(i),d=Je(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=[{x:-l/2+u,y:-s/2},{x:l/2-u,y:-s/2},...Kd(-l/2+u,0,u,50,90,270),{x:l/2-u,y:s/2},...Kd(l/2-u,0,u,50,270,450)],m=Vt(p),g=f.path(m,d),y=i.insert(()=>g,":first-child");return y.attr("class","basic label-container outer-path"),h&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",h),n&&e.look!=="handDrawn"&&y.selectChildren("path").attr("style",n),Qe(e,y),e.intersect=function(v){return Xe.polygon(e,p,v)},i}var Hee=N(()=>{"use strict";It();Ut();$t();Ht();o(Uee,"stadium")});async function qee(t,e){return Jd(t,e,{rx:5,ry:5,classes:"flowchart-node"})}var Wee=N(()=>{"use strict";M2();o(qee,"state")});function Yee(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:l,nodeBorder:u}=r,h=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),f=Ze.svg(h),d=Je(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=f.circle(0,0,14,{...d,stroke:s,strokeWidth:2}),m=l??u,g=f.circle(0,0,5,{...d,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),y=h.insert(()=>p,":first-child");return y.insert(()=>g),a&&y.selectAll("path").attr("style",a),i&&y.selectAll("path").attr("style",i),Qe(e,y),e.intersect=function(v){return Xe.circle(e,7,v)},h}var Xee=N(()=>{"use strict";Ht();Ut();$t();It();o(Yee,"stateEnd")});function jee(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let l=Ze.svg(i).circle(0,0,14,tJ(n));a=i.insert(()=>l),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return Qe(e,a),e.intersect=function(s){return Xe.circle(e,7,s)},i}var Kee=N(()=>{"use strict";Ht();Ut();$t();It();o(jee,"stateStart")});async function Qee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=(e?.padding||0)/2,l=a.width+e.padding,u=a.height+e.padding,h=-a.width/2-s,f=-a.height/2-s,d=[{x:0,y:0},{x:l,y:0},{x:l,y:-u},{x:0,y:-u},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-u},{x:-8,y:-u},{x:-8,y:0}];if(e.look==="handDrawn"){let p=Ze.svg(i),m=Je(e,{}),g=p.rectangle(h-8,f,l+16,u,m),y=p.line(h,f,h,f+u,m),v=p.line(h+l,f,h+l,f+u,m);i.insert(()=>y,":first-child"),i.insert(()=>v,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",Cn(b)),Qe(e,x)}else{let p=Bs(i,l,u,d);n&&p.attr("style",n),Qe(e,p)}return e.intersect=function(p){return Xe.polygon(e,d,p)},i}var Zee=N(()=>{"use strict";It();Ut();$t();Ht();Jh();tr();o(Qee,"subroutine")});async function Jee(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-s/2,h=-l/2,f=.2*l,d=.2*l,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{}),y=[{x:u-f/2,y:h},{x:u+s+f/2,y:h},{x:u+s+f/2,y:h+l},{x:u-f/2,y:h+l}],v=[{x:u+s-f/2,y:h+l},{x:u+s+f/2,y:h+l},{x:u+s+f/2,y:h+l-d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Vt(y),b=m.path(x,g),T=Vt(v),S=m.path(T,{...g,fillStyle:"solid"}),w=i.insert(()=>S,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,y,k)},i}var ete=N(()=>{"use strict";It();$t();Ht();Ut();o(Jee,"taggedRect")});async function tte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=.2*l,d=.2*u,p=u+h,{cssStyles:m}=e,g=Ze.svg(i),y=Je(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=[{x:-l/2-l/2*.1,y:p/2},...Go(-l/2-l/2*.1,p/2,l/2+l/2*.1,p/2,h,.8),{x:l/2+l/2*.1,y:-p/2},{x:-l/2-l/2*.1,y:-p/2}],x=-l/2+l/2*.1,b=-p/2-d*.4,T=[{x:x+l-f,y:(b+u)*1.4},{x:x+l,y:b+u-d},{x:x+l,y:(b+u)*.9},...Go(x+l,(b+u)*1.3,x+l-f,(b+u)*1.5,-u*.03,.5)],S=Vt(v),w=g.path(S,y),k=Vt(T),A=g.path(k,{...y,fillStyle:"solid"}),C=i.insert(()=>A,":first-child");return C.insert(()=>w,":first-child"),C.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),Qe(e,C),e.intersect=function(R){return Xe.polygon(e,v,R)},i}var rte=N(()=>{"use strict";It();Ut();Ht();$t();o(tte,"taggedWaveEdgedRectangle")});async function nte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=Math.max(a.width+e.padding,e?.width||0),l=Math.max(a.height+e.padding,e?.height||0),u=-s/2,h=-l/2,f=i.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",u).attr("y",h).attr("width",s).attr("height",l),Qe(e,f),e.intersect=function(d){return Xe.rect(e,d)},i}var ite=N(()=>{"use strict";It();Ut();$t();o(nte,"text")});async function ate(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:l}=await ut(t,e,st(e)),u=e.look==="neo"?l*2:l,h=a.height+u,f=h/2,d=f/(2.5+h/50),p=a.width+d+u,{cssStyles:m}=e,g;if(e.look==="handDrawn"){let y=Ze.svg(i),v=TRe(0,0,p,h,d,f),x=wRe(0,0,p,h,d,f),b=y.path(v,Je(e,{})),T=y.path(x,Je(e,{fill:"none"}));g=i.insert(()=>T,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),m&&g.attr("style",m)}else{let y=bRe(0,0,p,h,d,f);g=i.insert("path",":first-child").attr("d",y).attr("class","basic label-container").attr("style",Cn(m)).attr("style",n),g.attr("class","basic label-container"),m&&g.selectAll("path").attr("style",m),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",d),g.attr("transform",`translate(${-p/2}, ${h/2} )`),s.attr("transform",`translate(${-(a.width/2)-d-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Qe(e,g),e.intersect=function(y){let v=Xe.rect(e,y),x=v.y-(e.y??0);if(f!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(v.x-(e.x??0))>(e.width??0)/2-d)){let b=d*d*(1-x*x/(f*f));b!=0&&(b=Math.sqrt(Math.abs(b))),b=d-b,y.x-(e.x??0)>0&&(b=-b),v.x+=b}return v},i}var bRe,TRe,wRe,ste=N(()=>{"use strict";It();$t();Ht();Ut();tr();bRe=o((t,e,r,n,i,a)=>`M${t},${e} + a${i},${a} 0,0,1 0,${-n} + l${r},0 + a${i},${a} 0,0,1 0,${n} + M${r},${-n} + a${i},${a} 0,0,0 0,${n} + l${-r},0`,"createCylinderPathD"),TRe=o((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),wRe=o((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");o(ate,"tiltedCylinder")});async function ote(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=a.width+e.padding,l=a.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Ze.svg(i),p=Je(e,{}),m=Vt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Bs(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Qe(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var lte=N(()=>{"use strict";It();Ut();$t();Ht();Jh();o(ote,"trapezoid")});async function cte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=60,l=20,u=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:f}=e,d=Ze.svg(i),p=Je(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let m=[{x:-u/2*.8,y:-h/2},{x:u/2*.8,y:-h/2},{x:u/2,y:-h/2*.6},{x:u/2,y:h/2},{x:-u/2,y:h/2},{x:-u/2,y:-h/2*.6}],g=Vt(m),y=d.path(g,p),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),Qe(e,v),e.intersect=function(x){return Xe.polygon(e,m,x)},i}var ute=N(()=>{"use strict";It();Ut();$t();Ht();o(cte,"trapezoidalPentagon")});async function hte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=vr(ge().flowchart?.htmlLabels),u=a.width+(e.padding??0),h=u+a.height,f=u+a.height,d=[{x:0,y:0},{x:f,y:0},{x:f/2,y:-h}],{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=Vt(d),v=m.path(y,g),x=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${h/2})`);return p&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=u,e.height=h,Qe(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${h/2-(a.height+(e.padding??0)/(l?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return X.info("Triangle intersect",e,d,b),Xe.polygon(e,d,b)},i}var fte=N(()=>{"use strict";pt();It();Ut();$t();Ht();It();gr();Xt();o(hte,"triangle")});async function dte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/8,f=u+h,{cssStyles:d}=e,m=70-l,g=m>0?m/2:0,y=Ze.svg(i),v=Je(e,{});e.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let x=[{x:-l/2-g,y:f/2},...Go(-l/2-g,f/2,l/2+g,f/2,h,.8),{x:l/2+g,y:-f/2},{x:-l/2-g,y:-f/2}],b=Vt(x),T=y.path(b,v),S=i.insert(()=>T,":first-child");return S.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h-(a.y-(a.top??0))})`),Qe(e,S),e.intersect=function(w){return Xe.polygon(e,x,w)},i}var pte=N(()=>{"use strict";It();Ut();Ht();$t();o(dte,"waveEdgedRectangle")});async function mte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await ut(t,e,st(e)),s=100,l=50,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=u/h,d=u,p=h;d>p*f?p=d/f:d=p*f,d=Math.max(d,s),p=Math.max(p,l);let m=Math.min(p*.2,p/4),g=p+m*2,{cssStyles:y}=e,v=Ze.svg(i),x=Je(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-d/2,y:g/2},...Go(-d/2,g/2,d/2,g/2,m,1),{x:d/2,y:-g/2},...Go(d/2,-g/2,-d/2,-g/2,m,-1)],T=Vt(b),S=v.path(T,x),w=i.insert(()=>S,":first-child");return w.attr("class","basic label-container"),y&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",y),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),Qe(e,w),e.intersect=function(k){return Xe.polygon(e,b,k)},i}var gte=N(()=>{"use strict";It();Ut();$t();Ht();o(mte,"waveRectangle")});async function yte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await ut(t,e,st(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Ze.svg(i),g=Je(e,{}),y=[{x:f-h,y:d-h},{x:f-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d-h}],v=`M${f-h},${d-h} L${f+l},${d-h} L${f+l},${d+u} L${f-h},${d+u} L${f-h},${d-h} + M${f-h},${d} L${f+l},${d} + M${f},${d-h} L${f},${d+u}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${h/2}, ${h/2})`),b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+h/2-(a.x-(a.left??0))}, ${-(a.height/2)+h/2-(a.y-(a.top??0))})`),Qe(e,b),e.intersect=function(T){return Xe.polygon(e,y,T)},i}var vte=N(()=>{"use strict";It();$t();Ht();Ut();o(yte,"windowPane")});async function H9(t,e){let r=e;if(r.alias&&(e.label=r.alias),e.look==="handDrawn"){let{themeVariables:U}=Qt(),{background:j}=U,te={...e,id:e.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${j}`]};await H9(t,te)}let n=Qt();e.useHtmlLabels=n.htmlLabels;let i=n.er?.diagramPadding??10,a=n.er?.entityPadding??6,{cssStyles:s}=e,{labelStyles:l,nodeStyles:u}=je(e);if(r.attributes.length===0&&e.label){let U={rx:0,ry:0,labelPaddingX:i,labelPaddingY:i*1.5,classes:""};Zi(e.label,n)+U.labelPaddingX*20){let U=d.width+i*2-(y+v+x+b);y+=U/w,v+=U/w,x>0&&(x+=U/w),b>0&&(b+=U/w)}let A=y+v+x+b,C=Ze.svg(f),R=Je(e,{});e.look!=="handDrawn"&&(R.roughness=0,R.fillStyle="solid");let I=0;g.length>0&&(I=g.reduce((U,j)=>U+(j?.rowHeight??0),0));let L=Math.max(k.width+i*2,e?.width||0,A),E=Math.max((I??0)+d.height,e?.height||0),D=-L/2,_=-E/2;f.selectAll("g:not(:first-child)").each((U,j,te)=>{let Y=qe(te[j]),oe=Y.attr("transform"),J=0,ue=0;if(oe){let ee=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(oe);ee&&(J=parseFloat(ee[1]),ue=parseFloat(ee[2]),Y.attr("class").includes("attribute-name")?J+=y:Y.attr("class").includes("attribute-keys")?J+=y+v:Y.attr("class").includes("attribute-comment")&&(J+=y+v+x))}Y.attr("transform",`translate(${D+i/2+J}, ${ue+_+d.height+a/2})`)}),f.select(".name").attr("transform","translate("+-d.width/2+", "+(_+a/2)+")");let O=C.rectangle(D,_,L,E,R),M=f.insert(()=>O,":first-child").attr("style",s.join("")),{themeVariables:P}=Qt(),{rowEven:B,rowOdd:F,nodeBorder:G}=P;m.push(0);for(let[U,j]of g.entries()){let Y=(U+1)%2===0&&j.yOffset!==0,oe=C.rectangle(D,d.height+_+j?.yOffset,L,j?.rowHeight,{...R,fill:Y?B:F,stroke:G});f.insert(()=>oe,"g.label").attr("style",s.join("")).attr("class",`row-rect-${Y?"even":"odd"}`)}let $=C.line(D,d.height+_,L+D,d.height+_,R);f.insert(()=>$).attr("class","divider"),$=C.line(y+D,d.height+_,y+D,E+_,R),f.insert(()=>$).attr("class","divider"),T&&($=C.line(y+v+D,d.height+_,y+v+D,E+_,R),f.insert(()=>$).attr("class","divider")),S&&($=C.line(y+v+x+D,d.height+_,y+v+x+D,E+_,R),f.insert(()=>$).attr("class","divider"));for(let U of m)$=C.line(D,d.height+_+U,L+D,d.height+_+U,R),f.insert(()=>$).attr("class","divider");if(Qe(e,M),u&&e.look!=="handDrawn"){let j=u.split(";")?.filter(te=>te.includes("stroke"))?.map(te=>`${te}`).join("; ");f.selectAll("path").attr("style",j??""),f.selectAll(".row-rect-even path").attr("style",u)}return e.intersect=function(U){return Xe.rect(e,U)},f}async function I2(t,e,r,n=0,i=0,a=[],s=""){let l=t.insert("g").attr("class",`label ${a.join(" ")}`).attr("transform",`translate(${n}, ${i})`).attr("style",s);e!==rc(e)&&(e=rc(e),e=e.replaceAll("<","<").replaceAll(">",">"));let u=l.node().appendChild(await di(l,e,{width:Zi(e,r)+100,style:s,useHtmlLabels:r.htmlLabels},r));if(e.includes("<")||e.includes(">")){let f=u.children[0];for(f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">");f.childNodes[0];)f=f.childNodes[0],f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">")}let h=u.getBBox();if(vr(r.htmlLabels)){let f=u.children[0];f.style.textAlign="start";let d=qe(u);h=f.getBoundingClientRect(),d.attr("width",h.width),d.attr("height",h.height)}return h}var xte=N(()=>{"use strict";It();Ut();$t();Ht();M2();qn();zo();gr();yr();tr();o(H9,"erBox");o(I2,"addText")});async function bte(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",st(e)).attr("id",e.domId||e.id),l=null,u=null,h=null,f=null,d=0,p=0,m=0;if(l=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await ow(l,{text:`\xAB${b}\xBB`},0),d=l.node().getBBox().height}u=s.insert("g").attr("class","label-group text"),await ow(u,e,0,["font-weight: bolder"]);let g=u.node().getBBox();p=g.height,h=s.insert("g").attr("class","members-group text");let y=0;for(let b of e.members){let T=await ow(h,b,y,[b.parseClassifier()]);y+=T+a}m=h.node().getBBox().height,m<=0&&(m=i/2),f=s.insert("g").attr("class","methods-group text");let v=0;for(let b of e.methods){let T=await ow(f,b,v,[b.parseClassifier()]);v+=T+a}let x=s.node().getBBox();if(l!==null){let b=l.node().getBBox();l.attr("transform",`translate(${-b.width/2})`)}return u.attr("transform",`translate(${-g.width/2}, ${d})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${d+p+i*2})`),x=s.node().getBBox(),f.attr("transform",`translate(0, ${d+p+(m?m+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function ow(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=Qt(),s="useHtmlLabels"in e?e.useHtmlLabels:vr(a.htmlLabels)??!0,l="";"text"in e?l=e.text:l=e.label,!s&&l.startsWith("\\")&&(l=l.substring(1)),kn(l)&&(s=!0);let u=await di(i,iv(Ji(l)),{width:Zi(l,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),h,f=1;if(s){let d=u.children[0],p=qe(u);f=d.innerHTML.split("
      ").length,d.innerHTML.includes("")&&(f+=d.innerHTML.split("").length-1);let m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,S=parseInt(b,10)*5+"px";y.style.minWidth=S,y.style.maxWidth=S}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}else{n.includes("font-weight: bolder")&&qe(u).selectAll("tspan").attr("font-weight",""),f=u.children.length;let d=u.children[0];(u.textContent===""||u.textContent.includes(">"))&&(d.textContent=l[0]+l.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),l[1]===" "&&(d.textContent=d.textContent[0]+" "+d.textContent.substring(1))),d.textContent==="undefined"&&(d.textContent=""),h=u.getBBox()}return i.attr("transform","translate(0,"+(-h.height/(2*f)+r)+")"),h.height}var Tte=N(()=>{"use strict";yr();qn();It();tr();Xt();zo();gr();o(bte,"textHelper");o(ow,"addText")});async function wte(t,e){let r=ge(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??vr(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:l,bbox:u}=await bte(t,e,r,a,i),{labelStyles:h,nodeStyles:f}=je(e);e.labelStyle=h,e.cssStyles=s.styles||"";let d=s.styles?.join(";")||f||"";e.cssStyles||(e.cssStyles=d.replaceAll("!important","").split(";"));let p=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,m=Ze.svg(l),g=Je(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=u.width,v=u.height;s.members.length===0&&s.methods.length===0?v+=i:s.members.length>0&&s.methods.length===0&&(v+=i*2);let x=-y/2,b=-v/2,T=m.rectangle(x-n,b-n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0),y+2*n,v+2*n+(p?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),S=l.insert(()=>T,":first-child");S.attr("class","basic label-container");let w=S.node().getBBox();l.selectAll(".text").each((R,I,L)=>{let E=qe(L[I]),D=E.attr("transform"),_=0;if(D){let B=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(D);B&&(_=parseFloat(B[2]))}let O=_+b+n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(O-=4);let M=x;(E.attr("class").includes("label-group")||E.attr("class").includes("annotation-group"))&&(M=-E.node()?.getBBox().width/2||0,l.selectAll("text").each(function(P,B,F){window.getComputedStyle(F[B]).textAnchor==="middle"&&(M=0)})),E.attr("transform",`translate(${M}, ${O})`)});let k=l.select(".annotation-group").node().getBBox().height-(p?n/2:0)||0,A=l.select(".label-group").node().getBBox().height-(p?n/2:0)||0,C=l.select(".members-group").node().getBBox().height-(p?n/2:0)||0;if(s.members.length>0||s.methods.length>0||p){let R=m.line(w.x,k+A+b+n,w.x+w.width,k+A+b+n,g);l.insert(()=>R).attr("class","divider").attr("style",d)}if(p||s.members.length>0||s.methods.length>0){let R=m.line(w.x,k+A+C+b+i*2+n,w.x+w.width,k+A+C+b+n+i*2,g);l.insert(()=>R).attr("class","divider").attr("style",d)}if(s.look!=="handDrawn"&&l.selectAll("path").attr("style",d),S.select(":nth-child(2)").attr("style",d),l.selectAll(".divider").select("path").attr("style",d),e.labelStyle?l.selectAll("span").attr("style",e.labelStyle):l.selectAll("span").attr("style",d),!a){let R=RegExp(/color\s*:\s*([^;]*)/),I=R.exec(d);if(I){let L=I[0].replace("color","fill");l.selectAll("tspan").attr("style",L)}else if(h){let L=R.exec(h);if(L){let E=L[0].replace("color","fill");l.selectAll("tspan").attr("style",E)}}}return Qe(e,S),e.intersect=function(R){return Xe.rect(e,R)},l}var kte=N(()=>{"use strict";It();Xt();yr();Ht();$t();Ut();Tte();gr();o(wte,"classBox")});async function Ete(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let i=e,a=e,s=20,l=20,u="verifyMethod"in e,h=st(e),f=t.insert("g").attr("class",h).attr("id",e.domId??e.id),d;u?d=await Ou(f,`<<${i.type}>>`,0,e.labelStyle):d=await Ou(f,"<<Element>>",0,e.labelStyle);let p=d,m=await Ou(f,i.name,p,e.labelStyle+"; font-weight: bold;");if(p+=m+l,u){let k=await Ou(f,`${i.requirementId?`ID: ${i.requirementId}`:""}`,p,e.labelStyle);p+=k;let A=await Ou(f,`${i.text?`Text: ${i.text}`:""}`,p,e.labelStyle);p+=A;let C=await Ou(f,`${i.risk?`Risk: ${i.risk}`:""}`,p,e.labelStyle);p+=C,await Ou(f,`${i.verifyMethod?`Verification: ${i.verifyMethod}`:""}`,p,e.labelStyle)}else{let k=await Ou(f,`${a.type?`Type: ${a.type}`:""}`,p,e.labelStyle);p+=k,await Ou(f,`${a.docRef?`Doc Ref: ${a.docRef}`:""}`,p,e.labelStyle)}let g=(f.node()?.getBBox().width??200)+s,y=(f.node()?.getBBox().height??200)+s,v=-g/2,x=-y/2,b=Ze.svg(f),T=Je(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=b.rectangle(v,x,g,y,T),w=f.insert(()=>S,":first-child");if(w.attr("class","basic label-container").attr("style",n),f.selectAll(".label").each((k,A,C)=>{let R=qe(C[A]),I=R.attr("transform"),L=0,E=0;if(I){let M=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);M&&(L=parseFloat(M[1]),E=parseFloat(M[2]))}let D=E-y/2,_=v+s/2;(A===0||A===1)&&(_=L),R.attr("transform",`translate(${_}, ${D+s})`)}),p>d+m+l){let k=b.line(v,x+d+m+l,v+g,x+d+m+l,T);f.insert(()=>k).attr("style",n)}return Qe(e,w),e.intersect=function(k){return Xe.rect(e,k)},f}async function Ou(t,e,r,n=""){if(e==="")return 0;let i=t.insert("g").attr("class","label").attr("style",n),a=ge(),s=a.htmlLabels??!0,l=await di(i,iv(Ji(e)),{width:Zi(e,a)+50,classes:"markdown-node-label",useHtmlLabels:s,style:n},a),u;if(s){let h=l.children[0],f=qe(l);u=h.getBoundingClientRect(),f.attr("width",u.width),f.attr("height",u.height)}else{let h=l.children[0];for(let f of h.children)f.textContent=f.textContent.replaceAll(">",">").replaceAll("<","<"),n&&f.setAttribute("style",n);u=l.getBBox(),u.height+=6}return i.attr("transform",`translate(${-u.width/2},${-u.height/2+r})`),u.height}var Ste=N(()=>{"use strict";It();Ut();$t();Ht();tr();Xt();zo();yr();o(Ete,"requirementBox");o(Ou,"addText")});async function Cte(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=je(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:l,bbox:u,label:h}=await ut(t,e,st(e)),f=e.padding||10,d="",p;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(d=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),p=l.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",d).attr("target","_blank"));let m={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,y;p?{label:g,bbox:y}=await YT(p,"ticket"in e&&e.ticket||"",m):{label:g,bbox:y}=await YT(l,"ticket"in e&&e.ticket||"",m);let{label:v,bbox:x}=await YT(l,"assigned"in e&&e.assigned||"",m);e.width=s;let b=10,T=e?.width||0,S=Math.max(y.height,x.height)/2,w=Math.max(u.height+b*2,e?.height||0)+S,k=-T/2,A=-w/2;h.attr("transform","translate("+(f-T/2)+", "+(-S-u.height/2)+")"),g.attr("transform","translate("+(f-T/2)+", "+(-S+u.height/2)+")"),v.attr("transform","translate("+(f+T/2-x.width-2*a)+", "+(-S+u.height/2)+")");let C,{rx:R,ry:I}=e,{cssStyles:L}=e;if(e.look==="handDrawn"){let E=Ze.svg(l),D=Je(e,{}),_=R||I?E.path(Fs(k,A,T,w,R||0),D):E.rectangle(k,A,T,w,D);C=l.insert(()=>_,":first-child"),C.attr("class","basic label-container").attr("style",L||null)}else{C=l.insert("rect",":first-child"),C.attr("class","basic label-container __APA__").attr("style",i).attr("rx",R??5).attr("ry",I??5).attr("x",k).attr("y",A).attr("width",T).attr("height",w);let E="priority"in e&&e.priority;if(E){let D=l.append("line"),_=k+2,O=A+Math.floor((R??0)/2),M=A+w-Math.floor((R??0)/2);D.attr("x1",_).attr("y1",O).attr("x2",_).attr("y2",M).attr("stroke-width","4").attr("stroke",kRe(E))}}return Qe(e,C),e.height=w,e.intersect=function(E){return Xe.rect(e,E)},l}var kRe,Ate=N(()=>{"use strict";It();Ut();Zd();$t();Ht();kRe=o(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");o(Cte,"kanbanItem")});async function _te(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await ut(t,e,st(e)),u=a.width+10*s,h=a.height+8*s,f=.15*u,{cssStyles:d}=e,p=a.width+20,m=a.height+20,g=Math.max(u,p),y=Math.max(h,m);l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`);let v,x=`M0 0 + a${f},${f} 1 0,0 ${g*.25},${-1*y*.1} + a${f},${f} 1 0,0 ${g*.25},0 + a${f},${f} 1 0,0 ${g*.25},0 + a${f},${f} 1 0,0 ${g*.25},${y*.1} + + a${f},${f} 1 0,0 ${g*.15},${y*.33} + a${f*.8},${f*.8} 1 0,0 0,${y*.34} + a${f},${f} 1 0,0 ${-1*g*.15},${y*.33} + + a${f},${f} 1 0,0 ${-1*g*.25},${y*.15} + a${f},${f} 1 0,0 ${-1*g*.25},0 + a${f},${f} 1 0,0 ${-1*g*.25},0 + a${f},${f} 1 0,0 ${-1*g*.25},${-1*y*.15} + + a${f},${f} 1 0,0 ${-1*g*.1},${-1*y*.33} + a${f*.8},${f*.8} 1 0,0 0,${-1*y*.34} + a${f},${f} 1 0,0 ${g*.1},${-1*y*.33} + H0 V0 Z`;if(e.look==="handDrawn"){let b=Ze.svg(i),T=Je(e,{}),S=b.path(x,T);v=i.insert(()=>S,":first-child"),v.attr("class","basic label-container").attr("style",Cn(d))}else v=i.insert("path",":first-child").attr("class","basic label-container").attr("style",n).attr("d",x);return v.attr("transform",`translate(${-g/2}, ${-y/2})`),Qe(e,v),e.calcIntersect=function(b,T){return Xe.rect(b,T)},e.intersect=function(b){return X.info("Bang intersect",e,b),Xe.rect(e,b)},i}var Dte=N(()=>{"use strict";pt();It();Ut();$t();Ht();tr();o(_te,"bang")});async function Lte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await ut(t,e,st(e)),u=a.width+2*s,h=a.height+2*s,f=.15*u,d=.25*u,p=.35*u,m=.2*u,{cssStyles:g}=e,y,v=`M0 0 + a${f},${f} 0 0,1 ${u*.25},${-1*u*.1} + a${p},${p} 1 0,1 ${u*.4},${-1*u*.1} + a${d},${d} 1 0,1 ${u*.35},${u*.2} + + a${f},${f} 1 0,1 ${u*.15},${h*.35} + a${m},${m} 1 0,1 ${-1*u*.15},${h*.65} + + a${d},${f} 1 0,1 ${-1*u*.25},${u*.15} + a${p},${p} 1 0,1 ${-1*u*.5},0 + a${f},${f} 1 0,1 ${-1*u*.25},${-1*u*.15} + + a${f},${f} 1 0,1 ${-1*u*.1},${-1*h*.35} + a${m},${m} 1 0,1 ${u*.1},${-1*h*.65} + H0 V0 Z`;if(e.look==="handDrawn"){let x=Ze.svg(i),b=Je(e,{}),T=x.path(v,b);y=i.insert(()=>T,":first-child"),y.attr("class","basic label-container").attr("style",Cn(g))}else y=i.insert("path",":first-child").attr("class","basic label-container").attr("style",n).attr("d",v);return l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`),y.attr("transform",`translate(${-u/2}, ${-h/2})`),Qe(e,y),e.calcIntersect=function(x,b){return Xe.rect(x,b)},e.intersect=function(x){return X.info("Cloud intersect",e,x),Xe.rect(e,x)},i}var Rte=N(()=>{"use strict";Ht();pt();tr();Ut();$t();It();o(Lte,"cloud")});async function Nte(t,e){let{labelStyles:r,nodeStyles:n}=je(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s,label:l}=await ut(t,e,st(e)),u=a.width+8*s,h=a.height+2*s,f=5,d=` + M${-u/2} ${h/2-f} + v${-h+2*f} + q0,-${f} ${f},-${f} + h${u-2*f} + q${f},0 ${f},${f} + v${h-2*f} + q0,${f} -${f},${f} + h${-u+2*f} + q-${f},0 -${f},-${f} + Z + `,p=i.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("style",n).attr("d",d);return i.append("line").attr("class","node-line-").attr("x1",-u/2).attr("y1",h/2).attr("x2",u/2).attr("y2",h/2),l.attr("transform",`translate(${-a.width/2}, ${-a.height/2})`),i.append(()=>l.node()),Qe(e,p),e.calcIntersect=function(m,g){return Xe.rect(m,g)},e.intersect=function(m){return Xe.rect(e,m)},i}var Mte=N(()=>{"use strict";Ut();$t();It();o(Nte,"defaultMindmapNode")});async function Ite(t,e){let r={padding:e.padding??0};return iw(t,e,r)}var Ote=N(()=>{"use strict";U9();o(Ite,"mindmapCircle")});function Pte(t){return t in q9}var ERe,SRe,q9,W9=N(()=>{"use strict";yJ();bJ();wJ();EJ();U9();CJ();_J();LJ();NJ();IJ();PJ();FJ();zJ();VJ();HJ();WJ();XJ();KJ();ZJ();eee();ree();iee();see();lee();uee();fee();pee();gee();vee();bee();wee();Eee();Cee();_ee();Lee();Nee();Iee();Pee();Fee();zee();Vee();Hee();Wee();Xee();Kee();Zee();ete();rte();ite();ste();lte();ute();fte();pte();gte();vte();xte();kte();Ste();Ate();Dte();Rte();Mte();Ote();ERe=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:Gee},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:Oee},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:Uee},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:Qee},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:OJ},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:iw},{semanticName:"Bang",name:"Bang",shortName:"bang",description:"Bang",aliases:["bang"],handler:_te},{semanticName:"Cloud",name:"Cloud",shortName:"cloud",description:"cloud",aliases:["cloud"],handler:Lte},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:Dee},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:jJ},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:mee},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:dee},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:ote},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:cee},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:$J},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:nte},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:TJ},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:Bee},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:jee},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:Yee},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:qJ},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:QJ},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:AJ},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:DJ},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:RJ},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:yee},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:dte},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:YJ},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:ate},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:xee},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:MJ},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:BJ},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:hte},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:yte},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:GJ},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:cte},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:UJ},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:$ee},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:See},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:kee},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:xJ},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:SJ},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:tte},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:Jee},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:mte},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:Ree},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:Tee}],SRe=o(()=>{let e=[...Object.entries({state:qee,choice:kJ,note:Aee,rectWithTitle:Mee,labelRect:hee,iconSquare:aee,iconCircle:tee,icon:JJ,iconRounded:nee,imageSquare:oee,anchor:gJ,kanbanItem:Cte,mindmapCircle:Ite,defaultMindmapNode:Nte,classBox:wte,erBox:H9,requirementBox:Ete}),...ERe.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),q9=SRe();o(Pte,"isValidShape")});var CRe,lw,Bte=N(()=>{"use strict";yr();w2();Xt();pt();W9();tr();gr();ci();CRe="flowchart-",lw=class{constructor(){this.vertexCounter=0;this.config=ge();this.vertices=new Map;this.edges=[];this.classes=new Map;this.subGraphs=[];this.subGraphLookup=new Map;this.tooltips=new Map;this.subCount=0;this.firstGraphFlag=!0;this.secCount=-1;this.posCrossRef=[];this.funs=[];this.setAccTitle=Rr;this.setAccDescription=Ir;this.setDiagramTitle=$r;this.getAccTitle=Mr;this.getAccDescription=Or;this.getDiagramTitle=Pr;this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{o(this,"FlowDB")}sanitizeText(e){return tt.sanitizeText(e,this.config)}lookUpDomId(e){for(let r of this.vertices.values())if(r.id===e)return r.domId;return e}addVertex(e,r,n,i,a,s,l={},u){if(!e||e.trim().length===0)return;let h;if(u!==void 0){let m;u.includes(` +`)?m=u+` +`:m=`{ +`+u+` +}`,h=Kh(m,{schema:jh})}let f=this.edges.find(m=>m.id===e);if(f){let m=h;m?.animate!==void 0&&(f.animate=m.animate),m?.animation!==void 0&&(f.animation=m.animation),m?.curve!==void 0&&(f.interpolate=m.curve);return}let d,p=this.vertices.get(e);if(p===void 0&&(p={id:e,labelType:"text",domId:CRe+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,p)),this.vertexCounter++,r!==void 0?(this.config=ge(),d=this.sanitizeText(r.text.trim()),p.labelType=r.type,d.startsWith('"')&&d.endsWith('"')&&(d=d.substring(1,d.length-1)),p.text=d):p.text===void 0&&(p.text=e),n!==void 0&&(p.type=n),i?.forEach(m=>{p.styles.push(m)}),a?.forEach(m=>{p.classes.push(m)}),s!==void 0&&(p.dir=s),p.props===void 0?p.props=l:l!==void 0&&Object.assign(p.props,l),h!==void 0){if(h.shape){if(h.shape!==h.shape.toLowerCase()||h.shape.includes("_"))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);if(!Pte(h.shape))throw new Error(`No such shape: ${h.shape}.`);p.type=h?.shape}h?.label&&(p.text=h?.label),h?.icon&&(p.icon=h?.icon,!h.label?.trim()&&p.text===e&&(p.text="")),h?.form&&(p.form=h?.form),h?.pos&&(p.pos=h?.pos),h?.img&&(p.img=h?.img,!h.label?.trim()&&p.text===e&&(p.text="")),h?.constraint&&(p.constraint=h.constraint),h.w&&(p.assetWidth=Number(h.w)),h.h&&(p.assetHeight=Number(h.h))}}addSingleLink(e,r,n,i){let l={start:e,end:r,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};X.info("abc78 Got edge...",l);let u=n.text;if(u!==void 0&&(l.text=this.sanitizeText(u.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=u.type),n!==void 0&&(l.type=n.type,l.stroke=n.stroke,l.length=n.length>10?10:n.length),i&&!this.edges.some(h=>h.id===i))l.id=i,l.isUserDefinedId=!0;else{let h=this.edges.filter(f=>f.start===l.start&&f.end===l.end);h.length===0?l.id=xc(l.start,l.end,{counter:0,prefix:"L"}):l.id=xc(l.start,l.end,{counter:h.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))X.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. + +Initialize mermaid with maxEdges set to a higher number to allow more edges. +You cannot set this config via configuration inside the diagram as it is a secure config. +You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,r,n){let i=this.isLinkData(n)?n.id.replace("@",""):void 0;X.info("addLink",e,r,i);for(let a of e)for(let s of r){let l=a===e[e.length-1],u=s===r[0];l&&u?this.addSingleLink(a,s,n,i):this.addSingleLink(a,s,n,void 0)}}updateLinkInterpolate(e,r){e.forEach(n=>{n==="default"?this.edges.defaultInterpolate=r:this.edges[n].interpolate=r})}updateLink(e,r){e.forEach(n=>{if(typeof n=="number"&&n>=this.edges.length)throw new Error(`The index ${n} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);n==="default"?this.edges.defaultStyle=r:(this.edges[n].style=r,(this.edges[n]?.style?.length??0)>0&&!this.edges[n]?.style?.some(i=>i?.startsWith("fill"))&&this.edges[n]?.style?.push("fill:none"))})}addClass(e,r){let n=r.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(i=>{let a=this.classes.get(i);a===void 0&&(a={id:i,styles:[],textStyles:[]},this.classes.set(i,a)),n?.forEach(s=>{if(/color/.exec(s)){let l=s.replace("fill","bgFill");a.textStyles.push(l)}a.styles.push(s)})})}setDirection(e){this.direction=e.trim(),/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,r){for(let n of e.split(",")){let i=this.vertices.get(n);i&&i.classes.push(r);let a=this.edges.find(l=>l.id===n);a&&a.classes.push(r);let s=this.subGraphLookup.get(n);s&&s.classes.push(r)}}setTooltip(e,r){if(r!==void 0){r=this.sanitizeText(r);for(let n of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(n):n,r)}}setClickFun(e,r,n){let i=this.lookUpDomId(e);if(ge().securityLevel!=="loose"||r===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${i}"]`);l!==null&&l.addEventListener("click",()=>{qt.runFunc(r,...a)},!1)}))}setLink(e,r,n){e.split(",").forEach(i=>{let a=this.vertices.get(i);a!==void 0&&(a.link=qt.formatUrl(r,this.config),a.linkTarget=n)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFun(i,r,n)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(r=>{r(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let r=qe(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=qe("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),qe(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=qe(a.currentTarget);if(s.attr("title")===null)return;let u=a.currentTarget?.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.bottom+"px"),r.html(r.html().replace(/<br\/>/g,"
      ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),qe(a.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=ge(),Sr()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,r,n){let i=e.text.trim(),a=n.text;e===n&&/\s/.exec(n.text)&&(i=void 0);let l=o(p=>{let m={boolean:{},number:{},string:{}},g=[],y;return{nodeList:p.filter(function(x){let b=typeof x;return x.stmt&&x.stmt==="dir"?(y=x.value,!1):x.trim()===""?!1:b in m?m[b].hasOwnProperty(x)?!1:m[b][x]=!0:g.includes(x)?!1:g.push(x)}),dir:y}},"uniq")(r.flat()),u=l.nodeList,h=l.dir,f=ge().flowchart??{};if(h=h??(f.inheritDir?this.getDirection()??ge().direction??void 0:void 0),this.version==="gen-1")for(let p=0;p2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=r,this.subGraphs[r].id===e)return{result:!0,count:0};let i=0,a=1;for(;i=0){let l=this.indexNodes2(e,s);if(l.result)return{result:!0,count:a+l.count};a=a+l.count}i=i+1}return{result:!1,count:a}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let r=e.trim(),n="arrow_open";switch(r[0]){case"<":n="arrow_point",r=r.slice(1);break;case"x":n="arrow_cross",r=r.slice(1);break;case"o":n="arrow_circle",r=r.slice(1);break}let i="normal";return r.includes("=")&&(i="thick"),r.includes(".")&&(i="dotted"),{type:n,stroke:i}}countChar(e,r){let n=r.length,i=0;for(let a=0;a":i="arrow_point",r.startsWith("<")&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle",r.startsWith("o")&&(i="double_"+i,n=n.slice(1));break}let a="normal",s=n.length-1;n.startsWith("=")&&(a="thick"),n.startsWith("~")&&(a="invisible");let l=this.countChar(".",n);return l&&(a="dotted",s=l),{type:i,stroke:a,length:s}}destructLink(e,r){let n=this.destructEndLink(e),i;if(r){if(i=this.destructStartLink(r),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if(i.type==="arrow_open")i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return i.type==="double_arrow"&&(i.type="double_arrow_point"),i.length=n.length,i}return n}exists(e,r){for(let n of e)if(n.nodes.includes(r))return!0;return!1}makeUniq(e,r){let n=[];return e.nodes.forEach((i,a)=>{this.exists(r,i)||n.push(e.nodes[a])}),{nodes:n}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,r){return e.find(n=>n.id===r)}destructEdgeType(e){let r="none",n="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":n=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":r=e.replace("double_",""),n=r;break}return{arrowTypeStart:r,arrowTypeEnd:n}}addNodeFromVertex(e,r,n,i,a,s){let l=n.get(e.id),u=i.get(e.id)??!1,h=this.findNode(r,e.id);if(h)h.cssStyles=e.styles,h.cssCompiledStyles=this.getCompiledStyles(e.classes),h.cssClasses=e.classes.join(" ");else{let f={id:e.id,label:e.text,labelStyle:"",parentId:l,padding:a.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:s,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};u?r.push({...f,isGroup:!0,shape:"rect"}):r.push({...f,isGroup:!1,shape:this.getTypeFromVertex(e)})}}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}getData(){let e=ge(),r=[],n=[],i=this.getSubGraphs(),a=new Map,s=new Map;for(let h=i.length-1;h>=0;h--){let f=i[h];f.nodes.length>0&&s.set(f.id,!0);for(let d of f.nodes)a.set(d,f.id)}for(let h=i.length-1;h>=0;h--){let f=i[h];r.push({id:f.id,label:f.title,labelStyle:"",parentId:a.get(f.id),padding:8,cssCompiledStyles:this.getCompiledStyles(f.classes),cssClasses:f.classes.join(" "),shape:"rect",dir:f.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(h=>{this.addNodeFromVertex(h,r,a,s,e,e.look||"classic")});let u=this.getEdges();return u.forEach((h,f)=>{let{arrowTypeStart:d,arrowTypeEnd:p}=this.destructEdgeType(h.type),m=[...u.defaultStyle??[]];h.style&&m.push(...h.style);let g={id:xc(h.start,h.end,{counter:f,prefix:"L"},h.id),isUserDefinedId:h.isUserDefinedId,start:h.start,end:h.end,type:h.type??"normal",label:h.text,labelpos:"c",thickness:h.stroke,minlen:h.length,classes:h?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":d,arrowTypeEnd:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":p,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(h.classes),labelStyle:m,style:m,pattern:h.stroke,look:e.look,animate:h.animate,animation:h.animation,curve:h.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};n.push(g)}),{nodes:r,edges:n,other:{},config:e}}defaultConfig(){return G3.flowchart}}});var Vo,ep=N(()=>{"use strict";yr();Vo=o((t,e)=>{let r;return e==="sandbox"&&(r=qe("#i"+t)),(e==="sandbox"?qe(r.nodes()[0].contentDocument.body):qe("body")).select(`[id="${t}"]`)},"getDiagramElement")});var Pu,O2=N(()=>{"use strict";Pu=o(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var Fte,ARe,_Re,DRe,LRe,RRe,NRe,$te,Sm,zte,cw=N(()=>{"use strict";Xt();gr();pt();O2();yr();Ht();zo();S9();aw();Zd();$t();Fte=o(async(t,e)=>{X.info("Creating subgraph rect for ",e.id,e);let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=je(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=vr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await di(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0}),y=g.getBBox();if(vr(r.flowchart.htmlLabels)){let A=g.children[0],C=qe(g);y=A.getBoundingClientRect(),C.attr("width",y.width),C.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;X.trace("Data ",e,JSON.stringify(e));let S;if(e.look==="handDrawn"){let A=Ze.svg(d),C=Je(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),R=A.path(Fs(b,T,v,x,0),C);S=d.insert(()=>(X.debug("Rough node insert CXC",R),R),":first-child"),S.select("path:nth-child(2)").attr("style",h.join(";")),S.select("path").attr("style",f.join(";").replace("fill","stroke"))}else S=d.insert("rect",":first-child"),S.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Pu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let A=m.select("span");A&&A.attr("style",l)}let k=S.node().getBBox();return e.offsetX=0,e.width=k.width,e.height=k.height,e.offsetY=y.height-e.padding/2,e.intersect=function(A){return Qh(e,A)},{cluster:d,labelBBox:y}},"rect"),ARe=o((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(l){return Qh(e,l)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),_Re=o(async(t,e)=>{let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:l,nodeBorder:u}=n,h=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),f=h.insert("g",":first-child"),d=h.insert("g").attr("class","cluster-label"),p=h.append("rect"),m=d.node().appendChild(await kc(e.label,e.labelStyle,void 0,!0)),g=m.getBBox();if(vr(r.flowchart.htmlLabels)){let R=m.children[0],I=qe(m);g=R.getBoundingClientRect(),I.attr("width",g.width),I.attr("height",g.height)}let y=0*e.padding,v=y/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+y;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+y,T=e.height+y-g.height-6,S=e.x-x/2,w=e.y-b/2;e.width=x;let k=e.y-e.height/2-v+g.height+2,A;if(e.look==="handDrawn"){let R=e.cssClasses.includes("statediagram-cluster-alt"),I=Ze.svg(h),L=e.rx||e.ry?I.path(Fs(S,w,x,b,10),{roughness:.7,fill:l,fillStyle:"solid",stroke:u,seed:i}):I.rectangle(S,w,x,b,{seed:i});A=h.insert(()=>L,":first-child");let E=I.rectangle(S,k,x,T,{fill:R?a:s,fillStyle:R?"hachure":"solid",stroke:u,seed:i});A=h.insert(()=>L,":first-child"),p=h.insert(()=>E)}else A=f.insert("rect",":first-child"),A.attr("class","outer").attr("x",S).attr("y",w).attr("width",x).attr("height",b).attr("data-look",e.look),p.attr("class","inner").attr("x",S).attr("y",k).attr("width",x).attr("height",T);d.attr("transform",`translate(${e.x-g.width/2}, ${w+1-(vr(r.flowchart.htmlLabels)?0:3)})`);let C=A.node().getBBox();return e.height=C.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(R){return Qh(e,R)},{cluster:h,labelBBox:g}},"roundedWithTitle"),DRe=o(async(t,e)=>{X.info("Creating subgraph rect for ",e.id,e);let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=je(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=vr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await di(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}),y=g.getBBox();if(vr(r.flowchart.htmlLabels)){let A=g.children[0],C=qe(g);y=A.getBoundingClientRect(),C.attr("width",y.width),C.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;X.trace("Data ",e,JSON.stringify(e));let S;if(e.look==="handDrawn"){let A=Ze.svg(d),C=Je(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),R=A.path(Fs(b,T,v,x,e.rx),C);S=d.insert(()=>(X.debug("Rough node insert CXC",R),R),":first-child"),S.select("path:nth-child(2)").attr("style",h.join(";")),S.select("path").attr("style",f.join(";").replace("fill","stroke"))}else S=d.insert("rect",":first-child"),S.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Pu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let A=m.select("span");A&&A.attr("style",l)}let k=S.node().getBBox();return e.offsetX=0,e.width=k.width,e.height=k.height,e.offsetY=y.height-e.padding/2,e.intersect=function(A){return Qh(e,A)},{cluster:d,labelBBox:y}},"kanbanSection"),LRe=o((t,e)=>{let r=ge(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=s.insert("g",":first-child"),u=0*e.padding,h=e.width+u;e.diff=-e.padding;let f=e.height+u,d=e.x-h/2,p=e.y-f/2;e.width=h;let m;if(e.look==="handDrawn"){let v=Ze.svg(s).rectangle(d,p,h,f,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});m=s.insert(()=>v,":first-child")}else m=l.insert("rect",":first-child"),m.attr("class","divider").attr("x",d).attr("y",p).attr("width",h).attr("height",f).attr("data-look",e.look);let g=m.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(y){return Qh(e,y)},{cluster:s,labelBBox:{}}},"divider"),RRe=Fte,NRe={rect:Fte,squareRect:RRe,roundedWithTitle:_Re,noteGroup:ARe,divider:LRe,kanbanSection:DRe},$te=new Map,Sm=o(async(t,e)=>{let r=e.shape||"rect",n=await NRe[r](t,e);return $te.set(e.id,n),n},"insertCluster"),zte=o(()=>{$te=new Map},"clear")});function uw(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=Xn(t),e=Xn(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}var fa,Y9,Xn,hw,X9=N(()=>{"use strict";fa={aggregation:17.25,extension:17.25,composition:17.25,dependency:6,lollipop:13.5,arrow_point:4},Y9={arrow_point:9,arrow_cross:12.5,arrow_circle:12.5};o(uw,"calculateDeltaAndAngle");Xn=o(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),hw=o(t=>({x:o(function(e,r,n){let i=0,a=Xn(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(fa,t.arrowTypeEnd)){let{angle:m,deltaX:g}=uw(n[n.length-1],n[n.length-2]);i=fa[t.arrowTypeEnd]*Math.cos(m)*(g>=0?1:-1)}let s=Math.abs(Xn(e).x-Xn(n[n.length-1]).x),l=Math.abs(Xn(e).y-Xn(n[n.length-1]).y),u=Math.abs(Xn(e).x-Xn(n[0]).x),h=Math.abs(Xn(e).y-Xn(n[0]).y),f=fa[t.arrowTypeStart],d=fa[t.arrowTypeEnd],p=1;if(s0&&l0&&h=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(fa,t.arrowTypeEnd)){let{angle:m,deltaY:g}=uw(n[n.length-1],n[n.length-2]);i=fa[t.arrowTypeEnd]*Math.abs(Math.sin(m))*(g>=0?1:-1)}let s=Math.abs(Xn(e).y-Xn(n[n.length-1]).y),l=Math.abs(Xn(e).x-Xn(n[n.length-1]).x),u=Math.abs(Xn(e).y-Xn(n[0]).y),h=Math.abs(Xn(e).x-Xn(n[0]).x),f=fa[t.arrowTypeStart],d=fa[t.arrowTypeEnd],p=1;if(s0&&l0&&h{"use strict";pt();Vte=o((t,e,r,n,i,a)=>{e.arrowTypeStart&&Gte(t,"start",e.arrowTypeStart,r,n,i,a),e.arrowTypeEnd&&Gte(t,"end",e.arrowTypeEnd,r,n,i,a)},"addEdgeMarkers"),MRe={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},Gte=o((t,e,r,n,i,a,s)=>{let l=MRe[r];if(!l){X.warn(`Unknown arrow type: ${r}`);return}let u=l.type,f=`${i}_${a}-${u}${e==="start"?"Start":"End"}`;if(s&&s.trim()!==""){let d=s.replace(/[^\dA-Za-z]/g,"_"),p=`${f}_${d}`;if(!document.getElementById(p)){let m=document.getElementById(f);if(m){let g=m.cloneNode(!0);g.id=p,g.querySelectorAll("path, circle, line").forEach(v=>{v.setAttribute("stroke",s),l.fill&&v.setAttribute("fill",s)}),m.parentNode?.appendChild(g)}}t.attr(`marker-${e}`,`url(https://github.com/$%7Bn%7D#${p})`)}else t.attr(`marker-${e}`,`url(https://github.com/$%7Bn%7D#${f})`)},"addEdgeMarker")});function dw(t,e){ge().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function PRe(t){let e=[],r=[];for(let n=1;n5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}function $Re(t,e){if(t.length<2)return"";let r="",n=t.length,i=1e-5;for(let a=0;a({...i}));if(t.length>=2&&fa[e.arrowTypeStart]){let i=fa[e.arrowTypeStart],a=t[0],s=t[1],{angle:l}=Wte(a,s),u=i*Math.cos(l),h=i*Math.sin(l);r[0].x=a.x+u,r[0].y=a.y+h}let n=t.length;if(n>=2&&fa[e.arrowTypeEnd]){let i=fa[e.arrowTypeEnd],a=t[n-1],s=t[n-2],{angle:l}=Wte(s,a),u=i*Math.cos(l),h=i*Math.sin(l);r[n-1].x=a.x-u,r[n-1].y=a.y-h}return r}var pw,da,Yte,fw,mw,gw,IRe,ORe,Hte,qte,BRe,FRe,yw,j9=N(()=>{"use strict";Xt();gr();pt();zo();tr();X9();O2();yr();Ht();aw();Ute();$t();pw=new Map,da=new Map,Yte=o(()=>{pw.clear(),da.clear()},"clear"),fw=o(t=>t?t.reduce((r,n)=>r+";"+n,""):"","getLabelStyles"),mw=o(async(t,e)=>{let r=vr(ge().flowchart.htmlLabels),{labelStyles:n}=je(e);e.labelStyle=n;let i=await di(t,e.label,{style:e.labelStyle,useHtmlLabels:r,addSvgBackground:!0,isNode:!1});X.info("abc82",e,e.labelType);let a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label").attr("data-id",e.id);s.node().appendChild(i);let l=i.getBBox();if(r){let h=i.children[0],f=qe(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),pw.set(e.id,a),e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=await kc(e.startLabelLeft,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),da.get(e.id)||da.set(e.id,{}),da.get(e.id).startLeft=f,dw(u,e.startLabelLeft)}if(e.startLabelRight){let h=await kc(e.startLabelRight,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),da.get(e.id)||da.set(e.id,{}),da.get(e.id).startRight=f,dw(u,e.startLabelRight)}if(e.endLabelLeft){let h=await kc(e.endLabelLeft,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),da.get(e.id)||da.set(e.id,{}),da.get(e.id).endLeft=f,dw(u,e.endLabelLeft)}if(e.endLabelRight){let h=await kc(e.endLabelRight,fw(e.labelStyle)),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),da.get(e.id)||da.set(e.id,{}),da.get(e.id).endRight=f,dw(u,e.endLabelRight)}return i},"insertEdgeLabel");o(dw,"setTerminalWidth");gw=o((t,e)=>{X.debug("Moving label abc88 ",t.id,t.label,pw.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=ge(),{subGraphTitleTotalMargin:i}=Pu(n);if(t.label){let a=pw.get(t.id),s=t.x,l=t.y;if(r){let u=qt.calcLabelPosition(r);X.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=da.get(t.id).startLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=da.get(t.id).startRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=da.get(t.id).endLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=da.get(t.id).endRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),IRe=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),ORe=o((t,e,r)=>{X.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{X.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(X.info("abc88 checking point",a,e),!IRe(e,a)&&!i){let s=ORe(e,n,a);X.debug("abc88 inside",a,n,s),X.debug("abc88 intersection",s,e);let l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)?X.warn("abc88 no intersect",s,r):r.push(s),i=!0}else X.warn("abc88 outside",a,n),n=a,i||r.push(a)}),X.debug("returning points",r),r},"cutPathAtIntersect");o(PRe,"extractCornerPoints");qte=o(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),BRe=o(function(t){let{cornerPointPositions:e}=PRe(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){X.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let m=5;s.x===l.x?p={x:h<0?l.x-m+d:l.x+m-d,y:f<0?l.y-d:l.y+d}:p={x:h<0?l.x-d:l.x+d,y:f<0?l.y-m+d:l.y+m-d}}else X.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(p,u)}else r.push(t[n]);return r},"fixCorners"),FRe=o((t,e,r)=>{let n=t-e-r,i=2,a=2,s=i+a,l=Math.floor(n/s),u=Array(l).fill(`${i} ${a}`).join(" ");return`0 ${e} ${u} ${r}`},"generateDashArray"),yw=o(function(t,e,r,n,i,a,s,l=!1){let{handDrawnSeed:u}=ge(),h=e.points,f=!1,d=i;var p=a;let m=[];for(let _ in e.cssCompiledStyles)_2(_)||m.push(e.cssCompiledStyles[_]);X.debug("UIO intersect check",e.points,p.x,d.x),p.intersect&&d.intersect&&!l&&(h=h.slice(1,e.points.length-1),h.unshift(d.intersect(h[0])),X.debug("Last point UIO",e.start,"-->",e.end,h[h.length-1],p,p.intersect(h[h.length-1])),h.push(p.intersect(h[h.length-1])));let g=btoa(JSON.stringify(h));e.toCluster&&(X.info("to cluster abc88",r.get(e.toCluster)),h=Hte(e.points,r.get(e.toCluster).node),f=!0),e.fromCluster&&(X.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(h,null,2)),h=Hte(h.reverse(),r.get(e.fromCluster).node).reverse(),f=!0);let y=h.filter(_=>!Number.isNaN(_.y));y=BRe(y);let v=No;switch(v=Cu,e.curve){case"linear":v=Cu;break;case"basis":v=No;break;case"cardinal":v=Yv;break;case"bumpX":v=Vv;break;case"bumpY":v=Uv;break;case"catmullRom":v=Kv;break;case"monotoneX":v=Qv;break;case"monotoneY":v=Zv;break;case"natural":v=J0;break;case"step":v=em;break;case"stepAfter":v=e2;break;case"stepBefore":v=Jv;break;default:v=No}let{x,y:b}=hw(e),T=Cl().x(x).y(b).curve(v),S;switch(e.thickness){case"normal":S="edge-thickness-normal";break;case"thick":S="edge-thickness-thick";break;case"invisible":S="edge-thickness-invisible";break;default:S="edge-thickness-normal"}switch(e.pattern){case"solid":S+=" edge-pattern-solid";break;case"dotted":S+=" edge-pattern-dotted";break;case"dashed":S+=" edge-pattern-dashed";break;default:S+=" edge-pattern-solid"}let w,k=e.curve==="rounded"?$Re(zRe(y,e),5):T(y),A=Array.isArray(e.style)?e.style:[e.style],C=A.find(_=>_?.startsWith("stroke:")),R=!1;if(e.look==="handDrawn"){let _=Ze.svg(t);Object.assign([],y);let O=_.path(k,{roughness:.3,seed:u});S+=" transition",w=qe(O).select("path").attr("id",e.id).attr("class"," "+S+(e.classes?" "+e.classes:"")).attr("style",A?A.reduce((P,B)=>P+";"+B,""):"");let M=w.attr("d");w.attr("d",M),t.node().appendChild(w.node())}else{let _=m.join(";"),O=A?A.reduce((U,j)=>U+j+";",""):"",M="";e.animate&&(M=" edge-animation-fast"),e.animation&&(M=" edge-animation-"+e.animation);let P=(_?_+";"+O+";":O)+";"+(A?A.reduce((U,j)=>U+";"+j,""):"");w=t.append("path").attr("d",k).attr("id",e.id).attr("class"," "+S+(e.classes?" "+e.classes:"")+(M??"")).attr("style",P),C=P.match(/stroke:([^;]+)/)?.[1],R=e.animate===!0||!!e.animation||_.includes("animation");let B=w.node(),F=typeof B.getTotalLength=="function"?B.getTotalLength():0,G=Y9[e.arrowTypeStart]||0,$=Y9[e.arrowTypeEnd]||0;if(e.look==="neo"&&!R){let j=`stroke-dasharray: ${e.pattern==="dotted"||e.pattern==="dashed"?FRe(F,G,$):`0 ${G} ${F-G-$} ${$}`}; stroke-dashoffset: 0;`;w.attr("style",j+w.attr("style"))}}w.attr("data-edge",!0),w.attr("data-et","edge"),w.attr("data-id",e.id),w.attr("data-points",g),e.showPoints&&y.forEach(_=>{t.append("circle").style("stroke","red").style("fill","red").attr("r",1).attr("cx",_.x).attr("cy",_.y)});let I="";(ge().flowchart.arrowMarkerAbsolute||ge().state.arrowMarkerAbsolute)&&(I=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,I=I.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),X.info("arrowTypeStart",e.arrowTypeStart),X.info("arrowTypeEnd",e.arrowTypeEnd),Vte(w,e,I,s,n,C);let L=Math.floor(h.length/2),E=h[L];qt.isLabelCoordinateInPath(E,w.attr("d"))||(f=!0);let D={};return f&&(D.updatedPath=h),D.originalPath=e.points,D},"insertEdge");o($Re,"generateRoundedPath");o(Wte,"calculateDeltaAndAngle");o(zRe,"applyMarkerOffsetsToPoints")});var GRe,VRe,URe,HRe,qRe,WRe,YRe,XRe,jRe,KRe,QRe,ZRe,JRe,eNe,tNe,rNe,nNe,vw,K9=N(()=>{"use strict";pt();GRe=o((t,e,r,n)=>{e.forEach(i=>{nNe[i](t,r,n)})},"insertMarkers"),VRe=o((t,e,r)=>{X.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),URe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),HRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),qRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),WRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),YRe=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),XRe=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),jRe=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),KRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),QRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneStart").attr("class","marker onlyOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneEnd").attr("class","marker onlyOne "+e).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),ZRe=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneStart").attr("class","marker zeroOrOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+e).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),JRe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreStart").attr("class","marker oneOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreEnd").attr("class","marker oneOrMore "+e).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),eNe=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+e).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),tNe=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 + L20,10 + M20,10 + L0,20`)},"requirement_arrow"),rNe=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),nNe={extension:VRe,composition:URe,aggregation:HRe,dependency:qRe,lollipop:WRe,point:YRe,circle:XRe,cross:jRe,barb:KRe,only_one:QRe,zero_or_one:ZRe,one_or_more:JRe,zero_or_more:eNe,requirement_arrow:tNe,requirement_contains:rNe},vw=GRe});async function Cm(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?q9[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),xw.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var xw,Xte,jte,P2,bw=N(()=>{"use strict";pt();W9();xw=new Map;o(Cm,"insertNode");Xte=o((t,e)=>{xw.set(e.id,t)},"setNodeElem"),jte=o(()=>{xw.clear()},"clear"),P2=o(t=>{let e=xw.get(t.id);X.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});var Kte,Qte=N(()=>{"use strict";qn();gr();pt();cw();j9();K9();bw();It();tr();Kte={common:tt,getConfig:Qt,insertCluster:Sm,insertEdge:yw,insertEdgeLabel:mw,insertMarkers:vw,insertNode:Cm,interpolateToCurve:FL,labelHelper:ut,log:X,positionEdgeLabel:gw}});function aNe(t){return typeof t=="symbol"||ai(t)&&ha(t)==iNe}var iNe,uo,tp=N(()=>{"use strict";_u();Oo();iNe="[object Symbol]";o(aNe,"isSymbol");uo=aNe});function sNe(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{"use strict";o(sNe,"arrayMap");$s=sNe});function ere(t){if(typeof t=="string")return t;if(Bt(t))return $s(t,ere)+"";if(uo(t))return Jte?Jte.call(t):"";var e=t+"";return e=="0"&&1/t==-oNe?"-0":e}var oNe,Zte,Jte,tre,rre=N(()=>{"use strict";$d();rp();Yn();tp();oNe=1/0,Zte=Ki?Ki.prototype:void 0,Jte=Zte?Zte.toString:void 0;o(ere,"baseToString");tre=ere});function cNe(t){for(var e=t.length;e--&&lNe.test(t.charAt(e)););return e}var lNe,nre,ire=N(()=>{"use strict";lNe=/\s/;o(cNe,"trimmedEndIndex");nre=cNe});function hNe(t){return t&&t.slice(0,nre(t)+1).replace(uNe,"")}var uNe,are,sre=N(()=>{"use strict";ire();uNe=/^\s+/;o(hNe,"baseTrim");are=hNe});function gNe(t){if(typeof t=="number")return t;if(uo(t))return ore;if(Sn(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Sn(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=are(t);var r=dNe.test(t);return r||pNe.test(t)?mNe(t.slice(2),r?2:8):fNe.test(t)?ore:+t}var ore,fNe,dNe,pNe,mNe,lre,cre=N(()=>{"use strict";sre();oo();tp();ore=NaN,fNe=/^[-+]0x[0-9a-f]+$/i,dNe=/^0b[01]+$/i,pNe=/^0o[0-7]+$/i,mNe=parseInt;o(gNe,"toNumber");lre=gNe});function vNe(t){if(!t)return t===0?t:0;if(t=lre(t),t===ure||t===-ure){var e=t<0?-1:1;return e*yNe}return t===t?t:0}var ure,yNe,Am,Q9=N(()=>{"use strict";cre();ure=1/0,yNe=17976931348623157e292;o(vNe,"toFinite");Am=vNe});function xNe(t){var e=Am(t),r=e%1;return e===e?r?e-r:e:0}var Ec,_m=N(()=>{"use strict";Q9();o(xNe,"toInteger");Ec=xNe});var bNe,Tw,hre=N(()=>{"use strict";Fh();Mo();bNe=Ls(hi,"WeakMap"),Tw=bNe});function TNe(){}var si,Z9=N(()=>{"use strict";o(TNe,"noop");si=TNe});function wNe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(wNe,"arrayEach");ww=wNe});function kNe(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{"use strict";o(kNe,"baseFindIndex");kw=kNe});function ENe(t){return t!==t}var fre,dre=N(()=>{"use strict";o(ENe,"baseIsNaN");fre=ENe});function SNe(t,e,r){for(var n=r-1,i=t.length;++n{"use strict";o(SNe,"strictIndexOf");pre=SNe});function CNe(t,e,r){return e===e?pre(t,e,r):kw(t,fre,r)}var Dm,Ew=N(()=>{"use strict";eR();dre();mre();o(CNe,"baseIndexOf");Dm=CNe});function ANe(t,e){var r=t==null?0:t.length;return!!r&&Dm(t,e,0)>-1}var Sw,tR=N(()=>{"use strict";Ew();o(ANe,"arrayIncludes");Sw=ANe});var _Ne,gre,yre=N(()=>{"use strict";SL();_Ne=xT(Object.keys,Object),gre=_Ne});function RNe(t){if(!mc(t))return gre(t);var e=[];for(var r in Object(t))LNe.call(t,r)&&r!="constructor"&&e.push(r);return e}var DNe,LNe,Lm,Cw=N(()=>{"use strict";dm();yre();DNe=Object.prototype,LNe=DNe.hasOwnProperty;o(RNe,"baseKeys");Lm=RNe});function NNe(t){return fi(t)?ET(t):Lm(t)}var qr,Sc=N(()=>{"use strict";LL();Cw();Po();o(NNe,"keys");qr=NNe});var MNe,INe,ONe,pa,vre=N(()=>{"use strict";ym();Hd();IL();Po();dm();Sc();MNe=Object.prototype,INe=MNe.hasOwnProperty,ONe=AT(function(t,e){if(mc(e)||fi(e)){$o(e,qr(e),t);return}for(var r in e)INe.call(e,r)&&gc(t,r,e[r])}),pa=ONe});function FNe(t,e){if(Bt(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||uo(t)?!0:BNe.test(t)||!PNe.test(t)||e!=null&&t in Object(e)}var PNe,BNe,Rm,Aw=N(()=>{"use strict";Yn();tp();PNe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,BNe=/^\w*$/;o(FNe,"isKey");Rm=FNe});function zNe(t){var e=am(t,function(n){return r.size===$Ne&&r.clear(),n}),r=e.cache;return e}var $Ne,xre,bre=N(()=>{"use strict";vL();$Ne=500;o(zNe,"memoizeCapped");xre=zNe});var GNe,VNe,UNe,Tre,wre=N(()=>{"use strict";bre();GNe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,VNe=/\\(\\)?/g,UNe=xre(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(GNe,function(r,n,i,a){e.push(i?a.replace(VNe,"$1"):n||r)}),e}),Tre=UNe});function HNe(t){return t==null?"":tre(t)}var _w,rR=N(()=>{"use strict";rre();o(HNe,"toString");_w=HNe});function qNe(t,e){return Bt(t)?t:Rm(t,e)?[t]:Tre(_w(t))}var rf,B2=N(()=>{"use strict";Yn();Aw();wre();rR();o(qNe,"castPath");rf=qNe});function YNe(t){if(typeof t=="string"||uo(t))return t;var e=t+"";return e=="0"&&1/t==-WNe?"-0":e}var WNe,Cc,Nm=N(()=>{"use strict";tp();WNe=1/0;o(YNe,"toKey");Cc=YNe});function XNe(t,e){e=rf(e,t);for(var r=0,n=e.length;t!=null&&r{"use strict";B2();Nm();o(XNe,"baseGet");nf=XNe});function jNe(t,e,r){var n=t==null?void 0:nf(t,e);return n===void 0?r:n}var kre,Ere=N(()=>{"use strict";F2();o(jNe,"get");kre=jNe});function KNe(t,e){for(var r=-1,n=e.length,i=t.length;++r{"use strict";o(KNe,"arrayPush");Mm=KNe});function QNe(t){return Bt(t)||_l(t)||!!(Sre&&t&&t[Sre])}var Sre,Cre,Are=N(()=>{"use strict";$d();pm();Yn();Sre=Ki?Ki.isConcatSpreadable:void 0;o(QNe,"isFlattenable");Cre=QNe});function _re(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=Cre),i||(i=[]);++a0&&r(l)?e>1?_re(l,e-1,r,n,i):Mm(i,l):n||(i[i.length]=l)}return i}var Ac,Im=N(()=>{"use strict";Dw();Are();o(_re,"baseFlatten");Ac=_re});function ZNe(t){var e=t==null?0:t.length;return e?Ac(t,1):[]}var Qr,Lw=N(()=>{"use strict";Im();o(ZNe,"flatten");Qr=ZNe});function JNe(t){return CT(ST(t,void 0,Qr),t+"")}var Dre,Lre=N(()=>{"use strict";Lw();RL();ML();o(JNe,"flatRest");Dre=JNe});function eMe(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{"use strict";o(eMe,"baseSlice");Rw=eMe});function cMe(t){return lMe.test(t)}var tMe,rMe,nMe,iMe,aMe,sMe,oMe,lMe,Rre,Nre=N(()=>{"use strict";tMe="\\ud800-\\udfff",rMe="\\u0300-\\u036f",nMe="\\ufe20-\\ufe2f",iMe="\\u20d0-\\u20ff",aMe=rMe+nMe+iMe,sMe="\\ufe0e\\ufe0f",oMe="\\u200d",lMe=RegExp("["+oMe+tMe+aMe+sMe+"]");o(cMe,"hasUnicode");Rre=cMe});function uMe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{"use strict";o(uMe,"arrayReduce");Mre=uMe});function hMe(t,e){return t&&$o(e,qr(e),t)}var Ore,Pre=N(()=>{"use strict";Hd();Sc();o(hMe,"baseAssign");Ore=hMe});function fMe(t,e){return t&&$o(e,Rs(e),t)}var Bre,Fre=N(()=>{"use strict";Hd();qh();o(fMe,"baseAssignIn");Bre=fMe});function dMe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{"use strict";o(dMe,"arrayFilter");Om=dMe});function pMe(){return[]}var Mw,iR=N(()=>{"use strict";o(pMe,"stubArray");Mw=pMe});var mMe,gMe,$re,yMe,Pm,Iw=N(()=>{"use strict";Nw();iR();mMe=Object.prototype,gMe=mMe.propertyIsEnumerable,$re=Object.getOwnPropertySymbols,yMe=$re?function(t){return t==null?[]:(t=Object(t),Om($re(t),function(e){return gMe.call(t,e)}))}:Mw,Pm=yMe});function vMe(t,e){return $o(t,Pm(t),e)}var zre,Gre=N(()=>{"use strict";Hd();Iw();o(vMe,"copySymbols");zre=vMe});var xMe,bMe,Ow,aR=N(()=>{"use strict";Dw();bT();Iw();iR();xMe=Object.getOwnPropertySymbols,bMe=xMe?function(t){for(var e=[];t;)Mm(e,Pm(t)),t=fm(t);return e}:Mw,Ow=bMe});function TMe(t,e){return $o(t,Ow(t),e)}var Vre,Ure=N(()=>{"use strict";Hd();aR();o(TMe,"copySymbolsIn");Vre=TMe});function wMe(t,e,r){var n=e(t);return Bt(t)?n:Mm(n,r(t))}var Pw,sR=N(()=>{"use strict";Dw();Yn();o(wMe,"baseGetAllKeys");Pw=wMe});function kMe(t){return Pw(t,qr,Pm)}var $2,oR=N(()=>{"use strict";sR();Iw();Sc();o(kMe,"getAllKeys");$2=kMe});function EMe(t){return Pw(t,Rs,Ow)}var Bw,lR=N(()=>{"use strict";sR();aR();qh();o(EMe,"getAllKeysIn");Bw=EMe});var SMe,Fw,Hre=N(()=>{"use strict";Fh();Mo();SMe=Ls(hi,"DataView"),Fw=SMe});var CMe,$w,qre=N(()=>{"use strict";Fh();Mo();CMe=Ls(hi,"Promise"),$w=CMe});var AMe,af,cR=N(()=>{"use strict";Fh();Mo();AMe=Ls(hi,"Set"),af=AMe});var Wre,_Me,Yre,Xre,jre,Kre,DMe,LMe,RMe,NMe,MMe,np,ho,ip=N(()=>{"use strict";Hre();fT();qre();cR();hre();_u();mL();Wre="[object Map]",_Me="[object Object]",Yre="[object Promise]",Xre="[object Set]",jre="[object WeakMap]",Kre="[object DataView]",DMe=Du(Fw),LMe=Du(Gh),RMe=Du($w),NMe=Du(af),MMe=Du(Tw),np=ha;(Fw&&np(new Fw(new ArrayBuffer(1)))!=Kre||Gh&&np(new Gh)!=Wre||$w&&np($w.resolve())!=Yre||af&&np(new af)!=Xre||Tw&&np(new Tw)!=jre)&&(np=o(function(t){var e=ha(t),r=e==_Me?t.constructor:void 0,n=r?Du(r):"";if(n)switch(n){case DMe:return Kre;case LMe:return Wre;case RMe:return Yre;case NMe:return Xre;case MMe:return jre}return e},"getTag"));ho=np});function PMe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&OMe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var IMe,OMe,Qre,Zre=N(()=>{"use strict";IMe=Object.prototype,OMe=IMe.hasOwnProperty;o(PMe,"initCloneArray");Qre=PMe});function BMe(t,e){var r=e?hm(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var Jre,ene=N(()=>{"use strict";gT();o(BMe,"cloneDataView");Jre=BMe});function $Me(t){var e=new t.constructor(t.source,FMe.exec(t));return e.lastIndex=t.lastIndex,e}var FMe,tne,rne=N(()=>{"use strict";FMe=/\w*$/;o($Me,"cloneRegExp");tne=$Me});function zMe(t){return ine?Object(ine.call(t)):{}}var nne,ine,ane,sne=N(()=>{"use strict";$d();nne=Ki?Ki.prototype:void 0,ine=nne?nne.valueOf:void 0;o(zMe,"cloneSymbol");ane=zMe});function sIe(t,e,r){var n=t.constructor;switch(e){case jMe:return hm(t);case GMe:case VMe:return new n(+t);case KMe:return Jre(t,r);case QMe:case ZMe:case JMe:case eIe:case tIe:case rIe:case nIe:case iIe:case aIe:return yT(t,r);case UMe:return new n;case HMe:case YMe:return new n(t);case qMe:return tne(t);case WMe:return new n;case XMe:return ane(t)}}var GMe,VMe,UMe,HMe,qMe,WMe,YMe,XMe,jMe,KMe,QMe,ZMe,JMe,eIe,tIe,rIe,nIe,iIe,aIe,one,lne=N(()=>{"use strict";gT();ene();rne();sne();kL();GMe="[object Boolean]",VMe="[object Date]",UMe="[object Map]",HMe="[object Number]",qMe="[object RegExp]",WMe="[object Set]",YMe="[object String]",XMe="[object Symbol]",jMe="[object ArrayBuffer]",KMe="[object DataView]",QMe="[object Float32Array]",ZMe="[object Float64Array]",JMe="[object Int8Array]",eIe="[object Int16Array]",tIe="[object Int32Array]",rIe="[object Uint8Array]",nIe="[object Uint8ClampedArray]",iIe="[object Uint16Array]",aIe="[object Uint32Array]";o(sIe,"initCloneByTag");one=sIe});function lIe(t){return ai(t)&&ho(t)==oIe}var oIe,cne,une=N(()=>{"use strict";ip();Oo();oIe="[object Map]";o(lIe,"baseIsMap");cne=lIe});var hne,cIe,fne,dne=N(()=>{"use strict";une();Ud();f2();hne=Fo&&Fo.isMap,cIe=hne?Bo(hne):cne,fne=cIe});function hIe(t){return ai(t)&&ho(t)==uIe}var uIe,pne,mne=N(()=>{"use strict";ip();Oo();uIe="[object Set]";o(hIe,"baseIsSet");pne=hIe});var gne,fIe,yne,vne=N(()=>{"use strict";mne();Ud();f2();gne=Fo&&Fo.isSet,fIe=gne?Bo(gne):pne,yne=fIe});function zw(t,e,r,n,i,a){var s,l=e&dIe,u=e&pIe,h=e&mIe;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!Sn(t))return t;var f=Bt(t);if(f){if(s=Qre(t),!l)return vT(t,s)}else{var d=ho(t),p=d==bne||d==bIe;if(Dl(t))return mT(t,l);if(d==Tne||d==xne||p&&!i){if(s=u||p?{}:TT(t),!l)return u?Vre(t,Bre(s,t)):zre(t,Ore(s,t))}else{if(!Mn[d])return i?t:{};s=one(t,d,l)}}a||(a=new dc);var m=a.get(t);if(m)return m;a.set(t,s),yne(t)?t.forEach(function(v){s.add(zw(v,e,r,v,t,a))}):fne(t)&&t.forEach(function(v,x){s.set(x,zw(v,e,r,x,t,a))});var g=h?u?Bw:$2:u?Rs:qr,y=f?void 0:g(t);return ww(y||t,function(v,x){y&&(x=v,v=t[x]),gc(s,x,zw(v,e,r,x,t,a))}),s}var dIe,pIe,mIe,xne,gIe,yIe,vIe,xIe,bne,bIe,TIe,wIe,Tne,kIe,EIe,SIe,CIe,AIe,_Ie,DIe,LIe,RIe,NIe,MIe,IIe,OIe,PIe,BIe,FIe,Mn,Gw,uR=N(()=>{"use strict";c2();J9();ym();Pre();Fre();TL();EL();Gre();Ure();oR();lR();ip();Zre();lne();CL();Yn();gm();dne();oo();vne();Sc();qh();dIe=1,pIe=2,mIe=4,xne="[object Arguments]",gIe="[object Array]",yIe="[object Boolean]",vIe="[object Date]",xIe="[object Error]",bne="[object Function]",bIe="[object GeneratorFunction]",TIe="[object Map]",wIe="[object Number]",Tne="[object Object]",kIe="[object RegExp]",EIe="[object Set]",SIe="[object String]",CIe="[object Symbol]",AIe="[object WeakMap]",_Ie="[object ArrayBuffer]",DIe="[object DataView]",LIe="[object Float32Array]",RIe="[object Float64Array]",NIe="[object Int8Array]",MIe="[object Int16Array]",IIe="[object Int32Array]",OIe="[object Uint8Array]",PIe="[object Uint8ClampedArray]",BIe="[object Uint16Array]",FIe="[object Uint32Array]",Mn={};Mn[xne]=Mn[gIe]=Mn[_Ie]=Mn[DIe]=Mn[yIe]=Mn[vIe]=Mn[LIe]=Mn[RIe]=Mn[NIe]=Mn[MIe]=Mn[IIe]=Mn[TIe]=Mn[wIe]=Mn[Tne]=Mn[kIe]=Mn[EIe]=Mn[SIe]=Mn[CIe]=Mn[OIe]=Mn[PIe]=Mn[BIe]=Mn[FIe]=!0;Mn[xIe]=Mn[bne]=Mn[AIe]=!1;o(zw,"baseClone");Gw=zw});function zIe(t){return Gw(t,$Ie)}var $Ie,ln,hR=N(()=>{"use strict";uR();$Ie=4;o(zIe,"clone");ln=zIe});function UIe(t){return Gw(t,GIe|VIe)}var GIe,VIe,fR,wne=N(()=>{"use strict";uR();GIe=1,VIe=4;o(UIe,"cloneDeep");fR=UIe});function HIe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{"use strict";o(HIe,"compact");_c=HIe});function WIe(t){return this.__data__.set(t,qIe),this}var qIe,Ene,Sne=N(()=>{"use strict";qIe="__lodash_hash_undefined__";o(WIe,"setCacheAdd");Ene=WIe});function YIe(t){return this.__data__.has(t)}var Cne,Ane=N(()=>{"use strict";o(YIe,"setCacheHas");Cne=YIe});function Vw(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new Gd;++e{"use strict";dT();Sne();Ane();o(Vw,"SetCache");Vw.prototype.add=Vw.prototype.push=Ene;Vw.prototype.has=Cne;Bm=Vw});function XIe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(XIe,"arraySome");Hw=XIe});function jIe(t,e){return t.has(e)}var Fm,qw=N(()=>{"use strict";o(jIe,"cacheHas");Fm=jIe});function ZIe(t,e,r,n,i,a){var s=r&KIe,l=t.length,u=e.length;if(l!=u&&!(s&&u>l))return!1;var h=a.get(t),f=a.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,m=r&QIe?new Bm:void 0;for(a.set(t,e),a.set(e,t);++d{"use strict";Uw();dR();qw();KIe=1,QIe=2;o(ZIe,"equalArrays");Ww=ZIe});function JIe(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var _ne,Dne=N(()=>{"use strict";o(JIe,"mapToArray");_ne=JIe});function eOe(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var $m,Yw=N(()=>{"use strict";o(eOe,"setToArray");$m=eOe});function pOe(t,e,r,n,i,a,s){switch(r){case dOe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case fOe:return!(t.byteLength!=e.byteLength||!a(new um(t),new um(e)));case nOe:case iOe:case oOe:return Io(+t,+e);case aOe:return t.name==e.name&&t.message==e.message;case lOe:case uOe:return t==e+"";case sOe:var l=_ne;case cOe:var u=n&tOe;if(l||(l=$m),t.size!=e.size&&!u)return!1;var h=s.get(t);if(h)return h==e;n|=rOe,s.set(t,e);var f=Ww(l(t),l(e),n,i,a,s);return s.delete(t),f;case hOe:if(mR)return mR.call(t)==mR.call(e)}return!1}var tOe,rOe,nOe,iOe,aOe,sOe,oOe,lOe,cOe,uOe,hOe,fOe,dOe,Lne,mR,Rne,Nne=N(()=>{"use strict";$d();wL();zd();pR();Dne();Yw();tOe=1,rOe=2,nOe="[object Boolean]",iOe="[object Date]",aOe="[object Error]",sOe="[object Map]",oOe="[object Number]",lOe="[object RegExp]",cOe="[object Set]",uOe="[object String]",hOe="[object Symbol]",fOe="[object ArrayBuffer]",dOe="[object DataView]",Lne=Ki?Ki.prototype:void 0,mR=Lne?Lne.valueOf:void 0;o(pOe,"equalByTag");Rne=pOe});function vOe(t,e,r,n,i,a){var s=r&mOe,l=$2(t),u=l.length,h=$2(e),f=h.length;if(u!=f&&!s)return!1;for(var d=u;d--;){var p=l[d];if(!(s?p in e:yOe.call(e,p)))return!1}var m=a.get(t),g=a.get(e);if(m&&g)return m==e&&g==t;var y=!0;a.set(t,e),a.set(e,t);for(var v=s;++d{"use strict";oR();mOe=1,gOe=Object.prototype,yOe=gOe.hasOwnProperty;o(vOe,"equalObjects");Mne=vOe});function TOe(t,e,r,n,i,a){var s=Bt(t),l=Bt(e),u=s?Pne:ho(t),h=l?Pne:ho(e);u=u==One?Xw:u,h=h==One?Xw:h;var f=u==Xw,d=h==Xw,p=u==h;if(p&&Dl(t)){if(!Dl(e))return!1;s=!0,f=!1}if(p&&!f)return a||(a=new dc),s||Uh(t)?Ww(t,e,r,n,i,a):Rne(t,e,u,r,n,i,a);if(!(r&xOe)){var m=f&&Bne.call(t,"__wrapped__"),g=d&&Bne.call(e,"__wrapped__");if(m||g){var y=m?t.value():t,v=g?e.value():e;return a||(a=new dc),i(y,v,r,n,a)}}return p?(a||(a=new dc),Mne(t,e,r,n,i,a)):!1}var xOe,One,Pne,Xw,bOe,Bne,Fne,$ne=N(()=>{"use strict";c2();pR();Nne();Ine();ip();Yn();gm();d2();xOe=1,One="[object Arguments]",Pne="[object Array]",Xw="[object Object]",bOe=Object.prototype,Bne=bOe.hasOwnProperty;o(TOe,"baseIsEqualDeep");Fne=TOe});function zne(t,e,r,n,i){return t===e?!0:t==null||e==null||!ai(t)&&!ai(e)?t!==t&&e!==e:Fne(t,e,r,n,zne,i)}var jw,gR=N(()=>{"use strict";$ne();Oo();o(zne,"baseIsEqual");jw=zne});function EOe(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var l=r[i];if(s&&l[2]?l[1]!==t[l[0]]:!(l[0]in t))return!1}for(;++i{"use strict";c2();gR();wOe=1,kOe=2;o(EOe,"baseIsMatch");Gne=EOe});function SOe(t){return t===t&&!Sn(t)}var Kw,yR=N(()=>{"use strict";oo();o(SOe,"isStrictComparable");Kw=SOe});function COe(t){for(var e=qr(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,Kw(i)]}return e}var Une,Hne=N(()=>{"use strict";yR();Sc();o(COe,"getMatchData");Une=COe});function AOe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var Qw,vR=N(()=>{"use strict";o(AOe,"matchesStrictComparable");Qw=AOe});function _Oe(t){var e=Une(t);return e.length==1&&e[0][2]?Qw(e[0][0],e[0][1]):function(r){return r===t||Gne(r,t,e)}}var qne,Wne=N(()=>{"use strict";Vne();Hne();vR();o(_Oe,"baseMatches");qne=_Oe});function DOe(t,e){return t!=null&&e in Object(t)}var Yne,Xne=N(()=>{"use strict";o(DOe,"baseHasIn");Yne=DOe});function LOe(t,e,r){e=rf(e,t);for(var n=-1,i=e.length,a=!1;++n{"use strict";B2();pm();Yn();m2();wT();Nm();o(LOe,"hasPath");Zw=LOe});function ROe(t,e){return t!=null&&Zw(t,e,Yne)}var Jw,bR=N(()=>{"use strict";Xne();xR();o(ROe,"hasIn");Jw=ROe});function IOe(t,e){return Rm(t)&&Kw(e)?Qw(Cc(t),e):function(r){var n=kre(r,t);return n===void 0&&n===e?Jw(r,t):jw(e,n,NOe|MOe)}}var NOe,MOe,jne,Kne=N(()=>{"use strict";gR();Ere();bR();Aw();yR();vR();Nm();NOe=1,MOe=2;o(IOe,"baseMatchesProperty");jne=IOe});function OOe(t){return function(e){return e?.[t]}}var ek,TR=N(()=>{"use strict";o(OOe,"baseProperty");ek=OOe});function POe(t){return function(e){return nf(e,t)}}var Qne,Zne=N(()=>{"use strict";F2();o(POe,"basePropertyDeep");Qne=POe});function BOe(t){return Rm(t)?ek(Cc(t)):Qne(t)}var Jne,eie=N(()=>{"use strict";TR();Zne();Aw();Nm();o(BOe,"property");Jne=BOe});function FOe(t){return typeof t=="function"?t:t==null?Qi:typeof t=="object"?Bt(t)?jne(t[0],t[1]):qne(t):Jne(t)}var vn,ss=N(()=>{"use strict";Wne();Kne();Ru();Yn();eie();o(FOe,"baseIteratee");vn=FOe});function $Oe(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{"use strict";o($Oe,"arrayAggregator");tie=$Oe});function zOe(t,e){return t&&cm(t,e,qr)}var zm,tk=N(()=>{"use strict";pT();Sc();o(zOe,"baseForOwn");zm=zOe});function GOe(t,e){return function(r,n){if(r==null)return r;if(!fi(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";Po();o(GOe,"createBaseEach");nie=GOe});var VOe,zs,sf=N(()=>{"use strict";tk();iie();VOe=nie(zm),zs=VOe});function UOe(t,e,r,n){return zs(t,function(i,a,s){e(n,i,r(i),s)}),n}var aie,sie=N(()=>{"use strict";sf();o(UOe,"baseAggregator");aie=UOe});function HOe(t,e){return function(r,n){var i=Bt(r)?tie:aie,a=e?e():{};return i(r,t,vn(n,2),a)}}var oie,lie=N(()=>{"use strict";rie();sie();ss();Yn();o(HOe,"createAggregator");oie=HOe});var qOe,rk,cie=N(()=>{"use strict";Mo();qOe=o(function(){return hi.Date.now()},"now"),rk=qOe});var uie,WOe,YOe,of,hie=N(()=>{"use strict";vm();zd();qd();qh();uie=Object.prototype,WOe=uie.hasOwnProperty,YOe=yc(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&lo(e[0],e[1],i)&&(n=1);++r{"use strict";o(XOe,"arrayIncludesWith");nk=XOe});function KOe(t,e,r,n){var i=-1,a=Sw,s=!0,l=t.length,u=[],h=e.length;if(!l)return u;r&&(e=$s(e,Bo(r))),n?(a=nk,s=!1):e.length>=jOe&&(a=Fm,s=!1,e=new Bm(e));e:for(;++i{"use strict";Uw();tR();wR();rp();Ud();qw();jOe=200;o(KOe,"baseDifference");fie=KOe});var QOe,lf,pie=N(()=>{"use strict";die();Im();vm();kT();QOe=yc(function(t,e){return Vd(t)?fie(t,Ac(e,1,Vd,!0)):[]}),lf=QOe});function ZOe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ma,mie=N(()=>{"use strict";o(ZOe,"last");ma=ZOe});function JOe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:Ec(e),Rw(t,e<0?0:e,n)):[]}var yi,gie=N(()=>{"use strict";nR();_m();o(JOe,"drop");yi=JOe});function ePe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:Ec(e),e=n-e,Rw(t,0,e<0?0:e)):[]}var Bu,yie=N(()=>{"use strict";nR();_m();o(ePe,"dropRight");Bu=ePe});function tPe(t){return typeof t=="function"?t:Qi}var Gm,ik=N(()=>{"use strict";Ru();o(tPe,"castFunction");Gm=tPe});function rPe(t,e){var r=Bt(t)?ww:zs;return r(t,Gm(e))}var Ae,ak=N(()=>{"use strict";J9();sf();ik();Yn();o(rPe,"forEach");Ae=rPe});var vie=N(()=>{"use strict";ak()});function nPe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(nPe,"arrayEvery");xie=nPe});function iPe(t,e){var r=!0;return zs(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var Tie,wie=N(()=>{"use strict";sf();o(iPe,"baseEvery");Tie=iPe});function aPe(t,e,r){var n=Bt(t)?xie:Tie;return r&&lo(t,e,r)&&(e=void 0),n(t,vn(e,3))}var Pa,kie=N(()=>{"use strict";bie();wie();ss();Yn();qd();o(aPe,"every");Pa=aPe});function sPe(t,e){var r=[];return zs(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var sk,kR=N(()=>{"use strict";sf();o(sPe,"baseFilter");sk=sPe});function oPe(t,e){var r=Bt(t)?Om:sk;return r(t,vn(e,3))}var Zr,ER=N(()=>{"use strict";Nw();kR();ss();Yn();o(oPe,"filter");Zr=oPe});function lPe(t){return function(e,r,n){var i=Object(e);if(!fi(e)){var a=vn(r,3);e=qr(e),r=o(function(l){return a(i[l],l,i)},"predicate")}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var Eie,Sie=N(()=>{"use strict";ss();Po();Sc();o(lPe,"createFind");Eie=lPe});function uPe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:Ec(r);return i<0&&(i=cPe(n+i,0)),kw(t,vn(e,3),i)}var cPe,Cie,Aie=N(()=>{"use strict";eR();ss();_m();cPe=Math.max;o(uPe,"findIndex");Cie=uPe});var hPe,os,_ie=N(()=>{"use strict";Sie();Aie();hPe=Eie(Cie),os=hPe});function fPe(t){return t&&t.length?t[0]:void 0}var ea,Die=N(()=>{"use strict";o(fPe,"head");ea=fPe});var Lie=N(()=>{"use strict";Die()});function dPe(t,e){var r=-1,n=fi(t)?Array(t.length):[];return zs(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var ok,SR=N(()=>{"use strict";sf();Po();o(dPe,"baseMap");ok=dPe});function pPe(t,e){var r=Bt(t)?$s:ok;return r(t,vn(e,3))}var rt,Vm=N(()=>{"use strict";rp();ss();SR();Yn();o(pPe,"map");rt=pPe});function mPe(t,e){return Ac(rt(t,e),1)}var ga,CR=N(()=>{"use strict";Im();Vm();o(mPe,"flatMap");ga=mPe});function gPe(t,e){return t==null?t:cm(t,Gm(e),Rs)}var AR,Rie=N(()=>{"use strict";pT();ik();qh();o(gPe,"forIn");AR=gPe});function yPe(t,e){return t&&zm(t,Gm(e))}var _R,Nie=N(()=>{"use strict";tk();ik();o(yPe,"forOwn");_R=yPe});var vPe,xPe,bPe,DR,Mie=N(()=>{"use strict";lm();lie();vPe=Object.prototype,xPe=vPe.hasOwnProperty,bPe=oie(function(t,e,r){xPe.call(t,r)?t[r].push(e):pc(t,r,[e])}),DR=bPe});function TPe(t,e){return t>e}var Iie,Oie=N(()=>{"use strict";o(TPe,"baseGt");Iie=TPe});function EPe(t,e){return t!=null&&kPe.call(t,e)}var wPe,kPe,Pie,Bie=N(()=>{"use strict";wPe=Object.prototype,kPe=wPe.hasOwnProperty;o(EPe,"baseHas");Pie=EPe});function SPe(t,e){return t!=null&&Zw(t,e,Pie)}var Ft,Fie=N(()=>{"use strict";Bie();xR();o(SPe,"has");Ft=SPe});function APe(t){return typeof t=="string"||!Bt(t)&&ai(t)&&ha(t)==CPe}var CPe,xi,lk=N(()=>{"use strict";_u();Yn();Oo();CPe="[object String]";o(APe,"isString");xi=APe});function _Pe(t,e){return $s(e,function(r){return t[r]})}var $ie,zie=N(()=>{"use strict";rp();o(_Pe,"baseValues");$ie=_Pe});function DPe(t){return t==null?[]:$ie(t,qr(t))}var kr,LR=N(()=>{"use strict";zie();Sc();o(DPe,"values");kr=DPe});function RPe(t,e,r,n){t=fi(t)?t:kr(t),r=r&&!n?Ec(r):0;var i=t.length;return r<0&&(r=LPe(i+r,0)),xi(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&Dm(t,e,r)>-1}var LPe,jn,Gie=N(()=>{"use strict";Ew();Po();lk();_m();LR();LPe=Math.max;o(RPe,"includes");jn=RPe});function MPe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:Ec(r);return i<0&&(i=NPe(n+i,0)),Dm(t,e,i)}var NPe,ck,Vie=N(()=>{"use strict";Ew();_m();NPe=Math.max;o(MPe,"indexOf");ck=MPe});function FPe(t){if(t==null)return!0;if(fi(t)&&(Bt(t)||typeof t=="string"||typeof t.splice=="function"||Dl(t)||Uh(t)||_l(t)))return!t.length;var e=ho(t);if(e==IPe||e==OPe)return!t.size;if(mc(t))return!Lm(t).length;for(var r in t)if(BPe.call(t,r))return!1;return!0}var IPe,OPe,PPe,BPe,mr,uk=N(()=>{"use strict";Cw();ip();pm();Yn();Po();gm();dm();d2();IPe="[object Map]",OPe="[object Set]",PPe=Object.prototype,BPe=PPe.hasOwnProperty;o(FPe,"isEmpty");mr=FPe});function zPe(t){return ai(t)&&ha(t)==$Pe}var $Pe,Uie,Hie=N(()=>{"use strict";_u();Oo();$Pe="[object RegExp]";o(zPe,"baseIsRegExp");Uie=zPe});var qie,GPe,Uo,Wie=N(()=>{"use strict";Hie();Ud();f2();qie=Fo&&Fo.isRegExp,GPe=qie?Bo(qie):Uie,Uo=GPe});function VPe(t){return t===void 0}var xr,Yie=N(()=>{"use strict";o(VPe,"isUndefined");xr=VPe});function UPe(t,e){return t{"use strict";o(UPe,"baseLt");hk=UPe});function HPe(t,e){var r={};return e=vn(e,3),zm(t,function(n,i,a){pc(r,i,e(n,i,a))}),r}var ap,Xie=N(()=>{"use strict";lm();tk();ss();o(HPe,"mapValues");ap=HPe});function qPe(t,e,r){for(var n=-1,i=t.length;++n{"use strict";tp();o(qPe,"baseExtremum");Um=qPe});function WPe(t){return t&&t.length?Um(t,Qi,Iie):void 0}var Gs,jie=N(()=>{"use strict";fk();Oie();Ru();o(WPe,"max");Gs=WPe});function YPe(t){return t&&t.length?Um(t,Qi,hk):void 0}var Rl,NR=N(()=>{"use strict";fk();RR();Ru();o(YPe,"min");Rl=YPe});function XPe(t,e){return t&&t.length?Um(t,vn(e,2),hk):void 0}var sp,Kie=N(()=>{"use strict";fk();ss();RR();o(XPe,"minBy");sp=XPe});function KPe(t){if(typeof t!="function")throw new TypeError(jPe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var jPe,Qie,Zie=N(()=>{"use strict";jPe="Expected a function";o(KPe,"negate");Qie=KPe});function QPe(t,e,r,n){if(!Sn(t))return t;e=rf(e,t);for(var i=-1,a=e.length,s=a-1,l=t;l!=null&&++i{"use strict";ym();B2();m2();oo();Nm();o(QPe,"baseSet");Jie=QPe});function ZPe(t,e,r){for(var n=-1,i=e.length,a={};++n{"use strict";F2();eae();B2();o(ZPe,"basePickBy");dk=ZPe});function JPe(t,e){if(t==null)return{};var r=$s(Bw(t),function(n){return[n]});return e=vn(e),dk(t,r,function(n,i){return e(n,i[0])})}var Vs,tae=N(()=>{"use strict";rp();ss();MR();lR();o(JPe,"pickBy");Vs=JPe});function eBe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var rae,nae=N(()=>{"use strict";o(eBe,"baseSortBy");rae=eBe});function tBe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=uo(t),s=e!==void 0,l=e===null,u=e===e,h=uo(e);if(!l&&!h&&!a&&t>e||a&&s&&u&&!l&&!h||n&&s&&u||!r&&u||!i)return 1;if(!n&&!a&&!h&&t{"use strict";tp();o(tBe,"compareAscending");iae=tBe});function rBe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,l=r.length;++n=l)return u;var h=r[n];return u*(h=="desc"?-1:1)}}return t.index-e.index}var sae,oae=N(()=>{"use strict";aae();o(rBe,"compareMultiple");sae=rBe});function nBe(t,e,r){e.length?e=$s(e,function(a){return Bt(a)?function(s){return nf(s,a.length===1?a[0]:a)}:a}):e=[Qi];var n=-1;e=$s(e,Bo(vn));var i=ok(t,function(a,s,l){var u=$s(e,function(h){return h(a)});return{criteria:u,index:++n,value:a}});return rae(i,function(a,s){return sae(a,s,r)})}var lae,cae=N(()=>{"use strict";rp();F2();ss();SR();nae();Ud();oae();Ru();Yn();o(nBe,"baseOrderBy");lae=nBe});var iBe,uae,hae=N(()=>{"use strict";TR();iBe=ek("length"),uae=iBe});function gBe(t){for(var e=fae.lastIndex=0;fae.test(t);)++e;return e}var dae,aBe,sBe,oBe,lBe,cBe,uBe,IR,OR,hBe,pae,mae,gae,fBe,yae,vae,dBe,pBe,mBe,fae,xae,bae=N(()=>{"use strict";dae="\\ud800-\\udfff",aBe="\\u0300-\\u036f",sBe="\\ufe20-\\ufe2f",oBe="\\u20d0-\\u20ff",lBe=aBe+sBe+oBe,cBe="\\ufe0e\\ufe0f",uBe="["+dae+"]",IR="["+lBe+"]",OR="\\ud83c[\\udffb-\\udfff]",hBe="(?:"+IR+"|"+OR+")",pae="[^"+dae+"]",mae="(?:\\ud83c[\\udde6-\\uddff]){2}",gae="[\\ud800-\\udbff][\\udc00-\\udfff]",fBe="\\u200d",yae=hBe+"?",vae="["+cBe+"]?",dBe="(?:"+fBe+"(?:"+[pae,mae,gae].join("|")+")"+vae+yae+")*",pBe=vae+yae+dBe,mBe="(?:"+[pae+IR+"?",IR,mae,gae,uBe].join("|")+")",fae=RegExp(OR+"(?="+OR+")|"+mBe+pBe,"g");o(gBe,"unicodeSize");xae=gBe});function yBe(t){return Rre(t)?xae(t):uae(t)}var Tae,wae=N(()=>{"use strict";hae();Nre();bae();o(yBe,"stringSize");Tae=yBe});function vBe(t,e){return dk(t,e,function(r,n){return Jw(t,n)})}var kae,Eae=N(()=>{"use strict";MR();bR();o(vBe,"basePick");kae=vBe});var xBe,op,Sae=N(()=>{"use strict";Eae();Lre();xBe=Dre(function(t,e){return t==null?{}:kae(t,e)}),op=xBe});function wBe(t,e,r,n){for(var i=-1,a=TBe(bBe((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var bBe,TBe,Cae,Aae=N(()=>{"use strict";bBe=Math.ceil,TBe=Math.max;o(wBe,"baseRange");Cae=wBe});function kBe(t){return function(e,r,n){return n&&typeof n!="number"&&lo(e,r,n)&&(r=n=void 0),e=Am(e),r===void 0?(r=e,e=0):r=Am(r),n=n===void 0?e{"use strict";Aae();qd();Q9();o(kBe,"createRange");_ae=kBe});var EBe,Ho,Lae=N(()=>{"use strict";Dae();EBe=_ae(),Ho=EBe});function SBe(t,e,r,n,i){return i(t,function(a,s,l){r=n?(n=!1,a):e(r,a,s,l)}),r}var Rae,Nae=N(()=>{"use strict";o(SBe,"baseReduce");Rae=SBe});function CBe(t,e,r){var n=Bt(t)?Mre:Rae,i=arguments.length<3;return n(t,vn(e,4),r,i,zs)}var Jr,PR=N(()=>{"use strict";Ire();sf();ss();Nae();Yn();o(CBe,"reduce");Jr=CBe});function ABe(t,e){var r=Bt(t)?Om:sk;return r(t,Qie(vn(e,3)))}var cf,Mae=N(()=>{"use strict";Nw();kR();ss();Yn();Zie();o(ABe,"reject");cf=ABe});function LBe(t){if(t==null)return 0;if(fi(t))return xi(t)?Tae(t):t.length;var e=ho(t);return e==_Be||e==DBe?t.size:Lm(t).length}var _Be,DBe,BR,Iae=N(()=>{"use strict";Cw();ip();Po();lk();wae();_Be="[object Map]",DBe="[object Set]";o(LBe,"size");BR=LBe});function RBe(t,e){var r;return zs(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var Oae,Pae=N(()=>{"use strict";sf();o(RBe,"baseSome");Oae=RBe});function NBe(t,e,r){var n=Bt(t)?Hw:Oae;return r&&lo(t,e,r)&&(e=void 0),n(t,vn(e,3))}var z2,Bae=N(()=>{"use strict";dR();ss();Pae();Yn();qd();o(NBe,"some");z2=NBe});var MBe,Dc,Fae=N(()=>{"use strict";Im();cae();vm();qd();MBe=yc(function(t,e){if(t==null)return[];var r=e.length;return r>1&&lo(t,e[0],e[1])?e=[]:r>2&&lo(e[0],e[1],e[2])&&(e=[e[0]]),lae(t,Ac(e,1),[])}),Dc=MBe});var IBe,OBe,$ae,zae=N(()=>{"use strict";cR();Z9();Yw();IBe=1/0,OBe=af&&1/$m(new af([,-0]))[1]==IBe?function(t){return new af(t)}:si,$ae=OBe});function BBe(t,e,r){var n=-1,i=Sw,a=t.length,s=!0,l=[],u=l;if(r)s=!1,i=nk;else if(a>=PBe){var h=e?null:$ae(t);if(h)return $m(h);s=!1,i=Fm,u=new Bm}else u=e?[]:l;e:for(;++n{"use strict";Uw();tR();wR();qw();zae();Yw();PBe=200;o(BBe,"baseUniq");Hm=BBe});var FBe,FR,Gae=N(()=>{"use strict";Im();vm();pk();kT();FBe=yc(function(t){return Hm(Ac(t,1,Vd,!0))}),FR=FBe});function $Be(t){return t&&t.length?Hm(t):[]}var qm,Vae=N(()=>{"use strict";pk();o($Be,"uniq");qm=$Be});function zBe(t,e){return t&&t.length?Hm(t,vn(e,2)):[]}var Uae,Hae=N(()=>{"use strict";ss();pk();o(zBe,"uniqBy");Uae=zBe});function VBe(t){var e=++GBe;return _w(t)+e}var GBe,lp,qae=N(()=>{"use strict";rR();GBe=0;o(VBe,"uniqueId");lp=VBe});function UBe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{"use strict";o(UBe,"baseZipObject");Wae=UBe});function HBe(t,e){return Wae(t||[],e||[],gc)}var mk,Xae=N(()=>{"use strict";ym();Yae();o(HBe,"zipObject");mk=HBe});var Yt=N(()=>{"use strict";vre();hR();wne();kne();NL();hie();pie();gie();yie();vie();kie();ER();_ie();Lie();CR();Lw();ak();Rie();Nie();Mie();Fie();Ru();Gie();Vie();Yn();uk();i2();oo();Wie();lk();Yie();Sc();mie();Vm();Xie();jie();OL();NR();Kie();Z9();cie();Sae();tae();Lae();PR();Mae();Iae();Bae();Fae();Gae();Vae();qae();LR();Xae();});function Kae(t,e){t[e]?t[e]++:t[e]=1}function Qae(t,e){--t[e]||delete t[e]}function G2(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+jae+a+jae+(xr(n)?qBe:n)}function WBe(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var l={v:i,w:a};return n&&(l.name=n),l}function $R(t,e){return G2(t,e.v,e.w,e.name)}var qBe,cp,jae,cn,gk=N(()=>{"use strict";Yt();qBe="\0",cp="\0",jae="",cn=class{static{o(this,"Graph")}constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=Ns(void 0),this._defaultEdgeLabelFn=Ns(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[cp]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return Si(e)||(e=Ns(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return qr(this._nodes)}sources(){var e=this;return Zr(this.nodes(),function(r){return mr(e._in[r])})}sinks(){var e=this;return Zr(this.nodes(),function(r){return mr(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Ae(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=cp,this._children[e]={},this._children[cp][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=o(n=>this.removeEdge(this._edgeObjs[n]),"removeEdge");delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Ae(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Ae(qr(this._in[e]),r),delete this._in[e],delete this._preds[e],Ae(qr(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(xr(r))r=cp;else{r+="";for(var n=r;!xr(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==cp)return r}}children(e){if(xr(e)&&(e=cp),this._isCompound){var r=this._children[e];if(r)return qr(r)}else{if(e===cp)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return qr(r)}successors(e){var r=this._sucs[e];if(r)return qr(r)}neighbors(e){var r=this.predecessors(e);if(r)return FR(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Ae(this._nodes,function(s,l){e(l)&&r.setNode(l,s)}),Ae(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var l=n.parent(s);return l===void 0||r.hasNode(l)?(i[s]=l,l):l in i?i[l]:a(l)}return o(a,"findParent"),this._isCompound&&Ae(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return Si(e)||(e=Ns(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return kr(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return Jr(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,xr(n)||(n=""+n);var l=G2(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,l))return a&&(this._edgeLabels[l]=i),this;if(!xr(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[l]=a?i:this._defaultEdgeLabelFn(e,r,n);var u=WBe(this._isDirected,e,r,n);return e=u.v,r=u.w,Object.freeze(u),this._edgeObjs[l]=u,Kae(this._preds[r],e),Kae(this._sucs[e],r),this._in[r][l]=u,this._out[e][l]=u,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?$R(this._isDirected,arguments[0]):G2(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?$R(this._isDirected,arguments[0]):G2(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?$R(this._isDirected,arguments[0]):G2(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],Qae(this._preds[r],e),Qae(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=kr(n);return r?Zr(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=kr(n);return r?Zr(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};cn.prototype._nodeCount=0;cn.prototype._edgeCount=0;o(Kae,"incrementOrInitEntry");o(Qae,"decrementOrRemoveEntry");o(G2,"edgeArgsToId");o(WBe,"edgeArgsToObj");o($R,"edgeObjToId")});var qo=N(()=>{"use strict";gk()});function Zae(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function YBe(t,e){if(t!=="_next"&&t!=="_prev")return e}var vk,Jae=N(()=>{"use strict";vk=class{static{o(this,"List")}constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return Zae(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&Zae(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,YBe)),n=n._prev;return"["+e.join(", ")+"]"}};o(Zae,"unlink");o(YBe,"filterOutLinks")});function ese(t,e){if(t.nodeCount()<=1)return[];var r=KBe(t,e||XBe),n=jBe(r.graph,r.buckets,r.zeroIdx);return Qr(rt(n,function(i){return t.outEdges(i.v,i.w)}))}function jBe(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)zR(t,e,r,s);for(;s=i.dequeue();)zR(t,e,r,s);if(t.nodeCount()){for(var l=e.length-2;l>0;--l)if(s=e[l].dequeue(),s){n=n.concat(zR(t,e,r,s,!0));break}}}return n}function zR(t,e,r,n,i){var a=i?[]:void 0;return Ae(t.inEdges(n.v),function(s){var l=t.edge(s),u=t.node(s.v);i&&a.push({v:s.v,w:s.w}),u.out-=l,GR(e,r,u)}),Ae(t.outEdges(n.v),function(s){var l=t.edge(s),u=s.w,h=t.node(u);h.in-=l,GR(e,r,h)}),t.removeNode(n.v),a}function KBe(t,e){var r=new cn,n=0,i=0;Ae(t.nodes(),function(l){r.setNode(l,{v:l,in:0,out:0})}),Ae(t.edges(),function(l){var u=r.edge(l.v,l.w)||0,h=e(l),f=u+h;r.setEdge(l.v,l.w,f),i=Math.max(i,r.node(l.v).out+=h),n=Math.max(n,r.node(l.w).in+=h)});var a=Ho(i+n+3).map(function(){return new vk}),s=n+1;return Ae(r.nodes(),function(l){GR(a,s,r.node(l))}),{graph:r,buckets:a,zeroIdx:s}}function GR(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var XBe,tse=N(()=>{"use strict";Yt();qo();Jae();XBe=Ns(1);o(ese,"greedyFAS");o(jBe,"doGreedyFAS");o(zR,"removeNode");o(KBe,"buildState");o(GR,"assignBucket")});function rse(t){var e=t.graph().acyclicer==="greedy"?ese(t,r(t)):QBe(t);Ae(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,lp("rev"))});function r(n){return function(i){return n.edge(i).weight}}o(r,"weightFn")}function QBe(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Ae(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return o(i,"dfs"),Ae(t.nodes(),i),e}function nse(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var VR=N(()=>{"use strict";Yt();tse();o(rse,"run");o(QBe,"dfsFAS");o(nse,"undo")});function Lc(t,e,r,n){var i;do i=lp(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function ase(t){var e=new cn().setGraph(t.graph());return Ae(t.nodes(),function(r){e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function xk(t){var e=new cn({multigraph:t.isMultigraph()}).setGraph(t.graph());return Ae(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function UR(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=l*i/a,h=l):(i<0&&(s=-s),u=s,h=s*a/i),{x:r+u,y:n+h}}function uf(t){var e=rt(Ho(qR(t)+1),function(){return[]});return Ae(t.nodes(),function(r){var n=t.node(r),i=n.rank;xr(i)||(e[i][n.order]=r)}),e}function sse(t){var e=Rl(rt(t.nodes(),function(r){return t.node(r).rank}));Ae(t.nodes(),function(r){var n=t.node(r);Ft(n,"rank")&&(n.rank-=e)})}function ose(t){var e=Rl(rt(t.nodes(),function(a){return t.node(a).rank})),r=[];Ae(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Ae(r,function(a,s){xr(a)&&s%i!==0?--n:n&&Ae(a,function(l){t.node(l).rank+=n})})}function HR(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),Lc(t,"border",i,e)}function qR(t){return Gs(rt(t.nodes(),function(e){var r=t.node(e).rank;if(!xr(r))return r}))}function lse(t,e){var r={lhs:[],rhs:[]};return Ae(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function cse(t,e){var r=rk();try{return e()}finally{console.log(t+" time: "+(rk()-r)+"ms")}}function use(t,e){return e()}var Rc=N(()=>{"use strict";Yt();qo();o(Lc,"addDummyNode");o(ase,"simplify");o(xk,"asNonCompoundGraph");o(UR,"intersectRect");o(uf,"buildLayerMatrix");o(sse,"normalizeRanks");o(ose,"removeEmptyRanks");o(HR,"addBorderNode");o(qR,"maxRank");o(lse,"partition");o(cse,"time");o(use,"notime")});function fse(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Ae(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{"use strict";Yt();Rc();o(fse,"addBorderSegments");o(hse,"addBorderNode")});function mse(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&yse(t)}function gse(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&ZBe(t),(e==="lr"||e==="rl")&&(JBe(t),yse(t))}function yse(t){Ae(t.nodes(),function(e){pse(t.node(e))}),Ae(t.edges(),function(e){pse(t.edge(e))})}function pse(t){var e=t.width;t.width=t.height,t.height=e}function ZBe(t){Ae(t.nodes(),function(e){WR(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,WR),Object.prototype.hasOwnProperty.call(r,"y")&&WR(r)})}function WR(t){t.y=-t.y}function JBe(t){Ae(t.nodes(),function(e){YR(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,YR),Object.prototype.hasOwnProperty.call(r,"x")&&YR(r)})}function YR(t){var e=t.x;t.x=t.y,t.y=e}var vse=N(()=>{"use strict";Yt();o(mse,"adjust");o(gse,"undo");o(yse,"swapWidthHeight");o(pse,"swapWidthHeightOne");o(ZBe,"reverseY");o(WR,"reverseYOne");o(JBe,"swapXY");o(YR,"swapXYOne")});function xse(t){t.graph().dummyChains=[],Ae(t.edges(),function(e){tFe(t,e)})}function tFe(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,l=t.edge(e),u=l.labelRank;if(a!==n+1){t.removeEdge(e);var h=void 0,f,d;for(d=0,++n;n{"use strict";Yt();Rc();o(xse,"run");o(tFe,"normalizeEdge");o(bse,"undo")});function V2(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=Rl(rt(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}o(r,"dfs"),Ae(t.sources(),r)}function up(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var bk=N(()=>{"use strict";Yt();o(V2,"longestPath");o(up,"slack")});function Tk(t){var e=new cn({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;rFe(e,t){"use strict";Yt();qo();bk();o(Tk,"feasibleTree");o(rFe,"tightTree");o(nFe,"findMinSlackEdge");o(iFe,"shiftRanks")});var wse=N(()=>{"use strict"});var KR=N(()=>{"use strict"});var cjt,QR=N(()=>{"use strict";Yt();KR();cjt=Ns(1)});var kse=N(()=>{"use strict";QR()});var ZR=N(()=>{"use strict"});var Ese=N(()=>{"use strict";ZR()});var bjt,Sse=N(()=>{"use strict";Yt();bjt=Ns(1)});function JR(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new U2;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Ae(t.predecessors(a),i),delete r[a],n.push(a))}if(o(i,"visit"),Ae(t.sinks(),i),BR(e)!==t.nodeCount())throw new U2;return n}function U2(){}var eN=N(()=>{"use strict";Yt();JR.CycleException=U2;o(JR,"topsort");o(U2,"CycleException");U2.prototype=new Error});var Cse=N(()=>{"use strict";eN()});function wk(t,e,r){Bt(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Ae(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);Ase(t,s,r==="post",a,n,i)}),i}function Ase(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Ae(i(e),function(s){Ase(t,s,r,n,i,a)}),r&&a.push(e))}var tN=N(()=>{"use strict";Yt();o(wk,"dfs");o(Ase,"doDfs")});function rN(t,e){return wk(t,e,"post")}var _se=N(()=>{"use strict";tN();o(rN,"postorder")});function nN(t,e){return wk(t,e,"pre")}var Dse=N(()=>{"use strict";tN();o(nN,"preorder")});var Lse=N(()=>{"use strict";KR();gk()});var Rse=N(()=>{"use strict";wse();QR();kse();Ese();Sse();Cse();_se();Dse();Lse();ZR();eN()});function ff(t){t=ase(t),V2(t);var e=Tk(t);aN(e),iN(e,t);for(var r,n;r=Ose(e);)n=Pse(e,t,r),Bse(e,t,r,n)}function iN(t,e){var r=rN(t,t.nodes());r=r.slice(0,r.length-1),Ae(r,function(n){cFe(t,e,n)})}function cFe(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=Mse(t,e,r)}function Mse(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),l=0;return s||(a=!1,s=e.edge(i,r)),l=s.weight,Ae(e.nodeEdges(r),function(u){var h=u.v===r,f=h?u.w:u.v;if(f!==i){var d=h===a,p=e.edge(u).weight;if(l+=d?p:-p,hFe(t,r,f)){var m=t.edge(r,f).cutvalue;l+=d?-m:m}}}),l}function aN(t,e){arguments.length<2&&(e=t.nodes()[0]),Ise(t,{},1,e)}function Ise(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Ae(t.neighbors(n),function(l){Object.prototype.hasOwnProperty.call(e,l)||(r=Ise(t,e,r,l,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function Ose(t){return os(t.edges(),function(e){return t.edge(e).cutvalue<0})}function Pse(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),l=a,u=!1;a.lim>s.lim&&(l=s,u=!0);var h=Zr(e.edges(),function(f){return u===Nse(t,t.node(f.v),l)&&u!==Nse(t,t.node(f.w),l)});return sp(h,function(f){return up(e,f)})}function Bse(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),aN(t),iN(t,e),uFe(t,e)}function uFe(t,e){var r=os(t.nodes(),function(i){return!e.node(i).parent}),n=nN(t,r);n=n.slice(1),Ae(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),l=!1;s||(s=e.edge(a,i),l=!0),e.node(i).rank=e.node(a).rank+(l?s.minlen:-s.minlen)})}function hFe(t,e,r){return t.hasEdge(e,r)}function Nse(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var Fse=N(()=>{"use strict";Yt();Rse();Rc();jR();bk();ff.initLowLimValues=aN;ff.initCutValues=iN;ff.calcCutValue=Mse;ff.leaveEdge=Ose;ff.enterEdge=Pse;ff.exchangeEdges=Bse;o(ff,"networkSimplex");o(iN,"initCutValues");o(cFe,"assignCutValue");o(Mse,"calcCutValue");o(aN,"initLowLimValues");o(Ise,"dfsAssignLowLim");o(Ose,"leaveEdge");o(Pse,"enterEdge");o(Bse,"exchangeEdges");o(uFe,"updateRanks");o(hFe,"isTreeEdge");o(Nse,"isDescendant")});function sN(t){switch(t.graph().ranker){case"network-simplex":$se(t);break;case"tight-tree":dFe(t);break;case"longest-path":fFe(t);break;default:$se(t)}}function dFe(t){V2(t),Tk(t)}function $se(t){ff(t)}var fFe,oN=N(()=>{"use strict";jR();Fse();bk();o(sN,"rank");fFe=V2;o(dFe,"tightTreeRanker");o($se,"networkSimplexRanker")});function zse(t){var e=Lc(t,"root",{},"_root"),r=pFe(t),n=Gs(kr(r))-1,i=2*n+1;t.graph().nestingRoot=e,Ae(t.edges(),function(s){t.edge(s).minlen*=i});var a=mFe(t)+1;Ae(t.children(),function(s){Gse(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function Gse(t,e,r,n,i,a,s){var l=t.children(s);if(!l.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var u=HR(t,"_bt"),h=HR(t,"_bb"),f=t.node(s);t.setParent(u,s),f.borderTop=u,t.setParent(h,s),f.borderBottom=h,Ae(l,function(d){Gse(t,e,r,n,i,a,d);var p=t.node(d),m=p.borderTop?p.borderTop:d,g=p.borderBottom?p.borderBottom:d,y=p.borderTop?n:2*n,v=m!==g?1:i-a[s]+1;t.setEdge(u,m,{weight:y,minlen:v,nestingEdge:!0}),t.setEdge(g,h,{weight:y,minlen:v,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,u,{weight:0,minlen:i+a[s]})}function pFe(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Ae(a,function(s){r(s,i+1)}),e[n]=i}return o(r,"dfs"),Ae(t.children(),function(n){r(n,1)}),e}function mFe(t){return Jr(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function Vse(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Ae(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var Use=N(()=>{"use strict";Yt();Rc();o(zse,"run");o(Gse,"dfs");o(pFe,"treeDepths");o(mFe,"sumWeights");o(Vse,"cleanup")});function Hse(t,e,r){var n={},i;Ae(r,function(a){for(var s=t.parent(a),l,u;s;){if(l=t.parent(s),l?(u=n[l],n[l]=s):(u=i,i=s),u&&u!==s){e.setEdge(u,s);return}s=l}})}var qse=N(()=>{"use strict";Yt();o(Hse,"addSubgraphConstraints")});function Wse(t,e,r){var n=yFe(t),i=new cn({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Ae(t.nodes(),function(a){var s=t.node(a),l=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,l||n),Ae(t[r](a),function(u){var h=u.v===a?u.w:u.v,f=i.edge(h,a),d=xr(f)?0:f.weight;i.setEdge(h,a,{weight:t.edge(u).weight+d})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function yFe(t){for(var e;t.hasNode(e=lp("_root")););return e}var Yse=N(()=>{"use strict";Yt();qo();o(Wse,"buildLayerGraph");o(yFe,"createRootNode")});function Xse(t,e){for(var r=0,n=1;n0;)f%2&&(d+=l[f+1]),f=f-1>>1,l[f]+=h.weight;u+=h.weight*d})),u}var jse=N(()=>{"use strict";Yt();o(Xse,"crossCount");o(vFe,"twoLayerCrossCount")});function Kse(t){var e={},r=Zr(t.nodes(),function(l){return!t.children(l).length}),n=Gs(rt(r,function(l){return t.node(l).rank})),i=rt(Ho(n+1),function(){return[]});function a(l){if(!Ft(e,l)){e[l]=!0;var u=t.node(l);i[u.rank].push(l),Ae(t.successors(l),a)}}o(a,"dfs");var s=Dc(r,function(l){return t.node(l).rank});return Ae(s,a),i}var Qse=N(()=>{"use strict";Yt();o(Kse,"initOrder")});function Zse(t,e){return rt(e,function(r){var n=t.inEdges(r);if(n.length){var i=Jr(n,function(a,s){var l=t.edge(s),u=t.node(s.v);return{sum:a.sum+l.weight*u.order,weight:a.weight+l.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var Jse=N(()=>{"use strict";Yt();o(Zse,"barycenter")});function eoe(t,e){var r={};Ae(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};xr(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Ae(e.edges(),function(i){var a=r[i.v],s=r[i.w];!xr(a)&&!xr(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=Zr(r,function(i){return!i.indegree});return xFe(n)}function xFe(t){var e=[];function r(a){return function(s){s.merged||(xr(s.barycenter)||xr(a.barycenter)||s.barycenter>=a.barycenter)&&bFe(a,s)}}o(r,"handleIn");function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(o(n,"handleOut");t.length;){var i=t.pop();e.push(i),Ae(i.in.reverse(),r(i)),Ae(i.out,n(i))}return rt(Zr(e,function(a){return!a.merged}),function(a){return op(a,["vs","i","barycenter","weight"])})}function bFe(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var toe=N(()=>{"use strict";Yt();o(eoe,"resolveConflicts");o(xFe,"doResolveConflicts");o(bFe,"mergeEntries")});function noe(t,e){var r=lse(t,function(f){return Object.prototype.hasOwnProperty.call(f,"barycenter")}),n=r.lhs,i=Dc(r.rhs,function(f){return-f.i}),a=[],s=0,l=0,u=0;n.sort(TFe(!!e)),u=roe(a,i,u),Ae(n,function(f){u+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,l+=f.weight,u=roe(a,i,u)});var h={vs:Qr(a)};return l&&(h.barycenter=s/l,h.weight=l),h}function roe(t,e,r){for(var n;e.length&&(n=ma(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function TFe(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var ioe=N(()=>{"use strict";Yt();Rc();o(noe,"sort");o(roe,"consumeUnsortable");o(TFe,"compareWithBias")});function lN(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,l=a?a.borderRight:void 0,u={};s&&(i=Zr(i,function(g){return g!==s&&g!==l}));var h=Zse(t,i);Ae(h,function(g){if(t.children(g.v).length){var y=lN(t,g.v,r,n);u[g.v]=y,Object.prototype.hasOwnProperty.call(y,"barycenter")&&kFe(g,y)}});var f=eoe(h,r);wFe(f,u);var d=noe(f,n);if(s&&(d.vs=Qr([s,d.vs,l]),t.predecessors(s).length)){var p=t.node(t.predecessors(s)[0]),m=t.node(t.predecessors(l)[0]);Object.prototype.hasOwnProperty.call(d,"barycenter")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+p.order+m.order)/(d.weight+2),d.weight+=2}return d}function wFe(t,e){Ae(t,function(r){r.vs=Qr(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function kFe(t,e){xr(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var aoe=N(()=>{"use strict";Yt();Jse();toe();ioe();o(lN,"sortSubgraph");o(wFe,"expandSubgraphs");o(kFe,"mergeBarycenters")});function loe(t){var e=qR(t),r=soe(t,Ho(1,e+1),"inEdges"),n=soe(t,Ho(e-1,-1,-1),"outEdges"),i=Kse(t);ooe(t,i);for(var a=Number.POSITIVE_INFINITY,s,l=0,u=0;u<4;++l,++u){EFe(l%2?r:n,l%4>=2),i=uf(t);var h=Xse(t,i);h{"use strict";Yt();qo();Rc();qse();Yse();jse();Qse();aoe();o(loe,"order");o(soe,"buildLayerGraphs");o(EFe,"sweepLayerGraphs");o(ooe,"assignOrder")});function uoe(t){var e=CFe(t);Ae(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=SFe(t,e,i.v,i.w),s=a.path,l=a.lca,u=0,h=s[u],f=!0;r!==i.w;){if(n=t.node(r),f){for(;(h=s[u])!==l&&t.node(h).maxRanks||l>e[u].lim));for(h=u,u=n;(u=t.parent(u))!==h;)a.push(u);return{path:i.concat(a.reverse()),lca:h}}function CFe(t){var e={},r=0;function n(i){var a=r;Ae(t.children(i),n),e[i]={low:a,lim:r++}}return o(n,"dfs"),Ae(t.children(),n),e}var hoe=N(()=>{"use strict";Yt();o(uoe,"parentDummyChains");o(SFe,"findPath");o(CFe,"postorder")});function AFe(t,e){var r={};function n(i,a){var s=0,l=0,u=i.length,h=ma(a);return Ae(a,function(f,d){var p=DFe(t,f),m=p?t.node(p).order:u;(p||f===h)&&(Ae(a.slice(l,d+1),function(g){Ae(t.predecessors(g),function(y){var v=t.node(y),x=v.order;(xh)&&foe(r,p,f)})})}o(n,"scan");function i(a,s){var l=-1,u,h=0;return Ae(s,function(f,d){if(t.node(f).dummy==="border"){var p=t.predecessors(f);p.length&&(u=t.node(p[0]).order,n(s,h,d,l,u),h=d,l=u)}n(s,h,s.length,u,a.length)}),s}return o(i,"visitLayer"),Jr(e,i),r}function DFe(t,e){if(t.node(e).dummy)return os(t.predecessors(e),function(r){return t.node(r).dummy})}function foe(t,e,r){if(e>r){var n=e;e=r,r=n}var i=t[e];i||(t[e]=i={}),i[r]=!0}function LFe(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function RFe(t,e,r,n){var i={},a={},s={};return Ae(e,function(l){Ae(l,function(u,h){i[u]=u,a[u]=u,s[u]=h})}),Ae(e,function(l){var u=-1;Ae(l,function(h){var f=n(h);if(f.length){f=Dc(f,function(y){return s[y]});for(var d=(f.length-1)/2,p=Math.floor(d),m=Math.ceil(d);p<=m;++p){var g=f[p];a[h]===h&&u{"use strict";Yt();qo();Rc();o(AFe,"findType1Conflicts");o(_Fe,"findType2Conflicts");o(DFe,"findOtherInnerSegmentNode");o(foe,"addConflict");o(LFe,"hasConflict");o(RFe,"verticalAlignment");o(NFe,"horizontalCompaction");o(MFe,"buildBlockGraph");o(IFe,"findSmallestWidthAlignment");o(OFe,"alignCoordinates");o(PFe,"balance");o(doe,"positionX");o(BFe,"sep");o(FFe,"width")});function moe(t){t=xk(t),$Fe(t),_R(doe(t),function(e,r){t.node(r).x=e})}function $Fe(t){var e=uf(t),r=t.graph().ranksep,n=0;Ae(e,function(i){var a=Gs(rt(i,function(s){return t.node(s).height}));Ae(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var goe=N(()=>{"use strict";Yt();Rc();poe();o(moe,"position");o($Fe,"positionY")});function H2(t,e){var r=e&&e.debugTiming?cse:use;r("layout",()=>{var n=r(" buildLayoutGraph",()=>KFe(t));r(" runLayout",()=>zFe(n,r)),r(" updateInputGraph",()=>GFe(t,n))})}function zFe(t,e){e(" makeSpaceForEdgeLabels",()=>QFe(t)),e(" removeSelfEdges",()=>s$e(t)),e(" acyclic",()=>rse(t)),e(" nestingGraph.run",()=>zse(t)),e(" rank",()=>sN(xk(t))),e(" injectEdgeLabelProxies",()=>ZFe(t)),e(" removeEmptyRanks",()=>ose(t)),e(" nestingGraph.cleanup",()=>Vse(t)),e(" normalizeRanks",()=>sse(t)),e(" assignRankMinMax",()=>JFe(t)),e(" removeEdgeLabelProxies",()=>e$e(t)),e(" normalize.run",()=>xse(t)),e(" parentDummyChains",()=>uoe(t)),e(" addBorderSegments",()=>fse(t)),e(" order",()=>loe(t)),e(" insertSelfEdges",()=>o$e(t)),e(" adjustCoordinateSystem",()=>mse(t)),e(" position",()=>moe(t)),e(" positionSelfEdges",()=>l$e(t)),e(" removeBorderNodes",()=>a$e(t)),e(" normalize.undo",()=>bse(t)),e(" fixupEdgeLabelCoords",()=>n$e(t)),e(" undoCoordinateSystem",()=>gse(t)),e(" translateGraph",()=>t$e(t)),e(" assignNodeIntersects",()=>r$e(t)),e(" reversePoints",()=>i$e(t)),e(" acyclic.undo",()=>nse(t))}function GFe(t,e){Ae(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Ae(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function KFe(t){var e=new cn({multigraph:!0,compound:!0}),r=uN(t.graph());return e.setGraph(Wh({},UFe,cN(r,VFe),op(r,HFe))),Ae(t.nodes(),function(n){var i=uN(t.node(n));e.setNode(n,of(cN(i,qFe),WFe)),e.setParent(n,t.parent(n))}),Ae(t.edges(),function(n){var i=uN(t.edge(n));e.setEdge(n,Wh({},XFe,cN(i,YFe),op(i,jFe)))}),e}function QFe(t){var e=t.graph();e.ranksep/=2,Ae(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function ZFe(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};Lc(t,"edge-proxy",a,"_ep")}})}function JFe(t){var e=0;Ae(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=Gs(e,n.maxRank))}),t.graph().maxRank=e}function e$e(t){Ae(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function t$e(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,l=a.marginy||0;function u(h){var f=h.x,d=h.y,p=h.width,m=h.height;e=Math.min(e,f-p/2),r=Math.max(r,f+p/2),n=Math.min(n,d-m/2),i=Math.max(i,d+m/2)}o(u,"getExtremes"),Ae(t.nodes(),function(h){u(t.node(h))}),Ae(t.edges(),function(h){var f=t.edge(h);Object.prototype.hasOwnProperty.call(f,"x")&&u(f)}),e-=s,n-=l,Ae(t.nodes(),function(h){var f=t.node(h);f.x-=e,f.y-=n}),Ae(t.edges(),function(h){var f=t.edge(h);Ae(f.points,function(d){d.x-=e,d.y-=n}),Object.prototype.hasOwnProperty.call(f,"x")&&(f.x-=e),Object.prototype.hasOwnProperty.call(f,"y")&&(f.y-=n)}),a.width=r-e+s,a.height=i-n+l}function r$e(t){Ae(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(UR(n,a)),r.points.push(UR(i,s))})}function n$e(t){Ae(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function i$e(t){Ae(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function a$e(t){Ae(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(ma(r.borderLeft)),s=t.node(ma(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Ae(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function s$e(t){Ae(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function o$e(t){var e=uf(t);Ae(e,function(r){var n=0;Ae(r,function(i,a){var s=t.node(i);s.order=a+n,Ae(s.selfEdges,function(l){Lc(t,"selfedge",{width:l.label.width,height:l.label.height,rank:s.rank,order:a+ ++n,e:l.e,label:l.label},"_se")}),delete s.selfEdges})})}function l$e(t){Ae(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,l=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-l},{x:i+5*s/6,y:a-l},{x:i+s,y:a},{x:i+5*s/6,y:a+l},{x:i+2*s/3,y:a+l}],r.label.x=r.x,r.label.y=r.y}})}function cN(t,e){return ap(op(t,e),Number)}function uN(t){var e={};return Ae(t,function(r,n){e[n.toLowerCase()]=r}),e}var VFe,UFe,HFe,qFe,WFe,YFe,XFe,jFe,yoe=N(()=>{"use strict";Yt();qo();dse();vse();VR();XR();oN();Use();coe();hoe();goe();Rc();o(H2,"layout");o(zFe,"runLayout");o(GFe,"updateInputGraph");VFe=["nodesep","edgesep","ranksep","marginx","marginy"],UFe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},HFe=["acyclicer","ranker","rankdir","align"],qFe=["width","height"],WFe={width:0,height:0},YFe=["minlen","weight","width","height","labeloffset"],XFe={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},jFe=["labelpos"];o(KFe,"buildLayoutGraph");o(QFe,"makeSpaceForEdgeLabels");o(ZFe,"injectEdgeLabelProxies");o(JFe,"assignRankMinMax");o(e$e,"removeEdgeLabelProxies");o(t$e,"translateGraph");o(r$e,"assignNodeIntersects");o(n$e,"fixupEdgeLabelCoords");o(i$e,"reversePointsForReversedEdges");o(a$e,"removeBorderNodes");o(s$e,"removeSelfEdges");o(o$e,"insertSelfEdges");o(l$e,"positionSelfEdges");o(cN,"selectNumberAttrs");o(uN,"canonicalize")});var hN=N(()=>{"use strict";VR();yoe();XR();oN()});function Wo(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:c$e(t),edges:u$e(t)};return xr(t.graph())||(e.value=ln(t.graph())),e}function c$e(t){return rt(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return xr(r)||(i.value=r),xr(n)||(i.parent=n),i})}function u$e(t){return rt(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return xr(e.name)||(n.name=e.name),xr(r)||(n.value=r),n})}var fN=N(()=>{"use strict";Yt();gk();o(Wo,"write");o(c$e,"writeNodes");o(u$e,"writeEdges")});var Er,hp,boe,Toe,kk,h$e,woe,koe,f$e,Wm,xoe,Eoe,Soe,Coe,Aoe,_oe=N(()=>{"use strict";pt();qo();fN();Er=new Map,hp=new Map,boe=new Map,Toe=o(()=>{hp.clear(),boe.clear(),Er.clear()},"clear"),kk=o((t,e)=>{let r=hp.get(e)||[];return X.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),h$e=o((t,e)=>{let r=hp.get(e)||[];return X.info("Descendants of ",e," is ",r),X.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||kk(t.v,e)||kk(t.w,e)||r.includes(t.w):(X.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),woe=o((t,e,r,n)=>{X.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),X.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)woe(a,e,r,n);else{let s=e.node(a);X.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(X.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(X.debug("Setting parent",a,t),r.setParent(a,t)):(X.info("In copy ",t,"root",n,"data",e.node(t),n),X.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let l=e.edges(a);X.debug("Copying Edges",l),l.forEach(u=>{X.info("Edge",u);let h=e.edge(u.v,u.w,u.name);X.info("Edge data",h,n);try{h$e(u,n)?(X.info("Copying as ",u.v,u.w,h,u.name),r.setEdge(u.v,u.w,h,u.name),X.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):X.info("Skipping copy of edge ",u.v,"-->",u.w," rootId: ",n," clusterId:",t)}catch(f){X.error(f)}})}X.debug("Removing node",a),e.removeNode(a)})},"copy"),koe=o((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)boe.set(i,t),n=[...n,...koe(i,e)];return n},"extractDescendants"),f$e=o((t,e,r)=>{let n=t.edges().filter(u=>u.v===e||u.w===e),i=t.edges().filter(u=>u.v===r||u.w===r),a=n.map(u=>({v:u.v===e?r:u.v,w:u.w===e?e:u.w})),s=i.map(u=>({v:u.v,w:u.w}));return a.filter(u=>s.some(h=>u.v===h.v&&u.w===h.w))},"findCommonEdges"),Wm=o((t,e,r)=>{let n=e.children(t);if(X.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=Wm(a,e,r),l=f$e(e,r,s);if(s)if(l.length>0)i=s;else return s}return i},"findNonClusterChild"),xoe=o(t=>!Er.has(t)||!Er.get(t).externalConnections?t:Er.has(t)?Er.get(t).id:t,"getAnchorId"),Eoe=o((t,e)=>{if(!t||e>10){X.debug("Opting out, no graph ");return}else X.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(X.warn("Cluster identified",r," Replacement id in edges: ",Wm(r,t,r)),hp.set(r,koe(r,t)),Er.set(r,{id:Wm(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(X.debug("Cluster identified",r,hp),i.forEach(a=>{let s=kk(a.v,r),l=kk(a.w,r);s^l&&(X.warn("Edge: ",a," leaves cluster ",r),X.warn("Descendants of XXX ",r,": ",hp.get(r)),Er.get(r).externalConnections=!0)})):X.debug("Not a cluster ",r,hp)});for(let r of Er.keys()){let n=Er.get(r).id,i=t.parent(n);i!==r&&Er.has(i)&&!Er.get(i).externalConnections&&(Er.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);X.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),X.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(X.warn("Fix XXX",Er,"ids:",r.v,r.w,"Translating: ",Er.get(r.v)," --- ",Er.get(r.w)),Er.get(r.v)||Er.get(r.w)){if(X.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=xoe(r.v),a=xoe(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);Er.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);Er.get(s).externalConnections=!0,n.toCluster=r.w}X.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),X.warn("Adjusted Graph",Wo(t)),Soe(t,0),X.trace(Er)},"adjustClustersAndEdges"),Soe=o((t,e)=>{if(X.warn("extractor - ",e,Wo(t),t.children("D")),e>10){X.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){X.debug("Done, no node has children",t.nodes());return}X.debug("Nodes = ",r,e);for(let i of r)if(X.debug("Extracting node",i,Er,Er.has(i)&&!Er.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!Er.has(i))X.debug("Not a cluster",i,e);else if(!Er.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){X.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";Er.get(i)?.clusterData?.dir&&(s=Er.get(i).clusterData.dir,X.warn("Fixing dir",Er.get(i).clusterData.dir,s));let l=new cn({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});X.warn("Old graph before copy",Wo(t)),woe(i,t,l,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:Er.get(i).clusterData,label:Er.get(i).label,graph:l}),X.warn("New graph after copy node: (",i,")",Wo(l)),X.debug("Old graph after copy",Wo(t))}else X.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!Er.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),X.debug(Er);r=t.nodes(),X.warn("New list of nodes",r);for(let i of r){let a=t.node(i);X.warn(" Now next level",i,a),a?.clusterNode&&Soe(a.graph,e+1)}},"extractor"),Coe=o((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Coe(t,i);r=[...r,...a]}),r},"sorter"),Aoe=o(t=>Coe(t,t.children()),"sortNodesByHierarchy")});var Loe={};dr(Loe,{render:()=>d$e});var Doe,d$e,Roe=N(()=>{"use strict";hN();fN();qo();K9();It();_oe();bw();cw();j9();pt();O2();Xt();Doe=o(async(t,e,r,n,i,a)=>{X.warn("Graph in recursive render:XAX",Wo(e),i);let s=e.graph().rankdir;X.trace("Dir in recursive render - dir:",s);let l=t.insert("g").attr("class","root");e.nodes()?X.info("Recursive render XXX",e.nodes()):X.info("No nodes found for",e),e.edges().length>0&&X.info("Recursive edges",e.edge(e.edges()[0]));let u=l.insert("g").attr("class","clusters"),h=l.insert("g").attr("class","edgePaths"),f=l.insert("g").attr("class","edgeLabels"),d=l.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(y){let v=e.node(y);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));X.trace(`Setting data for parent cluster XXX + Node.id = `,y,` + data=`,x.height,` +Parent cluster`,i.height),e.setNode(i.id,x),e.parent(y)||(X.trace("Setting parent",y,i.id),e.setParent(y,i.id,x))}if(X.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),v?.clusterNode){X.info("Cluster identified XBX",y,v.width,e.node(y));let{ranksep:x,nodesep:b}=e.graph();v.graph.setGraph({...v.graph.graph(),ranksep:x+25,nodesep:b});let T=await Doe(d,v.graph,r,n,e.node(y),a),S=T.elem;Qe(v,S),v.diff=T.diff||0,X.info("New compound node after recursive render XAX",y,"width",v.width,"height",v.height),Xte(S,v)}else e.children(y).length>0?(X.trace("Cluster - the non recursive path XBX",y,v.id,v,v.width,"Graph:",e),X.trace(Wm(v.id,e)),Er.set(v.id,{id:Wm(v.id,e),node:v})):(X.trace("Node - the non recursive path XAX",y,d,e.node(y),s),await Cm(d,e.node(y),{config:a,dir:s}))})),await o(async()=>{let y=e.edges().map(async function(v){let x=e.edge(v.v,v.w,v.name);X.info("Edge "+v.v+" -> "+v.w+": "+JSON.stringify(v)),X.info("Edge "+v.v+" -> "+v.w+": ",v," ",JSON.stringify(e.edge(v))),X.info("Fix",Er,"ids:",v.v,v.w,"Translating: ",Er.get(v.v),Er.get(v.w)),await mw(f,x)});await Promise.all(y)},"processEdges")(),X.info("Graph before layout:",JSON.stringify(Wo(e))),X.info("############################################# XXX"),X.info("### Layout ### XXX"),X.info("############################################# XXX"),H2(e),X.info("Graph after layout:",JSON.stringify(Wo(e)));let m=0,{subGraphTitleTotalMargin:g}=Pu(a);return await Promise.all(Aoe(e).map(async function(y){let v=e.node(y);if(X.info("Position XBX => "+y+": ("+v.x,","+v.y,") width: ",v.width," height: ",v.height),v?.clusterNode)v.y+=g,X.info("A tainted cluster node XBX1",y,v.id,v.width,v.height,v.x,v.y,e.parent(y)),Er.get(v.id).node=v,P2(v);else if(e.children(y).length>0){X.info("A pure cluster node XBX1",y,v.id,v.x,v.y,v.width,v.height,e.parent(y)),v.height+=g,e.node(v.parentId);let x=v?.padding/2||0,b=v?.labelBBox?.height||0,T=b-x||0;X.debug("OffsetY",T,"labelHeight",b,"halfPadding",x),await Sm(u,v),Er.get(v.id).node=v}else{let x=e.node(v.parentId);v.y+=g/2,X.info("A regular node XBX1 - using the padding",v.id,"parent",v.parentId,v.width,v.height,v.x,v.y,"offsetY",v.offsetY,"parent",x,x?.offsetY,v),P2(v)}})),e.edges().forEach(function(y){let v=e.edge(y);X.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(v),v),v.points.forEach(S=>S.y+=g/2);let x=e.node(y.v);var b=e.node(y.w);let T=yw(h,v,Er,r,x,b,n);gw(v,T)}),e.nodes().forEach(function(y){let v=e.node(y);X.info(y,v.type,v.diff),v.isGroup&&(m=v.diff)}),X.warn("Returning from recursive render XAX",l,m),{elem:l,diff:m}},"recursiveRender"),d$e=o(async(t,e)=>{let r=new cn({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");vw(n,t.markers,t.type,t.diagramId),jte(),Yte(),zte(),Toe(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),X.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,l=s+"---"+s+"---1",u=s+"---"+s+"---2",h=r.node(s);r.setNode(l,{domId:l,id:l,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(l,h.parentId),r.setNode(u,{domId:u,id:u,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(u,h.parentId);let f=structuredClone(a),d=structuredClone(a),p=structuredClone(a);f.label="",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=s+"-cyclic-special-mid",p.label="",h.isGroup&&(f.fromCluster=s,p.toCluster=s),p.id=s+"-cyclic-special-2",p.arrowTypeStart="none",r.setEdge(s,l,f,s+"-cyclic-special-0"),r.setEdge(l,u,d,s+"-cyclic-special-1"),r.setEdge(u,s,p,s+"-cyct.length)&&(e=t.length);for(var r=0,n=Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},"n"),e:o(function(u){throw u},"e"),f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,s=!0,l=!1;return{s:o(function(){r=r.call(t)},"s"),n:o(function(){var u=r.next();return s=u.done,u},"n"),e:o(function(u){l=!0,a=u},"e"),f:o(function(){try{s||r.return==null||r.return()}finally{if(l)throw a}},"f")}}function sue(t,e,r){return(e=oue(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function y$e(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}function v$e(t,e){var r=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(r!=null){var n,i,a,s,l=[],u=!0,h=!1;try{if(a=(r=r.call(t)).next,e===0){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(l.push(n.value),l.length!==e);u=!0);}catch(f){h=!0,i=f}finally{try{if(!u&&r.return!=null&&(s=r.return(),Object(s)!==s))return}finally{if(h)throw i}}return l}}function x$e(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function b$e(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function _i(t,e){return p$e(t)||v$e(t,e)||cI(t,e)||x$e()}function Xk(t){return m$e(t)||y$e(t)||cI(t)||b$e()}function T$e(t,e){if(typeof t!="object"||!t)return t;var r=t[Symbol.toPrimitive];if(r!==void 0){var n=r.call(t,e);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}function oue(t){var e=T$e(t,"string");return typeof e=="symbol"?e:e+""}function $i(t){"@babel/helpers - typeof";return $i=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},$i(t)}function cI(t,e){if(t){if(typeof t=="string")return UM(t,e);var r={}.toString.call(t).slice(8,-1);return r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set"?Array.from(t):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?UM(t,e):void 0}}function gx(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function yx(){if(Ioe)return dN;Ioe=1;function t(e){var r=typeof e;return e!=null&&(r=="object"||r=="function")}return o(t,"isObject"),dN=t,dN}function H$e(){if(Ooe)return pN;Ooe=1;var t=typeof Ek=="object"&&Ek&&Ek.Object===Object&&Ek;return pN=t,pN}function cE(){if(Poe)return mN;Poe=1;var t=H$e(),e=typeof self=="object"&&self&&self.Object===Object&&self,r=t||e||Function("return this")();return mN=r,mN}function q$e(){if(Boe)return gN;Boe=1;var t=cE(),e=o(function(){return t.Date.now()},"now");return gN=e,gN}function W$e(){if(Foe)return yN;Foe=1;var t=/\s/;function e(r){for(var n=r.length;n--&&t.test(r.charAt(n)););return n}return o(e,"trimmedEndIndex"),yN=e,yN}function Y$e(){if($oe)return vN;$oe=1;var t=W$e(),e=/^\s+/;function r(n){return n&&n.slice(0,t(n)+1).replace(e,"")}return o(r,"baseTrim"),vN=r,vN}function fI(){if(zoe)return xN;zoe=1;var t=cE(),e=t.Symbol;return xN=e,xN}function X$e(){if(Goe)return bN;Goe=1;var t=fI(),e=Object.prototype,r=e.hasOwnProperty,n=e.toString,i=t?t.toStringTag:void 0;function a(s){var l=r.call(s,i),u=s[i];try{s[i]=void 0;var h=!0}catch{}var f=n.call(s);return h&&(l?s[i]=u:delete s[i]),f}return o(a,"getRawTag"),bN=a,bN}function j$e(){if(Voe)return TN;Voe=1;var t=Object.prototype,e=t.toString;function r(n){return e.call(n)}return o(r,"objectToString"),TN=r,TN}function gue(){if(Uoe)return wN;Uoe=1;var t=fI(),e=X$e(),r=j$e(),n="[object Null]",i="[object Undefined]",a=t?t.toStringTag:void 0;function s(l){return l==null?l===void 0?i:n:a&&a in Object(l)?e(l):r(l)}return o(s,"baseGetTag"),wN=s,wN}function K$e(){if(Hoe)return kN;Hoe=1;function t(e){return e!=null&&typeof e=="object"}return o(t,"isObjectLike"),kN=t,kN}function vx(){if(qoe)return EN;qoe=1;var t=gue(),e=K$e(),r="[object Symbol]";function n(i){return typeof i=="symbol"||e(i)&&t(i)==r}return o(n,"isSymbol"),EN=n,EN}function Q$e(){if(Woe)return SN;Woe=1;var t=Y$e(),e=yx(),r=vx(),n=NaN,i=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,s=/^0o[0-7]+$/i,l=parseInt;function u(h){if(typeof h=="number")return h;if(r(h))return n;if(e(h)){var f=typeof h.valueOf=="function"?h.valueOf():h;h=e(f)?f+"":f}if(typeof h!="string")return h===0?h:+h;h=t(h);var d=a.test(h);return d||s.test(h)?l(h.slice(2),d?2:8):i.test(h)?n:+h}return o(u,"toNumber"),SN=u,SN}function Z$e(){if(Yoe)return CN;Yoe=1;var t=yx(),e=q$e(),r=Q$e(),n="Expected a function",i=Math.max,a=Math.min;function s(l,u,h){var f,d,p,m,g,y,v=0,x=!1,b=!1,T=!0;if(typeof l!="function")throw new TypeError(n);u=r(u)||0,t(h)&&(x=!!h.leading,b="maxWait"in h,p=b?i(r(h.maxWait)||0,u):p,T="trailing"in h?!!h.trailing:T);function S(D){var _=f,O=d;return f=d=void 0,v=D,m=l.apply(O,_),m}o(S,"invokeFunc");function w(D){return v=D,g=setTimeout(C,u),x?S(D):m}o(w,"leadingEdge");function k(D){var _=D-y,O=D-v,M=u-_;return b?a(M,p-O):M}o(k,"remainingWait");function A(D){var _=D-y,O=D-v;return y===void 0||_>=u||_<0||b&&O>=p}o(A,"shouldInvoke");function C(){var D=e();if(A(D))return R(D);g=setTimeout(C,k(D))}o(C,"timerExpired");function R(D){return g=void 0,T&&f?S(D):(f=d=void 0,m)}o(R,"trailingEdge");function I(){g!==void 0&&clearTimeout(g),v=0,f=y=d=g=void 0}o(I,"cancel");function L(){return g===void 0?m:R(e())}o(L,"flush");function E(){var D=e(),_=A(D);if(f=arguments,d=this,y=D,_){if(g===void 0)return w(y);if(b)return clearTimeout(g),g=setTimeout(C,u),S(y)}return g===void 0&&(g=setTimeout(C,u)),m}return o(E,"debounced"),E.cancel=I,E.flush=L,E}return o(s,"debounce"),CN=s,CN}function nze(t,e,r,n,i){var a=i*Math.PI/180,s=Math.cos(a)*(t-r)-Math.sin(a)*(e-n)+r,l=Math.sin(a)*(t-r)+Math.cos(a)*(e-n)+n;return{x:s,y:l}}function aze(t,e,r){if(r===0)return t;var n=(e.x1+e.x2)/2,i=(e.y1+e.y2)/2,a=e.w/e.h,s=1/a,l=nze(t.x,t.y,n,i,r),u=ize(l.x,l.y,n,i,a,s);return{x:u.x,y:u.y}}function gze(){return Zoe||(Zoe=1,(function(t,e){(function(){var r,n,i,a,s,l,u,h,f,d,p,m,g,y,v;i=Math.floor,d=Math.min,n=o(function(x,b){return xb?1:0},"defaultCmp"),f=o(function(x,b,T,S,w){var k;if(T==null&&(T=0),w==null&&(w=n),T<0)throw new Error("lo must be non-negative");for(S==null&&(S=x.length);TI;0<=I?R++:R--)C.push(R);return C}).apply(this).reverse(),A=[],S=0,w=k.length;SL;0<=L?++C:--C)E.push(s(x,T));return E},"nsmallest"),y=o(function(x,b,T,S){var w,k,A;for(S==null&&(S=n),w=x[T];T>b;){if(A=T-1>>1,k=x[A],S(w,k)<0){x[T]=k,T=A;continue}break}return x[T]=w},"_siftdown"),v=o(function(x,b,T){var S,w,k,A,C;for(T==null&&(T=n),w=x.length,C=b,k=x[b],S=2*b+1;S-1}return o(e,"listCacheHas"),tM=e,tM}function cVe(){if($le)return rM;$le=1;var t=mE();function e(r,n){var i=this.__data__,a=t(i,r);return a<0?(++this.size,i.push([r,n])):i[a][1]=n,this}return o(e,"listCacheSet"),rM=e,rM}function uVe(){if(zle)return nM;zle=1;var t=aVe(),e=sVe(),r=oVe(),n=lVe(),i=cVe();function a(s){var l=-1,u=s==null?0:s.length;for(this.clear();++l-1&&n%1==0&&n0;){var f=i.shift();e(f),a.add(f.id()),l&&n(i,a,f)}return t}function Yue(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:bUe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?E=_:L=_;while(Math.abs(D)>s&&++O=a?b(I,O):M===0?O:S(I,L,L+h)}o(w,"getTForX");var k=!1;function A(){k=!0,(t!==e||r!==n)&&T()}o(A,"precompute");var C=o(function(L){return k||A(),t===e&&r===n?L:L===0?0:L===1?1:v(w(L),e,n)},"f");C.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var R="generateBezier("+[t,e,r,n]+")";return C.toString=function(){return R},C}function Dce(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function Lce(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function jm(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=Lce(t,i),l=Lce(e,i);if(At(s)&&At(l))return Dce(a,s,l,r,n);if(An(s)&&An(l)){for(var u=[],h=0;h0?(m==="spring"&&g.push(s.duration),s.easingImpl=Vk[m].apply(null,g)):s.easingImpl=Vk[m]}var y=s.easingImpl,v;if(s.duration===0?v=1:v=(r-u)/s.duration,s.applying&&(v=s.progress),v<0?v=0:v>1&&(v=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var T={};X2(x.x,b.x)&&(T.x=jm(x.x,b.x,v,y)),X2(x.y,b.y)&&(T.y=jm(x.y,b.y,v,y)),t.position(T)}var S=s.startPan,w=s.pan,k=a.pan,A=w!=null&&n;A&&(X2(S.x,w.x)&&(k.x=jm(S.x,w.x,v,y)),X2(S.y,w.y)&&(k.y=jm(S.y,w.y,v,y)),t.emit("pan"));var C=s.startZoom,R=s.zoom,I=R!=null&&n;I&&(X2(C,R)&&(a.zoom=ox(a.minZoom,jm(C,R,v,y),a.maxZoom)),t.emit("zoom")),(A||I)&&t.emit("viewport");var L=s.style;if(L&&L.length>0&&i){for(var E=0;E=0;A--){var C=k[A];C()}k.splice(0,k.length)},"callbacks"),b=m.length-1;b>=0;b--){var T=m[b],S=T._private;if(S.stopped){m.splice(b,1),S.hooked=!1,S.playing=!1,S.started=!1,x(S.frames);continue}!S.playing&&!S.applying||(S.playing&&S.applying&&(S.applying=!1),S.started||IUe(f,T,t),MUe(f,T,t,d),S.applying&&(S.applying=!1),x(S.frames),S.step!=null&&S.step(t),T.completed()&&(m.splice(b,1),S.hooked=!1,S.playing=!1,S.started=!1,x(S.completes)),y=!0)}return!d&&m.length===0&&g.length===0&&n.push(f),y}o(i,"stepOne");for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function hhe(t){this.options=ir({},VUe,UUe,t)}function fhe(t){this.options=ir({},HUe,t)}function dhe(t){this.options=ir({},qUe,t)}function kE(t){this.options=ir({},WUe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),l=e.some(function(h){return h.data("id")===a}),u=e.some(function(h){return h.data("id")===s});return!l||!u});this.options.eles=this.options.eles.not(n)}function yhe(t){this.options=ir({},oHe,t)}function _I(t){this.options=ir({},lHe,t)}function vhe(t){this.options=ir({},cHe,t)}function xhe(t){this.options=ir({},uHe,t)}function bhe(t){this.options=t,this.notifications=0}function khe(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function LI(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(dHe(t,e,r,n,i),{cx:eI,cy:tI,radius:gp,startX:The,startY:whe,stopX:rI,stopY:nI,startAngle:Ic.ang+Math.PI/2*vp,endAngle:Yo.ang-Math.PI/2*vp,counterClockwise:qk})}function Ehe(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=Math.min(a,n/2,i/2);t.beginPath(),t.moveTo(e+s,r),t.lineTo(e+n-s,r),t.quadraticCurveTo(e+n,r,e+n,r+s),t.lineTo(e+n,r+i-s),t.quadraticCurveTo(e+n,r+i,e+n-s,r+i),t.lineTo(e+s,r+i),t.quadraticCurveTo(e,r+i,e,r+i-s),t.lineTo(e,r+s),t.quadraticCurveTo(e,r,e+s,r),t.closePath()}function Qce(t,e,r){var n=t.createShader(e);if(t.shaderSource(n,r),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error(t.getShaderInfoLog(n));return n}function rqe(t,e,r){var n=Qce(t,t.VERTEX_SHADER,e),i=Qce(t,t.FRAGMENT_SHADER,r),a=t.createProgram();if(t.attachShader(a,n),t.attachShader(a,i),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new Error("Could not initialize shaders");return a}function nqe(t,e,r){r===void 0&&(r=e);var n=t.makeOffscreenCanvas(e,r),i=n.context=n.getContext("2d");return n.clear=function(){return i.clearRect(0,0,n.width,n.height)},n.clear(),n}function MI(t){var e=t.pixelRatio,r=t.cy.zoom(),n=t.cy.pan();return{zoom:r*e,pan:{x:n.x*e,y:n.y*e}}}function iqe(t){var e=t.pixelRatio,r=t.cy.zoom();return r*e}function aqe(t,e,r,n,i){var a=n*r+e.x,s=i*r+e.y;return s=Math.round(t.canvasHeight-s),[a,s]}function sqe(t){return t.pstyle("background-fill").value!=="solid"||t.pstyle("background-image").strValue!=="none"?!1:t.pstyle("border-width").value===0||t.pstyle("border-opacity").value===0?!0:t.pstyle("border-style").value==="solid"}function oqe(t,e){if(t.length!==e.length)return!1;for(var r=0;r>0&255)/255,r[1]=(t>>8&255)/255,r[2]=(t>>16&255)/255,r[3]=(t>>24&255)/255,r}function lqe(t){return t[0]+(t[1]<<8)+(t[2]<<16)+(t[3]<<24)}function cqe(t,e){var r=t.createTexture();return r.buffer=function(n){t.bindTexture(t.TEXTURE_2D,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_NEAREST),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,n),t.generateMipmap(t.TEXTURE_2D),t.bindTexture(t.TEXTURE_2D,null)},r.deleteTexture=function(){t.deleteTexture(r)},r}function Bhe(t,e){switch(e){case"float":return[1,t.FLOAT,4];case"vec2":return[2,t.FLOAT,4];case"vec3":return[3,t.FLOAT,4];case"vec4":return[4,t.FLOAT,4];case"int":return[1,t.INT,4];case"ivec2":return[2,t.INT,4]}}function Fhe(t,e,r){switch(e){case t.FLOAT:return new Float32Array(r);case t.INT:return new Int32Array(r)}}function uqe(t,e,r,n,i,a){switch(e){case t.FLOAT:return new Float32Array(r.buffer,a*n,i);case t.INT:return new Int32Array(r.buffer,a*n,i)}}function hqe(t,e,r,n){var i=Bhe(t,e),a=_i(i,2),s=a[0],l=a[1],u=Fhe(t,l,n),h=t.createBuffer();return t.bindBuffer(t.ARRAY_BUFFER,h),t.bufferData(t.ARRAY_BUFFER,u,t.STATIC_DRAW),l===t.FLOAT?t.vertexAttribPointer(r,s,l,!1,0,0):l===t.INT&&t.vertexAttribIPointer(r,s,l,0,0),t.enableVertexAttribArray(r),t.bindBuffer(t.ARRAY_BUFFER,null),h}function Mc(t,e,r,n){var i=Bhe(t,r),a=_i(i,3),s=a[0],l=a[1],u=a[2],h=Fhe(t,l,e*s),f=s*u,d=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,d),t.bufferData(t.ARRAY_BUFFER,e*f,t.DYNAMIC_DRAW),t.enableVertexAttribArray(n),l===t.FLOAT?t.vertexAttribPointer(n,s,l,!1,f,0):l===t.INT&&t.vertexAttribIPointer(n,s,l,f,0),t.vertexAttribDivisor(n,1),t.bindBuffer(t.ARRAY_BUFFER,null);for(var p=new Array(e),m=0;mNhe?(_qe(t),e.call(t,a)):(Dqe(t),Vhe(t,a,nx.SCREEN)))}}{var r=t.matchCanvasSize;t.matchCanvasSize=function(a){r.call(t,a),t.pickingFrameBuffer.setFramebufferAttachmentSizes(t.canvasWidth,t.canvasHeight),t.pickingFrameBuffer.needsDraw=!0}}t.findNearestElements=function(a,s,l,u){return Oqe(t,a,s)};{var n=t.invalidateCachedZSortedEles;t.invalidateCachedZSortedEles=function(){n.call(t),t.pickingFrameBuffer.needsDraw=!0}}{var i=t.notify;t.notify=function(a,s){i.call(t,a,s),a==="viewport"||a==="bounds"?t.pickingFrameBuffer.needsDraw=!0:a==="background"&&t.drawing.invalidate(s,{type:"node-body"})}}}function _qe(t){var e=t.data.contexts[t.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function Dqe(t){var e=o(function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.canvasWidth,t.canvasHeight),n.restore()},"clear");e(t.data.contexts[t.NODE]),e(t.data.contexts[t.DRAG])}function Lqe(t){var e=t.canvasWidth,r=t.canvasHeight,n=MI(t),i=n.pan,a=n.zoom,s=BM();Yk(s,s,[i.x,i.y]),aI(s,s,[a,a]);var l=BM();mqe(l,e,r);var u=BM();return pqe(u,l,s),u}function Ghe(t,e){var r=t.canvasWidth,n=t.canvasHeight,i=MI(t),a=i.pan,s=i.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,r,n),e.translate(a.x,a.y),e.scale(s,s)}function Rqe(t,e){t.drawSelectionRectangle(e,function(r){return Ghe(t,r)})}function Nqe(t){var e=t.data.contexts[t.NODE];e.save(),Ghe(t,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function Mqe(t){var e=o(function(i,a,s){for(var l=i.atlasManager.getAtlasCollection(a),u=t.data.contexts[t.NODE],h=l.atlases,f=0;f=0&&S.add(A)}return S}function Oqe(t,e,r){var n=Iqe(t,e,r),i=t.getCachedZSortedEles(),a,s,l=qs(n),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,f=i[h];if(!a&&f.isNode()&&(a=f),!s&&f.isEdge()&&(s=f),a&&s)break}}catch(d){l.e(d)}finally{l.f()}return[a,s].filter(Boolean)}function VM(t,e,r){var n=t.drawing;e+=1,r.isNode()?(n.drawNode(r,e,"node-underlay"),n.drawNode(r,e,"node-body"),n.drawTexture(r,e,"label"),n.drawNode(r,e,"node-overlay")):(n.drawEdgeLine(r,e),n.drawEdgeArrow(r,e,"source"),n.drawEdgeArrow(r,e,"target"),n.drawTexture(r,e,"label"),n.drawTexture(r,e,"edge-source-label"),n.drawTexture(r,e,"edge-target-label"))}function Vhe(t,e,r){var n;t.webglDebug&&(n=performance.now());var i=t.drawing,a=0;if(r.screen&&t.data.canvasNeedsRedraw[t.SELECT_BOX]&&Rqe(t,e),t.data.canvasNeedsRedraw[t.NODE]||r.picking){var s=t.data.contexts[t.WEBGL];r.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var l=Lqe(t),u=t.getCachedZSortedEles();if(a=u.length,i.startFrame(l,r),r.screen){for(var h=0;h{"use strict";o(UM,"_arrayLikeToArray");o(p$e,"_arrayWithHoles");o(m$e,"_arrayWithoutHoles");o(Af,"_classCallCheck");o(g$e,"_defineProperties");o(_f,"_createClass");o(qs,"_createForOfIteratorHelper");o(sue,"_defineProperty$1");o(y$e,"_iterableToArray");o(v$e,"_iterableToArrayLimit");o(x$e,"_nonIterableRest");o(b$e,"_nonIterableSpread");o(_i,"_slicedToArray");o(Xk,"_toConsumableArray");o(T$e,"_toPrimitive");o(oue,"_toPropertyKey");o($i,"_typeof");o(cI,"_unsupportedIterableToArray");Bi=typeof window>"u"?null:window,Noe=Bi?Bi.navigator:null;Bi&&Bi.document;w$e=$i(""),lue=$i({}),k$e=$i(function(){}),E$e=typeof HTMLElement>"u"?"undefined":$i(HTMLElement),px=o(function(e){return e&&e.instanceString&&oi(e.instanceString)?e.instanceString():null},"instanceStr"),Jt=o(function(e){return e!=null&&$i(e)==w$e},"string"),oi=o(function(e){return e!=null&&$i(e)===k$e},"fn"),An=o(function(e){return!fo(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),Yr=o(function(e){return e!=null&&$i(e)===lue&&!An(e)&&e.constructor===Object},"plainObject"),S$e=o(function(e){return e!=null&&$i(e)===lue},"object"),At=o(function(e){return e!=null&&$i(e)===$i(1)&&!isNaN(e)},"number"),C$e=o(function(e){return At(e)&&Math.floor(e)===e},"integer"),jk=o(function(e){if(E$e!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),fo=o(function(e){return mx(e)||cue(e)},"elementOrCollection"),mx=o(function(e){return px(e)==="collection"&&e._private.single},"element"),cue=o(function(e){return px(e)==="collection"&&!e._private.single},"collection"),uI=o(function(e){return px(e)==="core"},"core"),uue=o(function(e){return px(e)==="stylesheet"},"stylesheet"),A$e=o(function(e){return px(e)==="event"},"event"),Tf=o(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),_$e=o(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),D$e=o(function(e){return Yr(e)&&At(e.x1)&&At(e.x2)&&At(e.y1)&&At(e.y2)},"boundingBox"),L$e=o(function(e){return S$e(e)&&oi(e.then)},"promise"),R$e=o(function(){return Noe&&Noe.userAgent.match(/msie|trident|edge/i)},"ms"),lg=o(function(e,r){r||(r=o(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},"ascending"),F$e=o(function(e,r){return-1*fue(e,r)},"descending"),ir=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(v-=1),v<1/6?g+(y-g)*6*v:v<1/2?y:v<2/3?g+(y-g)*(2/3-v)*6:g}o(f,"hue2rgb");var d=new RegExp("^"+I$e+"$").exec(e);if(d){if(n=parseInt(d[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(d[2]),i<0||i>100||(i=i/100,a=parseFloat(d[3]),a<0||a>100)||(a=a/100,s=d[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)l=u=h=Math.round(a*255);else{var p=a<.5?a*(1+i):a+i-a*i,m=2*a-p;l=Math.round(255*f(m,p,n+1/3)),u=Math.round(255*f(m,p,n)),h=Math.round(255*f(m,p,n-1/3))}r=[l,u,h,s]}return r},"hsl2tuple"),G$e=o(function(e){var r,n=new RegExp("^"+N$e+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var l=i[1]||i[2]||i[3],u=i[1]&&i[2]&&i[3];if(l&&!u)return;var h=n[4];if(h!==void 0){if(h=parseFloat(h),h<0||h>1)return;r.push(h)}}return r},"rgb2tuple"),V$e=o(function(e){return U$e[e.toLowerCase()]},"colorname2tuple"),due=o(function(e){return(An(e)?e:null)||V$e(e)||$$e(e)||G$e(e)||z$e(e)},"color2tuple"),U$e={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},pue=o(function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:yp,n=r,i;i=e.next(),!i.done;)n=n*vue+i.value|0;return n},"hashIterableInts"),ix=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:yp;return r*vue+e|0},"hashInt"),ax=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:eg;return(r<<5)+r+e|0},"hashIntAlt"),tze=o(function(e,r){return e*2097152+r},"combineHashes"),df=o(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),Sk=o(function(e,r){return[ix(e[0],r[0]),ax(e[1],r[1])]},"hashArrays"),Xoe=o(function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:o(function(){return i=0;i--)e[i]===r&&e.splice(i,1)},"removeFromArray"),mI=o(function(e){e.splice(0,e.length)},"clearArray"),hze=o(function(e,r){for(var n=0;n"u"?"undefined":$i(Set))!==dze?Set:pze,uE=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!uI(e)){Kn("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){Kn("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new hg,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,l=e.pan(),u=e.zoom();a.position={x:(s.x-l.x)/u,y:(s.y-l.y)/u}}var h=[];An(r.classes)?h=r.classes:Jt(r.classes)&&(h=r.classes.split(/\s+/));for(var f=0,d=h.length;f0;){var k=b.pop(),A=v(k),C=k.id();if(p[C]=A,A!==1/0)for(var R=k.neighborhood().intersect(g),I=0;I0)for(B.unshift(P);d[G];){var $=d[G];B.unshift($.edge),B.unshift($.node),F=$.node,G=F.id()}return l.spawn(B)},"pathTo")}},"dijkstra")},Tze={kruskal:o(function(e){e=e||function(T){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),l=n,u=o(function(S){for(var w=0;w0;){if(w(),A++,S===f){for(var C=[],R=a,I=f,L=x[I];C.unshift(R),L!=null&&C.unshift(L),R=v[I],R!=null;)I=R.id(),L=x[I];return{found:!0,distance:d[S],path:this.spawn(C),steps:A}}m[S]=!0;for(var E=T._private.edges,D=0;DL&&(g[I]=L,b[I]=R,T[I]=w),!a){var E=R*f+C;!a&&g[E]>L&&(g[E]=L,b[E]=C,T[E]=w)}}}for(var D=0;D1&&arguments[1]!==void 0?arguments[1]:s,pe=T(q),Be=[],Ye=pe;;){if(Ye==null)return r.spawn();var He=b(Ye),Le=He.edge,Ie=He.pred;if(Be.unshift(Ye[0]),Ye.same(Ve)&&Be.length>0)break;Le!=null&&Be.unshift(Le),Ye=Ie}return u.spawn(Be)},"pathTo"),k=0;k=0;f--){var d=h[f],p=d[1],m=d[2];(r[p]===l&&r[m]===u||r[p]===u&&r[m]===l)&&h.splice(f,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=Dze(a,e,r),n--}return r},"contractUntil"),Lze={kargerStein:o(function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(B){return B.isLoop()});var a=n.length,s=i.length,l=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),u=Math.floor(a/_ze);if(a<2){Kn("At least 2 nodes are required for Karger-Stein algorithm");return}for(var h=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var l=0,u=e.length-1;u>=0;u--){var h=e[u];s?isFinite(h)||(e[u]=-1/0,l++):e.splice(u,1)}a&&e.sort(function(p,m){return p-m});var f=e.length,d=Math.floor(f/2);return f%2!==0?e[d+1+l]:(e[d-1+l]+e[d+l])/2},"median"),Pze=o(function(e){return Math.PI*e/180},"deg2rad"),Ck=o(function(e,r){return Math.atan2(r,e)-Math.PI/2},"getAngleFromDisp"),gI=Math.log2||function(t){return Math.log(t)/Math.log(2)},yI=o(function(e){return e>0?1:e<0?-1:0},"signum"),Tp=o(function(e,r){return Math.sqrt(mp(e,r))},"dist"),mp=o(function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},"sqdist"),Bze=o(function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),$ze=o(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),zze=o(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),Gze=o(function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},"updateBoundingBox"),Cue=o(function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),Fk=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),$k=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var l=_i(r,4);n=l[0],i=l[1],a=l[2],s=l[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),ele=o(function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),vI=o(function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},"boundingBoxesIntersect"),yf=o(function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},"inBoundingBox"),tle=o(function(e,r){return yf(e,r.x,r.y)},"pointInBoundingBox"),Aue=o(function(e,r){return yf(e,r.x1,r.y1)&&yf(e,r.x2,r.y2)},"boundingBoxInBoundingBox"),Vze=(LN=Math.hypot)!==null&&LN!==void 0?LN:function(t,e){return Math.sqrt(t*t+e*e)};o(Uze,"inflatePolygon");o(Hze,"miterBox");_ue=o(function(e,r,n,i,a,s,l){var u=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",h=u==="auto"?kf(a,s):u,f=a/2,d=s/2;h=Math.min(h,f,d);var p=h!==f,m=h!==d,g;if(p){var y=n-f+h-l,v=i-d-l,x=n+f-h+l,b=v;if(g=vf(e,r,n,i,y,v,x,b,!1),g.length>0)return g}if(m){var T=n+f+l,S=i-d+h-l,w=T,k=i+d-h+l;if(g=vf(e,r,n,i,T,S,w,k,!1),g.length>0)return g}if(p){var A=n-f+h-l,C=i+d+l,R=n+f-h+l,I=C;if(g=vf(e,r,n,i,A,C,R,I,!1),g.length>0)return g}if(m){var L=n-f-l,E=i-d+h-l,D=L,_=i+d-h+l;if(g=vf(e,r,n,i,L,E,D,_,!1),g.length>0)return g}var O;{var M=n-f+h,P=i-d+h;if(O=Z2(e,r,n,i,M,P,h+l),O.length>0&&O[0]<=M&&O[1]<=P)return[O[0],O[1]]}{var B=n+f-h,F=i-d+h;if(O=Z2(e,r,n,i,B,F,h+l),O.length>0&&O[0]>=B&&O[1]<=F)return[O[0],O[1]]}{var G=n+f-h,$=i+d-h;if(O=Z2(e,r,n,i,G,$,h+l),O.length>0&&O[0]>=G&&O[1]>=$)return[O[0],O[1]]}{var U=n-f+h,j=i+d-h;if(O=Z2(e,r,n,i,U,j,h+l),O.length>0&&O[0]<=U&&O[1]>=j)return[O[0],O[1]]}return[]},"roundRectangleIntersectLine"),qze=o(function(e,r,n,i,a,s,l){var u=l,h=Math.min(n,a),f=Math.max(n,a),d=Math.min(i,s),p=Math.max(i,s);return h-u<=e&&e<=f+u&&d-u<=r&&r<=p+u},"inLineVicinity"),Wze=o(function(e,r,n,i,a,s,l,u,h){var f={x1:Math.min(n,l,a)-h,x2:Math.max(n,l,a)+h,y1:Math.min(i,u,s)-h,y2:Math.max(i,u,s)+h};return!(ef.x2||rf.y2)},"inBezierVicinity"),Yze=o(function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),l=2*e,u=(-r+s)/l,h=(-r-s)/l;return[u,h]},"solveQuadratic"),Xze=o(function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var l,u,h,f,d,p,m,g;if(u=(3*n-r*r)/9,h=-(27*i)+r*(9*n-2*(r*r)),h/=54,l=u*u*u+h*h,a[1]=0,m=r/3,l>0){d=h+Math.sqrt(l),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),p=h-Math.sqrt(l),p=p<0?-Math.pow(-p,1/3):Math.pow(p,1/3),a[0]=-m+d+p,m+=(d+p)/2,a[4]=a[2]=-m,m=Math.sqrt(3)*(-p+d)/2,a[3]=m,a[5]=-m;return}if(a[5]=a[3]=0,l===0){g=h<0?-Math.pow(-h,1/3):Math.pow(h,1/3),a[0]=-m+2*g,a[4]=a[2]=-(g+m);return}u=-u,f=u*u*u,f=Math.acos(h/Math.sqrt(f)),g=2*Math.sqrt(u),a[0]=-m+g*Math.cos(f/3),a[2]=-m+g*Math.cos((f+2*Math.PI)/3),a[4]=-m+g*Math.cos((f+4*Math.PI)/3)},"solveCubic"),jze=o(function(e,r,n,i,a,s,l,u){var h=1*n*n-4*n*a+2*n*l+4*a*a-4*a*l+l*l+i*i-4*i*s+2*i*u+4*s*s-4*s*u+u*u,f=9*n*a-3*n*n-3*n*l-6*a*a+3*a*l+9*i*s-3*i*i-3*i*u-6*s*s+3*s*u,d=3*n*n-6*n*a+n*l-n*e+2*a*a+2*a*e-l*e+3*i*i-6*i*s+i*u-i*r+2*s*s+2*s*r-u*r,p=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,m=[];Xze(h,f,d,p,m);for(var g=1e-7,y=[],v=0;v<6;v+=2)Math.abs(m[v+1])=0&&m[v]<=1&&y.push(m[v]);y.push(1),y.push(0);for(var x=-1,b,T,S,w=0;w=0?Sh?(e-a)*(e-a)+(r-s)*(r-s):f-p},"sqdistToFiniteLine"),Hs=o(function(e,r,n){for(var i,a,s,l,u,h=0,f=0;f=e&&e>=s||i<=e&&e<=s)u=(e-i)/(s-i)*(l-a)+a,u>r&&h++;else continue;return h%2!==0},"pointInsidePolygonPoints"),Vu=o(function(e,r,n,i,a,s,l,u,h){var f=new Array(n.length),d;u[0]!=null?(d=Math.atan(u[1]/u[0]),u[0]<0?d=d+Math.PI/2:d=-d-Math.PI/2):d=u;for(var p=Math.cos(-d),m=Math.sin(-d),g=0;g0){var v=Jk(f,-h);y=Zk(v)}else y=f;return Hs(e,r,y)},"pointInsidePolygon"),Qze=o(function(e,r,n,i,a,s,l,u){for(var h=new Array(n.length*2),f=0;f=0&&v<=1&&b.push(v),x>=0&&x<=1&&b.push(x),b.length===0)return[];var T=b[0]*u[0]+e,S=b[0]*u[1]+r;if(b.length>1){if(b[0]==b[1])return[T,S];var w=b[1]*u[0]+e,k=b[1]*u[1]+r;return[T,S,w,k]}else return[T,S]},"intersectLineCircle"),RN=o(function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},"midOfThree"),vf=o(function(e,r,n,i,a,s,l,u,h){var f=e-a,d=n-e,p=l-a,m=r-s,g=i-r,y=u-s,v=p*m-y*f,x=d*m-g*f,b=y*d-p*g;if(b!==0){var T=v/b,S=x/b,w=.001,k=0-w,A=1+w;return k<=T&&T<=A&&k<=S&&S<=A?[e+T*d,r+T*g]:h?[e+T*d,r+T*g]:[]}else return v===0||x===0?RN(e,n,l)===l?[l,u]:RN(e,n,a)===a?[a,s]:RN(a,l,n)===n?[n,i]:[]:[]},"finiteLinesIntersect"),Jze=o(function(e,r,n,i,a){var s=[],l=i/2,u=a/2,h=r,f=n;s.push({x:h+l*e[0],y:f+u*e[1]});for(var d=1;d0){var y=Jk(d,-u);m=Zk(y)}else m=d}else m=n;for(var v,x,b,T,S=0;S2){for(var g=[f[0],f[1]],y=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),v=1;vf&&(f=S)},"set"),get:o(function(T){return h[T]},"get")},p=0;p0?O=_.edgesTo(D)[0]:O=D.edgesTo(_)[0];var M=i(O);D=D.id(),A[D]>A[L]+M&&(A[D]=A[L]+M,C.nodes.indexOf(D)<0?C.push(D):C.updateItem(D),k[D]=0,w[D]=[]),A[D]==A[L]+M&&(k[D]=k[D]+k[L],w[D].push(L))}else for(var P=0;P0;){for(var $=S.pop(),U=0;U0&&l.push(n[u]);l.length!==0&&a.push(i.collection(l))}return a},"assign"),pGe=o(function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:yGe,l=i,u,h,f=0;f=2?q2(e,r,n,0,sle,vGe):q2(e,r,n,0,ale)},"euclidean"),squaredEuclidean:o(function(e,r,n){return q2(e,r,n,0,sle)},"squaredEuclidean"),manhattan:o(function(e,r,n){return q2(e,r,n,0,ale)},"manhattan"),max:o(function(e,r,n){return q2(e,r,n,-1/0,xGe)},"max")};cg["squared-euclidean"]=cg.squaredEuclidean;cg.squaredeuclidean=cg.squaredEuclidean;o(fE,"clusteringDistance");bGe=xa({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),bI=o(function(e){return bGe(e)},"setOptions"),eE=o(function(e,r,n,i,a){var s=a!=="kMedoids",l=s?function(d){return n[d]}:function(d){return i[d](n)},u=o(function(p){return i[p](r)},"getQ"),h=n,f=r;return fE(e,i.length,l,u,h,f)},"getDist"),MN=o(function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),l=new Array(r),u=null,h=0;hn)return!1}return!0},"haveMatricesConverged"),kGe=o(function(e,r,n){for(var i=0;il&&(l=r[h][f],u=f);a[u].push(e[h])}for(var d=0;d=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],y=r[i[s]],v;a.mode==="dendrogram"?v={left:g,right:y,key:g.key}:v={value:g.value.concat(y.value),key:g.key},e[g.index]=v,e.splice(y.index,1),r[g.key]=v;for(var x=0;xn[y.key][b.key]&&(u=n[y.key][b.key])):a.linkage==="max"?(u=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},"findExemplars"),fle=o(function(e,r,n){for(var i=[],a=0;al&&(s=h,l=r[a*e+h])}s>0&&i.push(s)}for(var f=0;fh&&(u=f,h=d)}n[a]=s[u]}return i=fle(e,r,n),i},"assign"),dle=o(function(e){for(var r=this.cy(),n=this.nodes(),i=OGe(e),a={},s=0;s=L?(E=L,L=_,D=O):_>E&&(E=_);for(var M=0;M0?1:0;A[R%i.minIterations*l+U]=j,$+=j}if($>0&&(R>=i.minIterations-1||R==i.maxIterations-1)){for(var te=0,Y=0;Y1||k>1)&&(l=!0),d[T]=[],b.outgoers().forEach(function(C){C.isEdge()&&d[T].push(C.id())})}else p[T]=[void 0,b.target().id()]}):s.forEach(function(b){var T=b.id();if(b.isNode()){var S=b.degree(!0);S%2&&(u?h?l=!0:h=T:u=T),d[T]=[],b.connectedEdges().forEach(function(w){return d[T].push(w.id())})}else p[T]=[b.source().id(),b.target().id()]});var m={found:!1,trail:void 0};if(l)return m;if(h&&u)if(a){if(f&&h!=f)return m;f=h}else{if(f&&h!=f&&u!=f)return m;f||(f=h)}else f||(f=s[0].id());var g=o(function(T){for(var S=T,w=[T],k,A,C;d[S].length;)k=d[S].shift(),A=p[k][0],C=p[k][1],S!=C?(d[C]=d[C].filter(function(R){return R!=k}),S=C):!a&&S!=A&&(d[A]=d[A].filter(function(R){return R!=k}),S=A),w.unshift(k),w.unshift(S);return w},"walk"),y=[],v=[];for(v=g(f);v.length!=1;)d[v[0]].length==0?(y.unshift(s.getElementById(v.shift())),y.unshift(s.getElementById(v.shift()))):v=g(v.shift()).concat(v);y.unshift(s.getElementById(v.shift()));for(var x in d)if(d[x].length)return m;return m.found=!0,m.trail=this.spawn(y,!0),m},"hierholzer")},_k=o(function(){var e=this,r={},n=0,i=0,a=[],s=[],l={},u=o(function(p,m){for(var g=s.length-1,y=[],v=e.spawn();s[g].x!=p||s[g].y!=m;)y.push(s.pop().edge),g--;y.push(s.pop().edge),y.forEach(function(x){var b=x.connectedNodes().intersection(e);v.merge(x),b.forEach(function(T){var S=T.id(),w=T.connectedEdges().intersection(e);v.merge(T),r[S].cutVertex?v.merge(w.filter(function(k){return k.isLoop()})):v.merge(w)})}),a.push(v)},"buildComponent"),h=o(function(p,m,g){p===g&&(i+=1),r[m]={id:n,low:n++,cutVertex:!1};var y=e.getElementById(m).connectedEdges().intersection(e);if(y.size()===0)a.push(e.spawn(e.getElementById(m)));else{var v,x,b,T;y.forEach(function(S){v=S.source().id(),x=S.target().id(),b=v===m?x:v,b!==g&&(T=S.id(),l[T]||(l[T]=!0,s.push({x:m,y:b,edge:S})),b in r?r[m].low=Math.min(r[m].low,r[b].id):(h(p,b,m),r[m].low=Math.min(r[m].low,r[b].low),r[m].id<=r[b].low&&(r[m].cutVertex=!0,u(m,b))))})}},"biconnectedSearch");e.forEach(function(d){if(d.isNode()){var p=d.id();p in r||(i=0,h(p,p),r[p].cutVertex=i>1)}});var f=Object.keys(r).filter(function(d){return r[d].cutVertex}).map(function(d){return e.getElementById(d)});return{cut:e.spawn(f),components:a}},"hopcroftTarjanBiconnected"),UGe={hopcroftTarjanBiconnected:_k,htbc:_k,htb:_k,hopcroftTarjanBiconnectedComponents:_k},Dk=o(function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),l=o(function(h){a.push(h),r[h]={index:n,low:n++,explored:!1};var f=e.getElementById(h).connectedEdges().intersection(e);if(f.forEach(function(y){var v=y.target().id();v!==h&&(v in r||l(v),r[v].explored||(r[h].low=Math.min(r[h].low,r[v].low)))}),r[h].index===r[h].low){for(var d=e.spawn();;){var p=a.pop();if(d.merge(e.getElementById(p)),r[p].low=r[h].index,r[p].explored=!0,p===h)break}var m=d.edgesWith(d),g=d.merge(m);i.push(g),s=s.difference(g)}},"stronglyConnectedSearch");return e.forEach(function(u){if(u.isNode()){var h=u.id();h in r||l(h)}}),{cut:s,components:i}},"tarjanStronglyConnected"),HGe={tarjanStronglyConnected:Dk,tsc:Dk,tscc:Dk,tarjanStronglyConnectedComponents:Dk},Oue={};[sx,bze,Tze,kze,Sze,Aze,Lze,nGe,ag,sg,WM,gGe,DGe,MGe,zGe,VGe,UGe,HGe].forEach(function(t){ir(Oue,t)});Pue=0,Bue=1,Fue=2,Il=o(function(e){if(!(this instanceof Il))return new Il(e);this.id="Thenable/1.0.7",this.state=Pue,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");Il.prototype={fulfill:o(function(e){return ple(this,Bue,"fulfillValue",e)},"fulfill"),reject:o(function(e){return ple(this,Fue,"rejectReason",e)},"reject"),then:o(function(e,r){var n=this,i=new Il;return n.onFulfilled.push(gle(e,i,"fulfill")),n.onRejected.push(gle(r,i,"reject")),$ue(n),i.proxy},"then")};ple=o(function(e,r,n,i){return e.state===Pue&&(e.state=r,e[n]=i,$ue(e)),e},"deliver"),$ue=o(function(e){e.state===Bue?mle(e,"onFulfilled",e.fulfillValue):e.state===Fue&&mle(e,"onRejected",e.rejectReason)},"execute"),mle=o(function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=o(function(){for(var l=0;l0},"animatedImpl")},"animated"),clearQueue:o(function(){return o(function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},"classes"),addClass:o(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:o(function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},"hasClass"),toggleClass:o(function(e,r){An(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,l=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},"toggleClass"),removeClass:o(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:o(function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n},"flashClass")};zk.className=zk.classNames=zk.classes;Wr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:Fi,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Wr.variable="(?:[\\w-.]|(?:\\\\"+Wr.metaChar+"))+";Wr.className="(?:[\\w-]|(?:\\\\"+Wr.metaChar+"))+";Wr.value=Wr.string+"|"+Wr.number;Wr.id=Wr.variable;(function(){var t,e,r;for(t=Wr.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(Wr.comparatorOp+="|\\!"+e)})();xn=o(function(){return{checks:[]}},"newQuery"),zt={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},KM=[{selector:":selected",matches:o(function(e){return e.selected()},"matches")},{selector:":unselected",matches:o(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:o(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:o(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:o(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:o(function(e){return!e.locked()},"matches")},{selector:":visible",matches:o(function(e){return e.visible()},"matches")},{selector:":hidden",matches:o(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:o(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:o(function(e){return e.grabbed()},"matches")},{selector:":free",matches:o(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:o(function(e){return e.removed()},"matches")},{selector:":inside",matches:o(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:o(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:o(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:o(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:o(function(e){return!e.animated()},"matches")},{selector:":parent",matches:o(function(e){return e.isParent()},"matches")},{selector:":childless",matches:o(function(e){return e.isChildless()},"matches")},{selector:":child",matches:o(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:o(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:o(function(e){return e.isChild()},"matches")},{selector:":compound",matches:o(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:o(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:o(function(e){return e.isSimple()},"matches")},{selector:":active",matches:o(function(e){return e.active()},"matches")},{selector:":inactive",matches:o(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:o(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:o(function(e){return!e.backgrounding()},"matches")}].sort(function(t,e){return F$e(t.selector,e.selector)}),GVe=(function(){for(var t={},e,r=0;r0&&f.edgeCount>0)return hn("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return hn("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&hn("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),YVe=o(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=o(function(f){return f??""},"clean"),r=o(function(f){return Jt(f)?'"'+f+'"':e(f)},"cleanVal"),n=o(function(f){return" "+f+" "},"space"),i=o(function(f,d){var p=f.type,m=f.value;switch(p){case zt.GROUP:{var g=e(m);return g.substring(0,g.length-1)}case zt.DATA_COMPARE:{var y=f.field,v=f.operator;return"["+y+n(e(v))+r(m)+"]"}case zt.DATA_BOOL:{var x=f.operator,b=f.field;return"["+e(x)+b+"]"}case zt.DATA_EXIST:{var T=f.field;return"["+T+"]"}case zt.META_COMPARE:{var S=f.operator,w=f.field;return"[["+w+n(e(S))+r(m)+"]]"}case zt.STATE:return m;case zt.ID:return"#"+m;case zt.CLASS:return"."+m;case zt.PARENT:case zt.CHILD:return a(f.parent,d)+n(">")+a(f.child,d);case zt.ANCESTOR:case zt.DESCENDANT:return a(f.ancestor,d)+" "+a(f.descendant,d);case zt.COMPOUND_SPLIT:{var k=a(f.left,d),A=a(f.subject,d),C=a(f.right,d);return k+(k.length>0?" ":"")+A+C}case zt.TRUE:return""}},"checkToString"),a=o(function(f,d){return f.checks.reduce(function(p,m,g){return p+(d===f&&g===0?"$":"")+i(m,d)},"")},"queryToString"),s="",l=0;l1&&l=0&&(r=r.replace("!",""),d=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),f=!0),(a||l||f)&&(u=!a&&!s?"":""+e,h=""+n),f&&(e=u=u.toLowerCase(),n=h=h.toLowerCase()),r){case"*=":i=u.indexOf(h)>=0;break;case"$=":i=u.indexOf(h,u.length-h.length)>=0;break;case"^=":i=u.indexOf(h)===0;break;case"=":i=e===n;break;case">":p=!0,i=e>n;break;case">=":p=!0,i=e>=n;break;case"<":p=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return EI(this,t,e,Yue)};o(Xue,"addParent");ug.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return EI(this,t,e,Xue)};o(tUe,"addParentAndChildren");ug.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return EI(this,t,e,tUe)};ug.ancestors=ug.parents;cx=jue={data:un.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:un.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:un.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:un.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:un.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:un.removeData({field:"rscratch",triggerEvent:!1}),id:o(function(){var e=this[0];if(e)return e._private.data.id},"id")};cx.attr=cx.data;cx.removeAttr=cx.removeData;rUe=jue,yE={};o(RM,"defineDegreeFunction");ir(yE,{degree:RM(function(t,e){return e.source().same(e.target())?2:1}),indegree:RM(function(t,e){return e.target().same(t)?1:0}),outdegree:RM(function(t,e){return e.source().same(t)?1:0})});o(Xm,"defineDegreeBoundsFunction");ir(yE,{minDegree:Xm("degree",function(t,e){return te}),minIndegree:Xm("indegree",function(t,e){return te}),minOutdegree:Xm("outdegree",function(t,e){return te})});ir(yE,{totalDegree:o(function(e){for(var r=0,n=this.nodes(),i=0;i0,p=d;d&&(f=f[0]);var m=p?f.position():{x:0,y:0};r!==void 0?h.position(e,r+m[e]):a!==void 0&&h.position({x:a.x+m.x,y:a.y+m.y})}else{var g=n.position(),y=l?n.parent():null,v=y&&y.length>0,x=v;v&&(y=y[0]);var b=x?y.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this},"relativePosition")};Ml.modelPosition=Ml.point=Ml.position;Ml.modelPositions=Ml.points=Ml.positions;Ml.renderedPoint=Ml.renderedPosition;Ml.relativePoint=Ml.relativePosition;nUe=Kue;og=Df={};Df.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,l=e.y1*n+i.y,u=e.y2*n+i.y;return{x1:a,x2:s,y1:l,y2:u,w:s-a,h:u-l}};Df.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};Df.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var l=s._private,u=s.children(),h=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},d=u.boundingBox({includeLabels:h,includeOverlays:!1,useCache:!1}),p=l.position;(d.w===0||d.h===0)&&(d={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},d.x1=p.x-d.w/2,d.x2=p.x+d.w/2,d.y1=p.y-d.h/2,d.y2=p.y+d.h/2);function m(R,I,L){var E=0,D=0,_=I+L;return R>0&&_>0&&(E=I/_*R,D=L/_*R),{biasDiff:E,biasComplementDiff:D}}o(m,"computeBiasValues");function g(R,I,L,E){if(L.units==="%")switch(E){case"width":return R>0?L.pfValue*R:0;case"height":return I>0?L.pfValue*I:0;case"average":return R>0&&I>0?L.pfValue*(R+I)/2:0;case"min":return R>0&&I>0?R>I?L.pfValue*I:L.pfValue*R:0;case"max":return R>0&&I>0?R>I?L.pfValue*R:L.pfValue*I:0;default:return 0}else return L.units==="px"?L.pfValue:0}o(g,"computePaddingValues");var y=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(y=y*100/f.width.val);var v=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(v=v*100/f.width.val);var x=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(x=x*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var T=m(f.width.val-d.w,y,v),S=T.biasDiff,w=T.biasComplementDiff,k=m(f.height.val-d.h,x,b),A=k.biasDiff,C=k.biasComplementDiff;l.autoPadding=g(d.w,d.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),l.autoWidth=Math.max(d.w,f.width.val),p.x=(-S+d.x1+d.x2+w)/2,l.autoHeight=Math.max(d.h,f.height.val),p.y=(-A+d.y1+d.y2+C)/2}o(r,"update");for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),mf=o(function(e,r){return r==null?e:Nl(e,r.x1,r.y1,r.x2,r.y2)},"updateBoundsFromBox"),W2=o(function(e,r,n){return Us(e,r,n)},"prefixedProperty"),Lk=o(function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,l=r.pstyle(n+"-arrow-shape").value,u,h;if(l!=="none"){n==="source"?(u=a.srcX,h=a.srcY):n==="target"?(u=a.tgtX,h=a.tgtY):(u=a.midX,h=a.midY);var f=i.arrowBounds=i.arrowBounds||{},d=f[n]=f[n]||{};d.x1=u-s,d.y1=h-s,d.x2=u+s,d.y2=h+s,d.w=d.x2-d.x1,d.h=d.y2-d.y1,Fk(d,1),Nl(e,d.x1,d.y1,d.x2,d.y2)}}},"updateBoundsFromArrow"),NM=o(function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,l=r.pstyle(i+"label").strValue;if(l){var u=r.pstyle("text-halign"),h=r.pstyle("text-valign"),f=W2(s,"labelWidth",n),d=W2(s,"labelHeight",n),p=W2(s,"labelX",n),m=W2(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,y=r.pstyle(i+"text-margin-y").pfValue,v=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,T=r.pstyle("text-border-width").pfValue,S=T/2,w=r.pstyle("text-background-padding").pfValue,k=2,A=d,C=f,R=C/2,I=A/2,L,E,D,_;if(v)L=p-R,E=p+R,D=m-I,_=m+I;else{switch(u.value){case"left":L=p-C,E=p;break;case"center":L=p-R,E=p+R;break;case"right":L=p,E=p+C;break}switch(h.value){case"top":D=m-A,_=m;break;case"center":D=m-I,_=m+I;break;case"bottom":D=m,_=m+A;break}}var O=g-Math.max(b,S)-w-k,M=g+Math.max(b,S)+w+k,P=y-Math.max(b,S)-w-k,B=y+Math.max(b,S)+w+k;L+=O,E+=M,D+=P,_+=B;var F=n||"main",G=a.labelBounds,$=G[F]=G[F]||{};$.x1=L,$.y1=D,$.x2=E,$.y2=_,$.w=E-L,$.h=_-D,$.leftPad=O,$.rightPad=M,$.topPad=P,$.botPad=B;var U=v&&x.strValue==="autorotate",j=x.pfValue!=null&&x.pfValue!==0;if(U||j){var te=U?W2(a.rstyle,"labelAngle",n):x.pfValue,Y=Math.cos(te),oe=Math.sin(te),J=(L+E)/2,ue=(D+_)/2;if(!v){switch(u.value){case"left":J=E;break;case"right":J=L;break}switch(h.value){case"top":ue=_;break;case"bottom":ue=D;break}}var re=o(function(Te,q){return Te=Te-J,q=q-ue,{x:Te*Y-q*oe+J,y:Te*oe+q*Y+ue}},"rotate"),ee=re(L,D),Z=re(L,_),K=re(E,D),ae=re(E,_);L=Math.min(ee.x,Z.x,K.x,ae.x),E=Math.max(ee.x,Z.x,K.x,ae.x),D=Math.min(ee.y,Z.y,K.y,ae.y),_=Math.max(ee.y,Z.y,K.y,ae.y)}var Q=F+"Rot",de=G[Q]=G[Q]||{};de.x1=L,de.y1=D,de.x2=E,de.y2=_,de.w=E-L,de.h=_-D,Nl(e,L,D,E,_),Nl(a.labelBounds.all,L,D,E,_)}return e}},"updateBoundsFromLabel"),mce=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value,a=r.pstyle("outline-offset").value,s=i+a;Zue(e,r,n,s,"outside",s/2)}},"updateBoundsFromOutline"),Zue=o(function(e,r,n,i,a,s){if(!(n===0||i<=0||a==="inside")){var l=r.cy(),u=r.pstyle("shape").value,h=l.renderer().nodeShapes[u],f=r.position(),d=f.x,p=f.y,m=r.width(),g=r.height();if(h.hasMiterBounds){a==="center"&&(i/=2);var y=h.miterBounds(d,p,m,g,i);mf(e,y)}else s!=null&&s>0&&$k(e,[s,s,s,s])}},"updateBoundsFromMiter"),iUe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("border-opacity").value,i=r.pstyle("border-width").pfValue,a=r.pstyle("border-position").value;Zue(e,r,n,i,a)}},"updateBoundsFromMiterBorder"),aUe=o(function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=cs(),l=e._private,u=e.isNode(),h=e.isEdge(),f,d,p,m,g,y,v=l.rstyle,x=u&&i?e.pstyle("bounds-expansion").pfValue:[0],b=o(function(ne){return ne.pstyle("display").value!=="none"},"isDisplayed"),T=!i||b(e)&&(!h||b(e.source())&&b(e.target()));if(T){var S=0,w=0;i&&r.includeOverlays&&(S=e.pstyle("overlay-opacity").value,S!==0&&(w=e.pstyle("overlay-padding").value));var k=0,A=0;i&&r.includeUnderlays&&(k=e.pstyle("underlay-opacity").value,k!==0&&(A=e.pstyle("underlay-padding").value));var C=Math.max(w,A),R=0,I=0;if(i&&(R=e.pstyle("width").pfValue,I=R/2),u&&r.includeNodes){var L=e.position();g=L.x,y=L.y;var E=e.outerWidth(),D=E/2,_=e.outerHeight(),O=_/2;f=g-D,d=g+D,p=y-O,m=y+O,Nl(s,f,p,d,m),i&&mce(s,e),i&&r.includeOutlines&&!a&&mce(s,e),i&&iUe(s,e)}else if(h&&r.includeEdges)if(i&&!a){var M=e.pstyle("curve-style").strValue;if(f=Math.min(v.srcX,v.midX,v.tgtX),d=Math.max(v.srcX,v.midX,v.tgtX),p=Math.min(v.srcY,v.midY,v.tgtY),m=Math.max(v.srcY,v.midY,v.tgtY),f-=I,d+=I,p-=I,m+=I,Nl(s,f,p,d,m),M==="haystack"){var P=v.haystackPts;if(P&&P.length===2){if(f=P[0].x,p=P[0].y,d=P[1].x,m=P[1].y,f>d){var B=f;f=d,d=B}if(p>m){var F=p;p=m,m=F}Nl(s,f-I,p-I,d+I,m+I)}}else if(M==="bezier"||M==="unbundled-bezier"||gf(M,"segments")||gf(M,"taxi")){var G;switch(M){case"bezier":case"unbundled-bezier":G=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":G=v.linePts;break}if(G!=null)for(var $=0;$d){var J=f;f=d,d=J}if(p>m){var ue=p;p=m,m=ue}f-=I,d+=I,p-=I,m+=I,Nl(s,f,p,d,m)}if(i&&r.includeEdges&&h&&(Lk(s,e,"mid-source"),Lk(s,e,"mid-target"),Lk(s,e,"source"),Lk(s,e,"target")),i){var re=e.pstyle("ghost").value==="yes";if(re){var ee=e.pstyle("ghost-offset-x").pfValue,Z=e.pstyle("ghost-offset-y").pfValue;Nl(s,s.x1+ee,s.y1+Z,s.x2+ee,s.y2+Z)}}var K=l.bodyBounds=l.bodyBounds||{};ele(K,s),$k(K,x),Fk(K,1),i&&(f=s.x1,d=s.x2,p=s.y1,m=s.y2,Nl(s,f-C,p-C,d+C,m+C));var ae=l.overlayBounds=l.overlayBounds||{};ele(ae,s),$k(ae,x),Fk(ae,1);var Q=l.labelBounds=l.labelBounds||{};Q.all!=null?zze(Q.all):Q.all=cs(),i&&r.includeLabels&&(r.includeMainLabels&&NM(s,e,null),h&&(r.includeSourceLabels&&NM(s,e,"source"),r.includeTargetLabels&&NM(s,e,"target")))}return s.x1=Xo(s.x1),s.y1=Xo(s.y1),s.x2=Xo(s.x2),s.y2=Xo(s.y2),s.w=Xo(s.x2-s.x1),s.h=Xo(s.y2-s.y1),s.w>0&&s.h>0&&T&&($k(s,x),Fk(s,1)),s},"boundingBoxImpl"),Jue=o(function(e){var r=0,n=o(function(s){return(s?1:0)<=0;l--)s(l);return this};Cf.removeAllListeners=function(){return this.removeListener("*")};Cf.emit=Cf.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,An(e)||(e=[e]),TUe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var l=o(function(){var f=n[u];if(f.type===s.type&&(!f.namespace||f.namespace===s.namespace||f.namespace===xUe)&&a.eventMatches(a.context,f,s)){var d=[s];e!=null&&hze(d,e),a.beforeEmit(a.context,f,s),f.conf&&f.conf.one&&(a.listeners=a.listeners.filter(function(g){return g!==f}));var p=a.callbackContext(a.context,f,s),m=f.callback.apply(p,d);a.afterEmit(a.context,f,s),m===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),u=0;u1&&!s){var l=this.length-1,u=this[l],h=u._private.data.id;this[l]=void 0,this[e]=u,a.set(h,{ele:u,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:o(function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:o(function(e){var r=this._private.cy;if(!e)return this;if(e&&Jt(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},"unmergeBy"),map:o(function(e,r){for(var n=[],i=this,a=0;an&&(n=u,i=l)}return{value:n,ele:i}},"max"),min:o(function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":$i(Symbol))!=e&&$i(Symbol.iterator)!=e;r&&(tE[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return sue({next:o(function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,i.style().apply(n));var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},"numericStyle"),numericStyleUnits:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},"numericStyleUnits"),renderedStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},"renderedStyle"),style:o(function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(Yr(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(Jt(e))if(r===void 0){var l=this[0];return l?a.getStylePropertyValue(l,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var u=this[0];return u?a.getRawStyle(u):void 0}return this},"style"),removeStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(l[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:o(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:o(function(e){return this.neighborhood(e)},"openNeighborhood")});Ba.neighbourhood=Ba.neighborhood;Ba.closedNeighbourhood=Ba.closedNeighborhood;Ba.openNeighbourhood=Ba.openNeighborhood;ir(Ba,{source:jo(o(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"sourceImpl"),"source"),target:jo(o(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"targetImpl"),"target"),sources:Cce({attr:"source"}),targets:Cce({attr:"target"})});o(Cce,"defineSourceFunction");ir(Ba,{edgesWith:jo(Ace(),"edgesWith"),edgesTo:jo(Ace({thisIsSrc:!0}),"edgesTo")});o(Ace,"defineEdgesWithFunction");ir(Ba,{connectedEdges:jo(function(t){for(var e=[],r=this,n=0;n0);return s},"components"),component:o(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});Ba.componentsOf=Ba.components;va=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){Kn("A collection must have a reference to the core");return}var a=new zu,s=!1;if(!r)r=[];else if(r.length>0&&Yr(r[0])&&!mx(r[0])){s=!0;for(var l=[],u=new hg,h=0,f=r.length;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],l,u=0,h=r.length;u0){for(var F=l.length===r.length?r:new va(n,l),G=0;G0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(_){for(var O=_._private.edges,M=0;M0&&(t?L.emitAndNotify("remove"):e&&L.emit("remove"));for(var E=0;Ef&&Math.abs(g.v)>f;);return p?function(y){return u[y*(u.length-1)|0]}:h},"springRK4Factory")})(),In=o(function(e,r,n,i){var a=RUe(e,r,n,i);return function(s,l,u){return s+(l-s)*a(u)}},"cubicBezier"),Vk={linear:o(function(e,r,n){return e+(r-e)*n},"linear"),ease:In(.25,.1,.25,1),"ease-in":In(.42,0,1,1),"ease-out":In(0,0,.58,1),"ease-in-out":In(.42,0,.58,1),"ease-in-sine":In(.47,0,.745,.715),"ease-out-sine":In(.39,.575,.565,1),"ease-in-out-sine":In(.445,.05,.55,.95),"ease-in-quad":In(.55,.085,.68,.53),"ease-out-quad":In(.25,.46,.45,.94),"ease-in-out-quad":In(.455,.03,.515,.955),"ease-in-cubic":In(.55,.055,.675,.19),"ease-out-cubic":In(.215,.61,.355,1),"ease-in-out-cubic":In(.645,.045,.355,1),"ease-in-quart":In(.895,.03,.685,.22),"ease-out-quart":In(.165,.84,.44,1),"ease-in-out-quart":In(.77,0,.175,1),"ease-in-quint":In(.755,.05,.855,.06),"ease-out-quint":In(.23,1,.32,1),"ease-in-out-quint":In(.86,0,.07,1),"ease-in-expo":In(.95,.05,.795,.035),"ease-out-expo":In(.19,1,.22,1),"ease-in-out-expo":In(1,0,0,1),"ease-in-circ":In(.6,.04,.98,.335),"ease-out-circ":In(.075,.82,.165,1),"ease-in-out-circ":In(.785,.135,.15,.86),spring:o(function(e,r,n){if(n===0)return Vk.linear;var i=NUe(e,r,n);return function(a,s,l){return a+(s-a)*i(l)}},"spring"),"cubic-bezier":In};o(Dce,"getEasedValue");o(Lce,"getValue");o(jm,"ease");o(MUe,"step$1");o(X2,"valid");o(IUe,"startAnimation");o(Rce,"stepAll");OUe={animate:un.animate(),animation:un.animation(),animated:un.animated(),clearQueue:un.clearQueue(),delay:un.delay(),delayAnimation:un.delayAnimation(),stop:un.stop(),addToAnimationPool:o(function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:o(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:o(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&Kk(o(function(a){Rce(a,e),r()},"animationStep"))}o(r,"headlessStep");var n=e.renderer();n&&n.beforeRender?n.beforeRender(o(function(a,s){Rce(s,e)},"rendererAnimationStep"),n.beforeRenderPriorities.animations):r()},"startAnimationLoop")},PUe={qualifierCompare:o(function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},"qualifierCompare"),eventMatches:o(function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&mx(n.target)&&i.matches(n.target):!0},"eventMatches"),addEventFields:o(function(e,r){r.cy=e,r.target=e},"addEventFields"),callbackContext:o(function(e,r,n){return r.qualifier!=null?n.target:e},"callbackContext")},Mk=o(function(e){return Jt(e)?new Ef(e):e},"argSelector"),uhe={createEmitter:o(function(){var e=this._private;return e.emitter||(e.emitter=new vE(PUe,this)),this},"createEmitter"),emitter:o(function(){return this._private.emitter},"emitter"),on:o(function(e,r,n){return this.emitter().on(e,Mk(r),n),this},"on"),removeListener:o(function(e,r,n){return this.emitter().removeListener(e,Mk(r),n),this},"removeListener"),removeAllListeners:o(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:o(function(e,r,n){return this.emitter().one(e,Mk(r),n),this},"one"),once:o(function(e,r,n){return this.emitter().one(e,Mk(r),n),this},"once"),emit:o(function(e,r){return this.emitter().emit(e,r),this},"emit"),emitAndNotify:o(function(e,r){return this.emit(e),this.notify(e,r),this},"emitAndNotify")};un.eventAliasesOn(uhe);ZM={png:o(function(e){var r=this._private.renderer;return e=e||{},r.png(e)},"png"),jpg:o(function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)},"jpg")};ZM.jpeg=ZM.jpg;Uk={layout:o(function(e){var r=this;if(e==null){Kn("Layout options must be specified to make a layout");return}if(e.name==null){Kn("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){Kn("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;Jt(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(ir({},e,{cy:r,eles:a}));return s},"layout")};Uk.createLayout=Uk.makeLayout=Uk.layout;BUe={notify:o(function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},"notify"),notifications:o(function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},"notifications"),noNotifications:o(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:o(function(){return this._private.batchCount>0},"batching"),startBatch:o(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:o(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},"endBatch"),batch:o(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:o(function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},"destroyRenderer"),onRender:o(function(e){return this.on("render",e)},"onRender"),offRender:o(function(e){return this.off("render",e)},"offRender")};JM.invalidateDimensions=JM.resize;Hk={collection:o(function(e,r){return Jt(e)?this.$(e):fo(e)?e.collection():An(e)?(r||(r={}),new va(this,e,r.unique,r.removed)):new va(this)},"collection"),nodes:o(function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},"nodes"),edges:o(function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},"edges"),$:o(function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},"$"),mutableElements:o(function(){return this._private.elements},"mutableElements")};Hk.elements=Hk.filter=Hk.$;na={},tx="t",$Ue="f";na.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(p||d&&m){var g=void 0;p&&m||p?g=h.properties:m&&(g=h.mappedProperties);for(var y=0;y1&&(S=1),l.color){var k=n.valueMin[0],A=n.valueMax[0],C=n.valueMin[1],R=n.valueMax[1],I=n.valueMin[2],L=n.valueMax[2],E=n.valueMin[3]==null?1:n.valueMin[3],D=n.valueMax[3]==null?1:n.valueMax[3],_=[Math.round(k+(A-k)*S),Math.round(C+(R-C)*S),Math.round(I+(L-I)*S),Math.round(E+(D-E)*S)];a={bypass:n.bypass,name:n.name,value:_,strValue:"rgb("+_[0]+", "+_[1]+", "+_[2]+")"}}else if(l.number){var O=n.valueMin+(n.valueMax-n.valueMin)*S;a=this.parse(n.name,O,n.bypass,p)}else return!1;if(!a)return y(),!1;a.mapping=n,n=a;break}case s.data:{for(var M=n.field.split("."),P=d.data,B=0;B0&&a>0){for(var l={},u=!1,h=0;h0?t.delayAnimation(s).play().promise().then(T):T()}).then(function(){return t.animation({style:l,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};na.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],l=i(s);t.removed()||l!=null&&l(r,n,t)&&a(s)};na.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};na.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache()})};na.checkConnectedEdgesBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBoundsOfConnectedEdges},function(i){t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};na.checkParallelEdgesBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBoundsOfParallelEdges},function(i){t.parallelEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};na.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n),this.checkConnectedEdgesBoundsTrigger(t,e,r,n),this.checkParallelEdgesBoundsTrigger(t,e,r,n)};wx={};wx.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var l=0;li.length?n=n.substr(i.length):n=""}o(l,"removeSelAndBlockFromRemaining");function u(){a.length>s.length?a=a.substr(s.length):a=""}for(o(u,"removePropAndValFromRem");;){var h=n.match(/^\s*$/);if(h)break;var f=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){hn("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=f[0];var d=f[1];if(d!=="core"){var p=new Ef(d);if(p.invalid){hn("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),l();continue}}var m=f[2],g=!1;a=m;for(var y=[];;){var v=a.match(/^\s*$/);if(v)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){hn("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+m),g=!0;break}s=x[0];var b=x[1],T=x[2],S=e.properties[b];if(!S){hn("Skipping property: Invalid property name in: "+s),u();continue}var w=r.parse(b,T);if(!w){hn("Skipping property: Invalid property definition in: "+s),u();continue}y.push({name:b,val:T}),u()}if(g){l();break}r.selector(d);for(var k=0;k=7&&e[0]==="d"&&(f=new RegExp(l.data.regex).exec(e))){if(r)return!1;var p=l.data;return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(d=new RegExp(l.mapData.regex).exec(e))){if(r||h.multiple)return!1;var m=l.mapData;if(!(h.color||h.number))return!1;var g=this.parse(t,d[4]);if(!g||g.mapped)return!1;var y=this.parse(t,d[5]);if(!y||y.mapped)return!1;if(g.pfValue===y.pfValue||g.strValue===y.strValue)return hn("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(h.color){var v=g.value,x=y.value,b=v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2]&&(v[3]===x[3]||(v[3]==null||v[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:d,strValue:""+e,mapped:m,field:d[1],fieldMin:parseFloat(d[2]),fieldMax:parseFloat(d[3]),valueMin:g.value,valueMax:y.value,bypass:r}}}if(h.multiple&&n!=="multiple"){var T;if(u?T=e.split(/\s+/):An(e)?T=e:T=[e],h.evenMultiple&&T.length%2!==0)return null;for(var S=[],w=[],k=[],A="",C=!1,R=0;R0?" ":"")+I.strValue}return h.validate&&!h.validate(S,w)?null:h.singleEnum&&C?S.length===1&&Jt(S[0])?{name:t,value:S[0],strValue:S[0],bypass:r}:null:{name:t,value:S,pfValue:k,strValue:A,bypass:r,units:w}}var L=o(function(){for(var re=0;reh.max||h.strictMax&&e===h.max))return null;var M={name:t,value:e,strValue:""+e+(E||""),units:E,bypass:r};return h.unitless||E!=="px"&&E!=="em"?M.pfValue=e:M.pfValue=E==="px"||!E?e:this.getEmSizeInPixels()*e,(E==="ms"||E==="s")&&(M.pfValue=E==="ms"?e:1e3*e),(E==="deg"||E==="rad")&&(M.pfValue=E==="rad"?e:Pze(e)),E==="%"&&(M.pfValue=e/100),M}else if(h.propList){var P=[],B=""+e;if(B!=="none"){for(var F=B.split(/\s*,\s*|\s+/),G=0;G0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){u=Math.min((s-2*r)/n.w,(l-2*r)/n.h),u=u>this._private.maxZoom?this._private.maxZoom:u,u=u=n.minZoom&&(n.maxZoom=r),this},"zoomRange"),minZoom:o(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:o(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:o(function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,l=!1;if(r.zoomingEnabled||(l=!0),At(e)?s=e:Yr(e)&&(s=e.level,e.position!=null?a=hE(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(l=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=u,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var h=e.pan;At(h.x)&&(r.pan.x=h.x,l=!1),At(h.y)&&(r.pan.y=h.y,l=!1),l||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},"viewport"),center:o(function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:o(function(e,r){if(this._private.panningEnabled){if(Jt(e)){var n=e;e=this.mutableElements().filter(n)}else fo(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var l={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return l}}},"getCenterPan"),reset:o(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:o(function(){this._private.sizeCache=null},"invalidateSize"),size:o(function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?(function(){var i=n.window().getComputedStyle(r),a=o(function(l){return parseFloat(i.getPropertyValue(l))},"val");return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}})():{width:1,height:1})},"size"),width:o(function(){return this.size().width},"width"),height:o(function(){return this.size().height},"height"),extent:o(function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},"extent"),renderedExtent:o(function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},"renderedExtent"),multiClickDebounceTime:o(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};kp.centre=kp.center;kp.autolockNodes=kp.autolock;kp.autoungrabifyNodes=kp.autoungrabify;hx={data:un.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:un.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:un.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:un.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};hx.attr=hx.data;hx.removeAttr=hx.removeData;fx=o(function(e){var r=this;e=ir({},e);var n=e.container;n&&!jk(n)&&jk(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=Bi!==void 0&&n!==void 0&&!e.headless,l=e;l.layout=ir({name:s?"grid":"null"},l.layout),l.renderer=ir({name:s?"canvas":"null"},l.renderer);var u=o(function(g,y,v){return y!==void 0?y:v!==void 0?v:g},"defVal"),h=this._private={container:n,ready:!1,options:l,elements:new va(this),listeners:[],aniEles:new va(this),data:l.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:u(!0,l.zoomingEnabled),userZoomingEnabled:u(!0,l.userZoomingEnabled),panningEnabled:u(!0,l.panningEnabled),userPanningEnabled:u(!0,l.userPanningEnabled),boxSelectionEnabled:u(!0,l.boxSelectionEnabled),autolock:u(!1,l.autolock,l.autolockNodes),autoungrabify:u(!1,l.autoungrabify,l.autoungrabifyNodes),autounselectify:u(!1,l.autounselectify),styleEnabled:l.styleEnabled===void 0?s:l.styleEnabled,zoom:At(l.zoom)?l.zoom:1,pan:{x:Yr(l.pan)&&At(l.pan.x)?l.pan.x:0,y:Yr(l.pan)&&At(l.pan.y)?l.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:u(250,l.multiClickDebounceTime)};this.createEmitter(),this.selectionType(l.selectionType),this.zoomRange({min:l.minZoom,max:l.maxZoom});var f=o(function(g,y){var v=g.some(L$e);if(v)return fg.all(g).then(y);y(g)},"loadExtData");h.styleEnabled&&r.setStyle([]);var d=ir({},l,l.renderer);r.initRenderer(d);var p=o(function(g,y,v){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(Yr(g)||An(g))&&r.add(g),r.one("layoutready",function(T){r.notifications(!0),r.emit(T),r.one("load",y),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",v),r.emit("done")});var b=ir({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()},"setElesAndLayout");f([l.style,l.elements],function(m){var g=m[0],y=m[1];h.styleEnabled&&r.style().append(g),p(y,function(){r.startAnimationLoop(),h.ready=!0,oi(l.ready)&&r.on("ready",l.ready);for(var v=0;v0,l=!!t.boundingBox,u=cs(l?t.boundingBox:structuredClone(e.extent())),h;if(fo(t.roots))h=t.roots;else if(An(t.roots)){for(var f=[],d=0;d0;){var _=D(),O=R(_,L);if(O)_.outgoers().filter(function(Ve){return Ve.isNode()&&r.has(Ve)}).forEach(E);else if(O===null){hn("Detected double maximal shift for node `"+_.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var M=0;if(t.avoidOverlap)for(var P=0;P0&&x[0].length<=3?Le/2:0),Ne=2*Math.PI/x[Ye].length*He;return Ye===0&&x[0].length===1&&(Ie=1),{x:K.x+Ie*Math.cos(Ne),y:K.y+Ie*Math.sin(Ne)}}else{var Ce=x[Ye].length,Fe=Math.max(Ce===1?0:l?(u.w-t.padding*2-ae.w)/((t.grid?de:Ce)-1):(u.w-t.padding*2-ae.w)/((t.grid?de:Ce)+1),M),fe={x:K.x+(He+1-(Ce+1)/2)*Fe,y:K.y+(Ye+1-(Y+1)/2)*Q};return fe}},"getPositionTopBottom"),Te={downward:0,leftward:90,upward:180,rightward:-90};Object.keys(Te).indexOf(t.direction)===-1&&Kn("Invalid direction '".concat(t.direction,"' specified for breadthfirst layout. Valid values are: ").concat(Object.keys(Te).join(", ")));var q=o(function(pe){return aze(ne(pe),u,Te[t.direction])},"getPosition");return r.nodes().layoutPositions(this,t,q),this};HUe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(fhe,"CircleLayout");fhe.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=cs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,h=u/Math.max(1,a.length-1),f,d=0,p=0;p1&&e.avoidOverlap){d*=1.75;var x=Math.cos(h)-Math.cos(0),b=Math.sin(h)-Math.sin(0),T=Math.sqrt(d*d/(x*x+b*b));f=Math.max(T,f)}var S=o(function(k,A){var C=e.startAngle+A*h*(i?1:-1),R=f*Math.cos(C),I=f*Math.sin(C),L={x:l.x+R,y:l.y+I};return L},"getPos");return n.nodes().layoutPositions(this,e,S),this};qUe={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:o(function(e){return e.degree()},"concentric"),levelWidth:o(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(dhe,"ConcentricLayout");dhe.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=cs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=[],h=0,f=0;f0){var w=Math.abs(b[0].value-S.value);w>=v&&(b=[],x.push(b))}b.push(S)}var k=h+e.minNodeSpacing;if(!e.avoidOverlap){var A=x.length>0&&x[0].length>1,C=Math.min(s.w,s.h)/2-k,R=C/(x.length+A?1:0);k=Math.min(k,R)}for(var I=0,L=0;L1&&e.avoidOverlap){var O=Math.cos(_)-Math.cos(0),M=Math.sin(_)-Math.sin(0),P=Math.sqrt(k*k/(O*O+M*M));I=Math.max(P,I)}E.r=I,I+=k}if(e.equidistant){for(var B=0,F=0,G=0;G=t.numIter||(ZUe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),Kk(f)}},"frame");f()}else{for(;h;)h=s(u),u++;Ice(n,t),l()}return this};kE.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};kE.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};YUe=o(function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=cs(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),l={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},u=n.eles.components(),h={},f=0;f0){l.graphSet.push(C);for(var f=0;fi.count?0:i.graph},"findLCA"),phe=o(function(e,r,n,i){var a=i.graphSet[n];if(-10)var d=i.nodeOverlap*f,p=Math.sqrt(l*l+u*u),m=d*l/p,g=d*u/p;else var y=nE(e,l,u),v=nE(r,-1*l,-1*u),x=v.x-y.x,b=v.y-y.y,T=x*x+b*b,p=Math.sqrt(T),d=(e.nodeRepulsion+r.nodeRepulsion)/T,m=d*x/p,g=d*b/p;e.isLocked||(e.offsetX-=m,e.offsetY-=g),r.isLocked||(r.offsetX+=m,r.offsetY+=g)}},"nodeRepulsion"),tHe=o(function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},"nodesOverlap"),nE=o(function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,l=e.width||1,u=n/r,h=s/l,f={};return r===0&&0n?(f.x=i,f.y=a+s/2,f):0r&&-1*h<=u&&u<=h?(f.x=i-l/2,f.y=a-l*n/2/r,f):0=h)?(f.x=i+s*r/2/n,f.y=a+s/2,f):(0>n&&(u<=-1*h||u>=h)&&(f.x=i-s*r/2/n,f.y=a-s/2),f)},"findClippingPoint"),rHe=o(function(e,r){for(var n=0;nn){var v=r.gravity*m/y,x=r.gravity*g/y;p.offsetX+=v,p.offsetY+=x}}}}},"calculateGravityForces"),iHe=o(function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],l=e.idToIndex[s],u=e.layoutNodes[l],h=u.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},"limitForce"),ghe=o(function(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=v+r.componentSpacing,m=0,y=0,v=0)}}},"separateComponents"),oHe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:o(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(yhe,"GridLayout");yhe.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=cs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(j){return{x:a.x1,y:a.y1}});else{var s=i.size(),l=Math.sqrt(s*a.h/a.w),u=Math.round(l),h=Math.round(a.w/a.h*l),f=o(function(te){if(te==null)return Math.min(u,h);var Y=Math.min(u,h);Y==u?u=te:h=te},"small"),d=o(function(te){if(te==null)return Math.max(u,h);var Y=Math.max(u,h);Y==u?u=te:h=te},"large"),p=e.rows,m=e.cols!=null?e.cols:e.columns;if(p!=null&&m!=null)u=p,h=m;else if(p!=null&&m==null)u=p,h=Math.ceil(s/u);else if(p==null&&m!=null)h=m,u=Math.ceil(s/h);else if(h*u>s){var g=f(),y=d();(g-1)*y>=s?f(g-1):(y-1)*g>=s&&d(y-1)}else for(;h*u=s?d(x+1):f(v+1)}var b=a.w/h,T=a.h/u;if(e.condense&&(b=0,T=0),e.avoidOverlap)for(var S=0;S=h&&(O=0,_++)},"moveToNextCell"),P={},B=0;B(O=Kze(t,e,M[P],M[P+1],M[P+2],M[P+3])))return v(A,O),!0}else if(R.edgeType==="bezier"||R.edgeType==="multibezier"||R.edgeType==="self"||R.edgeType==="compound"){for(var M=R.allpts,P=0;P+5(O=jze(t,e,M[P],M[P+1],M[P+2],M[P+3],M[P+4],M[P+5])))return v(A,O),!0}for(var B=B||C.source,F=F||C.target,G=i.getArrowWidth(I,L),$=[{name:"source",x:R.arrowStartX,y:R.arrowStartY,angle:R.srcArrowAngle},{name:"target",x:R.arrowEndX,y:R.arrowEndY,angle:R.tgtArrowAngle},{name:"mid-source",x:R.midX,y:R.midY,angle:R.midsrcArrowAngle},{name:"mid-target",x:R.midX,y:R.midY,angle:R.midtgtArrowAngle}],P=0;P<$.length;P++){var U=$[P],j=a.arrowShapes[A.pstyle(U.name+"-arrow-shape").value],te=A.pstyle("width").pfValue;if(j.roughCollide(t,e,G,U.angle,{x:U.x,y:U.y},te,f)&&j.collide(t,e,G,U.angle,{x:U.x,y:U.y},te,f))return v(A),!0}h&&l.length>0&&(x(B),x(F))}o(b,"checkEdge");function T(A,C,R){return Us(A,C,R)}o(T,"preprop");function S(A,C){var R=A._private,I=p,L;C?L=C+"-":L="",A.boundingBox();var E=R.labelBounds[C||"main"],D=A.pstyle(L+"label").value,_=A.pstyle("text-events").strValue==="yes";if(!(!_||!D)){var O=T(R.rscratch,"labelX",C),M=T(R.rscratch,"labelY",C),P=T(R.rscratch,"labelAngle",C),B=A.pstyle(L+"text-margin-x").pfValue,F=A.pstyle(L+"text-margin-y").pfValue,G=E.x1-I-B,$=E.x2+I-B,U=E.y1-I-F,j=E.y2+I-F;if(P){var te=Math.cos(P),Y=Math.sin(P),oe=o(function(ae,Q){return ae=ae-O,Q=Q-M,{x:ae*te-Q*Y+O,y:ae*Y+Q*te+M}},"rotate"),J=oe(G,U),ue=oe(G,j),re=oe($,U),ee=oe($,j),Z=[J.x+B,J.y+F,re.x+B,re.y+F,ee.x+B,ee.y+F,ue.x+B,ue.y+F];if(Hs(t,e,Z))return v(A),!0}else if(yf(E,t,e))return v(A),!0}}o(S,"checkLabel");for(var w=s.length-1;w>=0;w--){var k=s[w];k.isNode()?x(k)||S(k):b(k)||S(k)||S(k,"source")||S(k,"target")}return l};Sp.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=this.cy.zoom(),s=2/a,l=[],u=Math.min(t,r),h=Math.max(t,r),f=Math.min(e,n),d=Math.max(e,n);t=u,r=h,e=f,n=d;var p=cs({x1:t,y1:e,x2:r,y2:n}),m=[{x:p.x1,y:p.y1},{x:p.x2,y:p.y1},{x:p.x2,y:p.y2},{x:p.x1,y:p.y2}],g=[[m[0],m[1]],[m[1],m[2]],[m[2],m[3]],[m[3],m[0]]];function y(ae,Q,de){return Us(ae,Q,de)}o(y,"preprop");function v(ae,Q){var de=ae._private,ne=s,Te="";ae.boundingBox();var q=de.labelBounds.main;if(!q)return null;var Ve=y(de.rscratch,"labelX",Q),pe=y(de.rscratch,"labelY",Q),Be=y(de.rscratch,"labelAngle",Q),Ye=ae.pstyle(Te+"text-margin-x").pfValue,He=ae.pstyle(Te+"text-margin-y").pfValue,Le=q.x1-ne-Ye,Ie=q.x2+ne-Ye,Ne=q.y1-ne-He,Ce=q.y2+ne-He;if(Be){var Fe=Math.cos(Be),fe=Math.sin(Be),xe=o(function(he,z){return he=he-Ve,z=z-pe,{x:he*Fe-z*fe+Ve,y:he*fe+z*Fe+pe}},"rotate");return[xe(Le,Ne),xe(Ie,Ne),xe(Ie,Ce),xe(Le,Ce)]}else return[{x:Le,y:Ne},{x:Ie,y:Ne},{x:Ie,y:Ce},{x:Le,y:Ce}]}o(v,"getRotatedLabelBox");function x(ae,Q,de,ne){function Te(q,Ve,pe){return(pe.y-q.y)*(Ve.x-q.x)>(Ve.y-q.y)*(pe.x-q.x)}return o(Te,"ccw"),Te(ae,de,ne)!==Te(Q,de,ne)&&Te(ae,Q,de)!==Te(ae,Q,ne)}o(x,"doLinesIntersect");for(var b=0;b0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),dHe=o(function(e,r,n,i,a){if(e!==$ce?zce(r,e,Ic):fHe(Yo,Ic),zce(r,n,Yo),Bce=Ic.nx*Yo.ny-Ic.ny*Yo.nx,Fce=Ic.nx*Yo.nx-Ic.ny*-Yo.ny,Fu=Math.asin(Math.max(-1,Math.min(1,Bce))),Math.abs(Fu)<1e-6){eI=r.x,tI=r.y,gp=Qm=0;return}vp=1,qk=!1,Fce<0?Fu<0?Fu=Math.PI+Fu:(Fu=Math.PI-Fu,vp=-1,qk=!0):Fu>0&&(vp=-1,qk=!0),r.radius!==void 0?Qm=r.radius:Qm=i,fp=Fu/2,Ik=Math.min(Ic.len/2,Yo.len/2),a?(Nc=Math.abs(Math.cos(fp)*Qm/Math.sin(fp)),Nc>Ik?(Nc=Ik,gp=Math.abs(Nc*Math.sin(fp)/Math.cos(fp))):gp=Qm):(Nc=Math.min(Ik,Qm),gp=Math.abs(Nc*Math.sin(fp)/Math.cos(fp))),rI=r.x+Yo.nx*Nc,nI=r.y+Yo.ny*Nc,eI=rI-Yo.ny*gp*vp,tI=nI+Yo.nx*gp*vp,The=r.x+Ic.nx*Nc,whe=r.y+Ic.ny*Nc,$ce=r},"calcCornerArc");o(khe,"drawPreparedRoundCorner");o(LI,"getRoundCorner");dx=.01,pHe=Math.sqrt(2*dx),$a={};$a.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),l=t.pstyle("target-endpoint"),u=s.units!=null&&l.units!=null,h=o(function(w,k,A,C){var R=C-k,I=A-w,L=Math.sqrt(I*I+R*R);return{x:-R/L,y:I/L}},"recalcVectorNormInverse"),f=t.pstyle("edge-distances").value;switch(f){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(u){var d=this.manualEndptToPx(t.source()[0],s),p=_i(d,2),m=p[0],g=p[1],y=this.manualEndptToPx(t.target()[0],l),v=_i(y,2),x=v[0],b=v[1],T={x1:m,y1:g,x2:x,y2:b};i=h(m,g,x,b),a=T}else hn("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};$a.findHaystackPoints=function(t){for(var e=0;e0?Math.max(z-se,0):Math.min(z+se,0)},"subDWH"),D=E(I,C),_=E(L,R),O=!1;b===h?x=Math.abs(D)>Math.abs(_)?i:n:b===u||b===l?(x=n,O=!0):(b===a||b===s)&&(x=i,O=!0);var M=x===n,P=M?_:D,B=M?L:I,F=yI(B),G=!1;!(O&&(S||k))&&(b===l&&B<0||b===u&&B>0||b===a&&B>0||b===s&&B<0)&&(F*=-1,P=F*Math.abs(P),G=!0);var $;if(S){var U=w<0?1+w:w;$=U*P}else{var j=w<0?P:0;$=j+w*F}var te=o(function(z){return Math.abs(z)=Math.abs(P)},"getIsTooClose"),Y=te($),oe=te(Math.abs(P)-Math.abs($)),J=Y||oe;if(J&&!G)if(M){var ue=Math.abs(B)<=p/2,re=Math.abs(I)<=m/2;if(ue){var ee=(f.x1+f.x2)/2,Z=f.y1,K=f.y2;r.segpts=[ee,Z,ee,K]}else if(re){var ae=(f.y1+f.y2)/2,Q=f.x1,de=f.x2;r.segpts=[Q,ae,de,ae]}else r.segpts=[f.x1,f.y2]}else{var ne=Math.abs(B)<=d/2,Te=Math.abs(L)<=g/2;if(ne){var q=(f.y1+f.y2)/2,Ve=f.x1,pe=f.x2;r.segpts=[Ve,q,pe,q]}else if(Te){var Be=(f.x1+f.x2)/2,Ye=f.y1,He=f.y2;r.segpts=[Be,Ye,Be,He]}else r.segpts=[f.x2,f.y1]}else if(M){var Le=f.y1+$+(v?p/2*F:0),Ie=f.x1,Ne=f.x2;r.segpts=[Ie,Le,Ne,Le]}else{var Ce=f.x1+$+(v?d/2*F:0),Fe=f.y1,fe=f.y2;r.segpts=[Ce,Fe,Ce,fe]}if(r.isRound){var xe=t.pstyle("taxi-radius").value,W=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(xe),r.isArcRadius=new Array(r.segpts.length/2).fill(W)}};$a.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,l=e.tgtW,u=e.tgtH,h=e.srcShape,f=e.tgtShape,d=e.srcCornerRadius,p=e.tgtCornerRadius,m=e.srcRs,g=e.tgtRs,y=!At(r.startX)||!At(r.startY),v=!At(r.arrowStartX)||!At(r.arrowStartY),x=!At(r.endX)||!At(r.endY),b=!At(r.arrowEndX)||!At(r.arrowEndY),T=3,S=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,w=T*S,k=Tp({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),A=kB.poolIndex()){var F=P;P=B,B=F}var G=D.srcPos=P.position(),$=D.tgtPos=B.position(),U=D.srcW=P.outerWidth(),j=D.srcH=P.outerHeight(),te=D.tgtW=B.outerWidth(),Y=D.tgtH=B.outerHeight(),oe=D.srcShape=r.nodeShapes[e.getNodeShape(P)],J=D.tgtShape=r.nodeShapes[e.getNodeShape(B)],ue=D.srcCornerRadius=P.pstyle("corner-radius").value==="auto"?"auto":P.pstyle("corner-radius").pfValue,re=D.tgtCornerRadius=B.pstyle("corner-radius").value==="auto"?"auto":B.pstyle("corner-radius").pfValue,ee=D.tgtRs=B._private.rscratch,Z=D.srcRs=P._private.rscratch;D.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var K=0;K=pHe||(Ne=Math.sqrt(Math.max(Ie*Ie,dx)+Math.max(Le*Le,dx)));var Ce=D.vector={x:Ie,y:Le},Fe=D.vectorNorm={x:Ce.x/Ne,y:Ce.y/Ne},fe={x:-Fe.y,y:Fe.x};D.nodesOverlap=!At(Ne)||J.checkPoint(q[0],q[1],0,te,Y,$.x,$.y,re,ee)||oe.checkPoint(pe[0],pe[1],0,U,j,G.x,G.y,ue,Z),D.vectorNormInverse=fe,_={nodesOverlap:D.nodesOverlap,dirCounts:D.dirCounts,calculatedIntersection:!0,hasBezier:D.hasBezier,hasUnbundled:D.hasUnbundled,eles:D.eles,srcPos:$,srcRs:ee,tgtPos:G,tgtRs:Z,srcW:te,srcH:Y,tgtW:U,tgtH:j,srcIntn:Be,tgtIntn:Ve,srcShape:J,tgtShape:oe,posPts:{x1:He.x2,y1:He.y2,x2:He.x1,y2:He.y1},intersectionPts:{x1:Ye.x2,y1:Ye.y2,x2:Ye.x1,y2:Ye.y1},vector:{x:-Ce.x,y:-Ce.y},vectorNorm:{x:-Fe.x,y:-Fe.y},vectorNormInverse:{x:-fe.x,y:-fe.y}}}var xe=Te?_:D;Q.nodesOverlap=xe.nodesOverlap,Q.srcIntn=xe.srcIntn,Q.tgtIntn=xe.tgtIntn,Q.isRound=de.startsWith("round"),i&&(P.isParent()||P.isChild()||B.isParent()||B.isChild())&&(P.parents().anySame(B)||B.parents().anySame(P)||P.same(B)&&P.isParent())?e.findCompoundLoopPoints(ae,xe,K,ne):P===B?e.findLoopPoints(ae,xe,K,ne):de.endsWith("segments")?e.findSegmentsPoints(ae,xe):de.endsWith("taxi")?e.findTaxiPoints(ae,xe):de==="straight"||!ne&&D.eles.length%2===1&&K===Math.floor(D.eles.length/2)?e.findStraightEdgePoints(ae):e.findBezierPoints(ae,xe,K,ne,Te),e.findEndpoints(ae),e.tryToCorrectInvalidPoints(ae,xe),e.checkForInvalidEdgeWarning(ae),e.storeAllpts(ae),e.storeEdgeProjections(ae),e.calculateArrowAngles(ae),e.recalculateEdgeLabelProjections(ae),e.calculateLabelAngles(ae)}},"_loop"),A=0;A0){var q=h,Ve=mp(q,tg(s)),pe=mp(q,tg(Te)),Be=Ve;if(pe2){var Ye=mp(q,{x:Te[2],y:Te[3]});Ye0){var le=f,ke=mp(le,tg(s)),ve=mp(le,tg(se)),ye=ke;if(ve2){var Re=mp(le,{x:se[2],y:se[3]});Re=g||A){v={cp:S,segment:k};break}}if(v)break}var C=v.cp,R=v.segment,I=(g-x)/R.length,L=R.t1-R.t0,E=m?R.t0+L*I:R.t1-L*I;E=ox(0,E,1),e=ig(C.p0,C.p1,C.p2,E),p=gHe(C.p0,C.p1,C.p2,E);break}case"straight":case"segments":case"haystack":{for(var D=0,_,O,M,P,B=n.allpts.length,F=0;F+3=g));F+=2);var G=g-O,$=G/_;$=ox(0,$,1),e=Fze(M,P,$),p=Che(M,P);break}}s("labelX",d,e.x),s("labelY",d,e.y),s("labelAutoAngle",d,p)}},"calculateEndProjection");h("source"),h("target"),this.applyLabelDimensions(t)}};Bc.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};Bc.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=bp(n,t._private.labelDimsKey);if(Us(r.rscratch,"prefixedLabelDimsKey",e)!==i){$u(r.rscratch,"prefixedLabelDimsKey",e,i);var a=this.calculateLabelDimensions(t,n),s=t.pstyle("line-height").pfValue,l=t.pstyle("text-wrap").strValue,u=Us(r.rscratch,"labelWrapCachedLines",e)||[],h=l!=="wrap"?1:Math.max(u.length,1),f=a.height/h,d=f*s,p=a.width,m=a.height+(h-1)*(s-1)*f;$u(r.rstyle,"labelWidth",e,p),$u(r.rscratch,"labelWidth",e,p),$u(r.rstyle,"labelHeight",e,m),$u(r.rscratch,"labelHeight",e,m),$u(r.rscratch,"labelLineHeight",e,d)}};Bc.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=o(function(j,te){return te?($u(r.rscratch,j,e,te),te):Us(r.rscratch,j,e)},"rscratch");if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var l=t.pstyle("text-wrap").value;if(l==="wrap"){var u=s("labelKey");if(u!=null&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var h="\u200B",f=i.split(` +`),d=t.pstyle("text-max-width").pfValue,p=t.pstyle("text-overflow-wrap").value,m=p==="anywhere",g=[],y=/[\s\u200b]+|$/g,v=0;vd){var w=x.matchAll(y),k="",A=0,C=qs(w),R;try{for(C.s();!(R=C.n()).done;){var I=R.value,L=I[0],E=x.substring(A,I.index);A=I.index+L.length;var D=k.length===0?E:k+E+L,_=this.calculateLabelDimensions(t,D),O=_.width;O<=d?k+=E+L:(k&&g.push(k),k=E+L)}}catch(U){C.e(U)}finally{C.f()}k.match(/^[\s\u200b]+$/)||g.push(k)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` +`)),s("labelWrapKey",u)}else if(l==="ellipsis"){var M=t.pstyle("text-max-width").pfValue,P="",B="\u2026",F=!1;if(this.calculateLabelDimensions(t,i).widthM)break;P+=i[G],G===i.length-1&&(F=!0)}return F||(P+=B),P}return i};Bc.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Bc.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=0,s=t.pstyle("font-style").strValue,l=t.pstyle("font-size").pfValue,u=t.pstyle("font-family").strValue,h=t.pstyle("font-weight").strValue,f=this.labelCalcCanvas,d=this.labelCalcCanvasContext;if(!f){f=this.labelCalcCanvas=i.createElement("canvas"),d=this.labelCalcCanvasContext=f.getContext("2d");var p=f.style;p.position="absolute",p.left="-9999px",p.top="-9999px",p.zIndex="-1",p.visibility="hidden",p.pointerEvents="none"}d.font="".concat(s," ").concat(h," ").concat(l,"px ").concat(u);for(var m=0,g=0,y=e.split(` +`),v=0;v1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),l)for(var u=0;u=t.desktopTapThreshold2}var bt=a(z);lt&&(t.hoverData.tapholdCancelled=!0);var wt=o(function(){var Se=t.hoverData.dragDelta=t.hoverData.dragDelta||[];Se.length===0?(Se.push(et[0]),Se.push(et[1])):(Se[0]+=et[0],Se[1]+=et[1])},"updateDragDelta");le=!0,i(xt,["mousemove","vmousemove","tapdrag"],z,{x:Re[0],y:Re[1]});var yt=o(function(Se){return{originalEvent:z,type:Se,position:{x:Re[0],y:Re[1]}}},"makeEvent"),ft=o(function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||ke.emit(yt("boxstart")),Ke[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()},"goIntoBoxMode");if(t.hoverData.which===3){if(lt){var Ur=yt("cxtdrag");Oe?Oe.emit(Ur):ke.emit(Ur),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||xt!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit(yt("cxtdragout")),t.hoverData.cxtOver=xt,xt&&xt.emit(yt("cxtdragover")))}}else if(t.hoverData.dragging){if(le=!0,ke.panningEnabled()&&ke.userPanningEnabled()){var _t;if(t.hoverData.justStartedPan){var bn=t.hoverData.mdownPos;_t={x:(Re[0]-bn[0])*ve,y:(Re[1]-bn[1])*ve},t.hoverData.justStartedPan=!1}else _t={x:et[0]*ve,y:et[1]*ve};ke.panBy(_t),ke.emit(yt("dragpan")),t.hoverData.dragged=!0}Re=t.projectIntoViewport(z.clientX,z.clientY)}else if(Ke[4]==1&&(Oe==null||Oe.pannable())){if(lt){if(!t.hoverData.dragging&&ke.boxSelectionEnabled()&&(bt||!ke.panningEnabled()||!ke.userPanningEnabled()))ft();else if(!t.hoverData.selecting&&ke.panningEnabled()&&ke.userPanningEnabled()){var Br=s(Oe,t.hoverData.downs);Br&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,Ke[4]=0,t.data.bgActivePosistion=tg(_e),t.redrawHint("select",!0),t.redraw())}Oe&&Oe.pannable()&&Oe.active()&&Oe.unactivate()}}else{if(Oe&&Oe.pannable()&&Oe.active()&&Oe.unactivate(),(!Oe||!Oe.grabbed())&&xt!=We&&(We&&i(We,["mouseout","tapdragout"],z,{x:Re[0],y:Re[1]}),xt&&i(xt,["mouseover","tapdragover"],z,{x:Re[0],y:Re[1]}),t.hoverData.last=xt),Oe)if(lt){if(ke.boxSelectionEnabled()&&bt)Oe&&Oe.grabbed()&&(x(Ue),Oe.emit(yt("freeon")),Ue.emit(yt("free")),t.dragData.didDrag&&(Oe.emit(yt("dragfreeon")),Ue.emit(yt("dragfree")))),ft();else if(Oe&&Oe.grabbed()&&t.nodeIsDraggable(Oe)){var cr=!t.dragData.didDrag;cr&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||y(Ue,{inDragLayer:!0});var ar={x:0,y:0};if(At(et[0])&&At(et[1])&&(ar.x+=et[0],ar.y+=et[1],cr)){var _r=t.hoverData.dragDelta;_r&&At(_r[0])&&At(_r[1])&&(ar.x+=_r[0],ar.y+=_r[1])}t.hoverData.draggingEles=!0,Ue.silentShift(ar).emit(yt("position")).emit(yt("drag")),t.redrawHint("drag",!0),t.redraw()}}else wt();le=!0}if(Ke[2]=Re[0],Ke[3]=Re[1],le)return z.stopPropagation&&z.stopPropagation(),z.preventDefault&&z.preventDefault(),!1}},"mousemoveHandler"),!1);var E,D,_;t.registerBinding(e,"mouseup",o(function(z){if(!(t.hoverData.which===1&&z.which!==1&&t.hoverData.capture)){var se=t.hoverData.capture;if(se){t.hoverData.capture=!1;var le=t.cy,ke=t.projectIntoViewport(z.clientX,z.clientY),ve=t.selection,ye=t.findNearestElement(ke[0],ke[1],!0,!1),Re=t.dragData.possibleDragElements,_e=t.hoverData.down,ze=a(z);t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,_e&&_e.unactivate();var Ke=o(function(Gt){return{originalEvent:z,type:Gt,position:{x:ke[0],y:ke[1]}}},"makeEvent");if(t.hoverData.which===3){var xt=Ke("cxttapend");if(_e?_e.emit(xt):le.emit(xt),!t.hoverData.cxtDragged){var We=Ke("cxttap");_e?_e.emit(We):le.emit(We)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(i(ye,["mouseup","tapend","vmouseup"],z,{x:ke[0],y:ke[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(i(_e,["click","tap","vclick"],z,{x:ke[0],y:ke[1]}),D=!1,z.timeStamp-_<=le.multiClickDebounceTime()?(E&&clearTimeout(E),D=!0,_=null,i(_e,["dblclick","dbltap","vdblclick"],z,{x:ke[0],y:ke[1]})):(E=setTimeout(function(){D||i(_e,["oneclick","onetap","voneclick"],z,{x:ke[0],y:ke[1]})},le.multiClickDebounceTime()),_=z.timeStamp)),_e==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!a(z)&&(le.$(r).unselect(["tapunselect"]),Re.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=Re=le.collection()),ye==_e&&!t.dragData.didDrag&&!t.hoverData.selecting&&ye!=null&&ye._private.selectable&&(t.hoverData.dragging||(le.selectionType()==="additive"||ze?ye.selected()?ye.unselect(["tapunselect"]):ye.select(["tapselect"]):ze||(le.$(r).unmerge(ye).unselect(["tapunselect"]),ye.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var Oe=le.collection(t.getAllInBox(ve[0],ve[1],ve[2],ve[3]));t.redrawHint("select",!0),Oe.length>0&&t.redrawHint("eles",!0),le.emit(Ke("boxend"));var et=o(function(Gt){return Gt.selectable()&&!Gt.selected()},"eleWouldBeSelected");le.selectionType()==="additive"||ze||le.$(r).unmerge(Oe).unselect(),Oe.emit(Ke("box")).stdFilter(et).select().emit(Ke("boxselect")),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!ve[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var Ue=_e&&_e.grabbed();x(Re),Ue&&(_e.emit(Ke("freeon")),Re.emit(Ke("free")),t.dragData.didDrag&&(_e.emit(Ke("dragfreeon")),Re.emit(Ke("dragfree"))))}}ve[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},"mouseupHandler"),!1);var O=[],M=4,P,B=1e5,F=o(function(z,se){for(var le=0;le=M){var ke=O;if(P=F(ke,5),!P){var ve=Math.abs(ke[0]);P=G(ke)&&ve>5}if(P)for(var ye=0;ye5&&(le=yI(le)*5),We=le/-250,P&&(We/=B,We*=3),We=We*t.wheelSensitivity;var Oe=z.deltaMode===1;Oe&&(We*=33);var et=Re.zoom()*Math.pow(10,We);z.type==="gesturechange"&&(et=t.gestureStartZoom*z.scale),Re.zoom({level:et,renderedPosition:{x:xt[0],y:xt[1]}}),Re.emit({type:z.type==="gesturechange"?"pinchzoom":"scrollzoom",originalEvent:z,position:{x:Ke[0],y:Ke[1]}})}}}},"wheelHandler");t.registerBinding(t.container,"wheel",$,!0),t.registerBinding(e,"scroll",o(function(z){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},"scrollHandler"),!0),t.registerBinding(t.container,"gesturestart",o(function(z){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||z.preventDefault()},"gestureStartHandler"),!0),t.registerBinding(t.container,"gesturechange",function(he){t.hasTouchStarted||$(he)},!0),t.registerBinding(t.container,"mouseout",o(function(z){var se=t.projectIntoViewport(z.clientX,z.clientY);t.cy.emit({originalEvent:z,type:"mouseout",position:{x:se[0],y:se[1]}})},"mouseOutHandler"),!1),t.registerBinding(t.container,"mouseover",o(function(z){var se=t.projectIntoViewport(z.clientX,z.clientY);t.cy.emit({originalEvent:z,type:"mouseover",position:{x:se[0],y:se[1]}})},"mouseOverHandler"),!1);var U,j,te,Y,oe,J,ue,re,ee,Z,K,ae,Q,de=o(function(z,se,le,ke){return Math.sqrt((le-z)*(le-z)+(ke-se)*(ke-se))},"distance"),ne=o(function(z,se,le,ke){return(le-z)*(le-z)+(ke-se)*(ke-se)},"distanceSq"),Te;t.registerBinding(t.container,"touchstart",Te=o(function(z){if(t.hasTouchStarted=!0,!!I(z)){T(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var se=t.cy,le=t.touchData.now,ke=t.touchData.earlier;if(z.touches[0]){var ve=t.projectIntoViewport(z.touches[0].clientX,z.touches[0].clientY);le[0]=ve[0],le[1]=ve[1]}if(z.touches[1]){var ve=t.projectIntoViewport(z.touches[1].clientX,z.touches[1].clientY);le[2]=ve[0],le[3]=ve[1]}if(z.touches[2]){var ve=t.projectIntoViewport(z.touches[2].clientX,z.touches[2].clientY);le[4]=ve[0],le[5]=ve[1]}var ye=o(function(bt){return{originalEvent:z,type:bt,position:{x:le[0],y:le[1]}}},"makeEvent");if(z.touches[1]){t.touchData.singleTouchMoved=!0,x(t.dragData.touchDragEles);var Re=t.findContainerClientCoords();ee=Re[0],Z=Re[1],K=Re[2],ae=Re[3],U=z.touches[0].clientX-ee,j=z.touches[0].clientY-Z,te=z.touches[1].clientX-ee,Y=z.touches[1].clientY-Z,Q=0<=U&&U<=K&&0<=te&&te<=K&&0<=j&&j<=ae&&0<=Y&&Y<=ae;var _e=se.pan(),ze=se.zoom();oe=de(U,j,te,Y),J=ne(U,j,te,Y),ue=[(U+te)/2,(j+Y)/2],re=[(ue[0]-_e.x)/ze,(ue[1]-_e.y)/ze];var Ke=200,xt=Ke*Ke;if(J=1){for(var vt=t.touchData.startPosition=[null,null,null,null,null,null],Lt=0;Lt=t.touchTapThreshold2}if(se&&t.touchData.cxt){z.preventDefault();var Lt=z.touches[0].clientX-ee,dt=z.touches[0].clientY-Z,nt=z.touches[1].clientX-ee,bt=z.touches[1].clientY-Z,wt=ne(Lt,dt,nt,bt),yt=wt/J,ft=150,Ur=ft*ft,_t=1.5,bn=_t*_t;if(yt>=bn||wt>=Ur){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var Br=ze("cxttapend");t.touchData.start?(t.touchData.start.unactivate().emit(Br),t.touchData.start=null):ke.emit(Br)}}if(se&&t.touchData.cxt){var Br=ze("cxtdrag");t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(Br):ke.emit(Br),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var cr=t.findNearestElement(ve[0],ve[1],!0,!0);(!t.touchData.cxtOver||cr!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit(ze("cxtdragout")),t.touchData.cxtOver=cr,cr&&cr.emit(ze("cxtdragover")))}else if(se&&z.touches[2]&&ke.boxSelectionEnabled())z.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||ke.emit(ze("boxstart")),t.touchData.selecting=!0,t.touchData.didSelect=!0,le[4]=1,!le||le.length===0||le[0]===void 0?(le[0]=(ve[0]+ve[2]+ve[4])/3,le[1]=(ve[1]+ve[3]+ve[5])/3,le[2]=(ve[0]+ve[2]+ve[4])/3+1,le[3]=(ve[1]+ve[3]+ve[5])/3+1):(le[2]=(ve[0]+ve[2]+ve[4])/3,le[3]=(ve[1]+ve[3]+ve[5])/3),t.redrawHint("select",!0),t.redraw();else if(se&&z.touches[1]&&!t.touchData.didSelect&&ke.zoomingEnabled()&&ke.panningEnabled()&&ke.userZoomingEnabled()&&ke.userPanningEnabled()){z.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var ar=t.dragData.touchDragEles;if(ar){t.redrawHint("drag",!0);for(var _r=0;_r0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},"touchmoveHandler"),!1);var Ve;t.registerBinding(e,"touchcancel",Ve=o(function(z){var se=t.touchData.start;t.touchData.capture=!1,se&&se.unactivate()},"touchcancelHandler"));var pe,Be,Ye,He;if(t.registerBinding(e,"touchend",pe=o(function(z){var se=t.touchData.start,le=t.touchData.capture;if(le)z.touches.length===0&&(t.touchData.capture=!1),z.preventDefault();else return;var ke=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var ve=t.cy,ye=ve.zoom(),Re=t.touchData.now,_e=t.touchData.earlier;if(z.touches[0]){var ze=t.projectIntoViewport(z.touches[0].clientX,z.touches[0].clientY);Re[0]=ze[0],Re[1]=ze[1]}if(z.touches[1]){var ze=t.projectIntoViewport(z.touches[1].clientX,z.touches[1].clientY);Re[2]=ze[0],Re[3]=ze[1]}if(z.touches[2]){var ze=t.projectIntoViewport(z.touches[2].clientX,z.touches[2].clientY);Re[4]=ze[0],Re[5]=ze[1]}var Ke=o(function(Ur){return{originalEvent:z,type:Ur,position:{x:Re[0],y:Re[1]}}},"makeEvent");se&&se.unactivate();var xt;if(t.touchData.cxt){if(xt=Ke("cxttapend"),se?se.emit(xt):ve.emit(xt),!t.touchData.cxtDragged){var We=Ke("cxttap");se?se.emit(We):ve.emit(We)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!z.touches[2]&&ve.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var Oe=ve.collection(t.getAllInBox(ke[0],ke[1],ke[2],ke[3]));ke[0]=void 0,ke[1]=void 0,ke[2]=void 0,ke[3]=void 0,ke[4]=0,t.redrawHint("select",!0),ve.emit(Ke("boxend"));var et=o(function(Ur){return Ur.selectable()&&!Ur.selected()},"eleWouldBeSelected");Oe.emit(Ke("box")).stdFilter(et).select().emit(Ke("boxselect")),Oe.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(se?.unactivate(),z.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!z.touches[1]){if(!z.touches[0]){if(!z.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var Ue=t.dragData.touchDragEles;if(se!=null){var lt=se._private.grabbed;x(Ue),t.redrawHint("drag",!0),t.redrawHint("eles",!0),lt&&(se.emit(Ke("freeon")),Ue.emit(Ke("free")),t.dragData.didDrag&&(se.emit(Ke("dragfreeon")),Ue.emit(Ke("dragfree")))),i(se,["touchend","tapend","vmouseup","tapdragout"],z,{x:Re[0],y:Re[1]}),se.unactivate(),t.touchData.start=null}else{var Gt=t.findNearestElement(Re[0],Re[1],!0,!0);i(Gt,["touchend","tapend","vmouseup","tapdragout"],z,{x:Re[0],y:Re[1]})}var vt=t.touchData.startPosition[0]-Re[0],Lt=vt*vt,dt=t.touchData.startPosition[1]-Re[1],nt=dt*dt,bt=Lt+nt,wt=bt*ye*ye;t.touchData.singleTouchMoved||(se||ve.$(":selected").unselect(["tapunselect"]),i(se,["tap","vclick"],z,{x:Re[0],y:Re[1]}),Be=!1,z.timeStamp-He<=ve.multiClickDebounceTime()?(Ye&&clearTimeout(Ye),Be=!0,He=null,i(se,["dbltap","vdblclick"],z,{x:Re[0],y:Re[1]})):(Ye=setTimeout(function(){Be||i(se,["onetap","voneclick"],z,{x:Re[0],y:Re[1]})},ve.multiClickDebounceTime()),He=z.timeStamp)),se!=null&&!t.dragData.didDrag&&se._private.selectable&&wt"u"){var Le=[],Ie=o(function(z){return{clientX:z.clientX,clientY:z.clientY,force:1,identifier:z.pointerId,pageX:z.pageX,pageY:z.pageY,radiusX:z.width/2,radiusY:z.height/2,screenX:z.screenX,screenY:z.screenY,target:z.target}},"makeTouch"),Ne=o(function(z){return{event:z,touch:Ie(z)}},"makePointer"),Ce=o(function(z){Le.push(Ne(z))},"addPointer"),Fe=o(function(z){for(var se=0;se0)return U[0]}return null},"getCurveT"),g=Object.keys(p),y=0;y0?m:_ue(a,s,e,r,n,i,l,u)},"intersectLine"),checkPoint:o(function(e,r,n,i,a,s,l,u){u=u==="auto"?kf(i,a):u;var h=2*u;if(Vu(e,r,this.points,s,l,i,a-h,[0,-1],n)||Vu(e,r,this.points,s,l,i-h,a,[0,-1],n))return!0;var f=i/2+2*n,d=a/2+2*n,p=[s-f,l-d,s-f,l,s+f,l,s+f,l-d];return!!(Hs(e,r,p)||xp(e,r,h,h,s+i/2-u,l+a/2-u,n)||xp(e,r,h,h,s-i/2+u,l+a/2-u,n))},"checkPoint")}};Uu.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",ls(3,0)),this.generateRoundPolygon("round-triangle",ls(3,0)),this.generatePolygon("rectangle",ls(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",ls(5,0)),this.generateRoundPolygon("round-pentagon",ls(5,0)),this.generatePolygon("hexagon",ls(6,0)),this.generateRoundPolygon("round-hexagon",ls(6,0)),this.generatePolygon("heptagon",ls(7,0)),this.generateRoundPolygon("round-heptagon",ls(7,0)),this.generatePolygon("octagon",ls(8,0)),this.generateRoundPolygon("round-octagon",ls(8,0));var n=new Array(20);{var i=HM(5,0),a=HM(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var l=0;l=e.deqFastCost*S)break}else if(h){if(b>=e.deqCost*m||b>=e.deqAvgCost*p)break}else if(T>=e.deqNoDrawCost*OM)break;var w=e.deq(n,v,y);if(w.length>0)for(var k=0;k0&&(e.onDeqd(n,g),!h&&e.shouldRedraw(n,g,v,y)&&a())},"dequeue"),l=e.priority||pI;i.beforeRender(s,l(n))}},"setupDequeueingImpl")},"setupDequeueing")},vHe=(function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Qk;Af(this,t),this.idsByKey=new zu,this.keyForId=new zu,this.cachesByLvl=new zu,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return o(t,"ElementTextureCacheLookup"),_f(t,[{key:"getIdsFor",value:o(function(r){r==null&&Kn("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new hg,n.set(r,i)),i},"getIdsFor")},{key:"addIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).add(n)},"addIdForKey")},{key:"deleteIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).delete(n)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:o(function(r){return r==null?0:this.getIdsFor(r).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a},"keyHasChangedFor")},{key:"isInvalid",value:o(function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)},"isInvalid")},{key:"getCachesAt",value:o(function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new zu,n.set(r,a),i.push(r)),a},"getCachesAt")},{key:"getCache",value:o(function(r,n){return this.getCachesAt(n).get(r)},"getCache")},{key:"get",value:o(function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a},"get")},{key:"getForCachedKey",value:o(function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a},"getForCachedKey")},{key:"hasCache",value:o(function(r,n){return this.getCachesAt(n).has(r)},"hasCache")},{key:"has",value:o(function(r,n){var i=this.getKey(r);return this.hasCache(i,n)},"has")},{key:"setCache",value:o(function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)},"setCache")},{key:"set",value:o(function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)},"set")},{key:"deleteCache",value:o(function(r,n){this.getCachesAt(n).delete(r)},"deleteCache")},{key:"delete",value:o(function(r,n){var i=this.getKey(r);this.deleteCache(i,n)},"_delete")},{key:"invalidateKey",value:o(function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})},"invalidateKey")},{key:"invalidate",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0},"invalidate")}])})(),Hce=25,Ok=50,Wk=-4,iI=3,Nhe=7.99,xHe=8,bHe=1024,THe=1024,wHe=1024,kHe=.2,EHe=.8,SHe=10,CHe=.15,AHe=.1,_He=.9,DHe=.9,LHe=100,RHe=1,ng={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},NHe=xa({getKey:null,doesEleInvalidateKey:Qk,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:Tue,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),ex=o(function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=NHe(r);ir(n,i),n.lookup=new vHe(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},"ElementTextureCache"),zi=ex.prototype;zi.reasons=ng;zi.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};zi.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};zi.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new bx(function(r,n){return n.reqs-r.reqs});return e};zi.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};zi.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,l=s.cy.zoom(),u=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(gI(l*r))),n=Nhe||n>iI)return null;var h=Math.pow(2,n),f=e.h*h,d=e.w*h,p=s.eleTextBiggerThanMin(t,h);if(!this.isVisible(t,p))return null;var m=u.get(t,n);if(m&&m.invalidated&&(m.invalidated=!1,m.texture.invalidatedWidth-=m.width),m)return m;var g;if(f<=Hce?g=Hce:f<=Ok?g=Ok:g=Math.ceil(f/Ok)*Ok,f>wHe||d>THe)return null;var y=a.getTextureQueue(g),v=y[y.length-2],x=o(function(){return a.recycleTexture(g,d)||a.addTexture(g,d)},"addNewTxr");v||(v=y[y.length-1]),v||(v=x()),v.width-v.usedWidthn;L--)R=a.getElement(t,e,r,L,ng.downscale);I()}else return a.queueElement(t,k.level-1),k;else{var E;if(!T&&!S&&!w)for(var D=n-1;D>=Wk;D--){var _=u.get(t,D);if(_){E=_;break}}if(b(E))return a.queueElement(t,n),E;v.context.translate(v.usedWidth,0),v.context.scale(h,h),this.drawElement(v.context,t,e,p,!1),v.context.scale(1/h,1/h),v.context.translate(-v.usedWidth,0)}return m={x:v.usedWidth,texture:v,level:n,scale:h,width:d,height:f,scaledLabelShown:p},v.usedWidth+=Math.ceil(d+xHe),v.eleCaches.push(m),u.set(t,n,m),a.checkTextureFullness(v),m};zi.invalidateElements=function(t){for(var e=0;e=kHe*t.width&&this.retireTexture(t)};zi.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>EHe&&t.fullnessChecks>=SHe?wf(r,t):t.fullnessChecks++};zi.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;wf(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,mI(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),wf(i,s),n.push(s),s}};zi.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var l={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(l),i[a]=l}};zi.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var l=r.pop(),u=l.key,h=l.eles[0],f=a.hasCache(h,l.level);if(n[u]=null,f)continue;i.push(l);var d=e.getBoundingBox(h);e.getElement(h,d,t,l.level,ng.dequeue)}return i};zi.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=dI,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};zi.onDequeue=function(t){this.onDequeues.push(t)};zi.offDequeue=function(t){wf(this.onDequeues,t)};zi.setupDequeueing=Rhe.setupDequeueing({deqRedrawThreshold:LHe,deqCost:CHe,deqAvgCost:AHe,deqNoDrawCost:_He,deqFastCost:DHe,deq:o(function(e,r,n){return e.dequeue(r,n)},"deq"),onDeqd:o(function(e,r){for(var n=0;n=IHe||r>aE)return null}n.validateLayersElesOrdering(r,t);var u=n.layersByLevel,h=Math.pow(2,r),f=u[r]=u[r]||[],d,p=n.levelIsComplete(r,t),m,g=o(function(){var I=o(function(O){if(n.validateLayersElesOrdering(O,t),n.levelIsComplete(O,t))return m=u[O],!0},"canUseAsTmpLvl"),L=o(function(O){if(!m)for(var M=r+O;rx<=M&&M<=aE&&!I(M);M+=O);},"checkLvls");L(1),L(-1);for(var E=f.length-1;E>=0;E--){var D=f[E];D.invalid&&wf(f,D)}},"checkTempLevels");if(!p)g();else return f;var y=o(function(){if(!d){d=cs();for(var I=0;IWce||D>Wce)return null;var _=E*D;if(_>VHe)return null;var O=n.makeLayer(d,r);if(L!=null){var M=f.indexOf(L)+1;f.splice(M,0,O)}else(I.insert===void 0||I.insert)&&f.unshift(O);return O},"makeLayer");if(n.skipping&&!l)return null;for(var x=null,b=t.length/MHe,T=!l,S=0;S=b||!Aue(x.bb,w.boundingBox()))&&(x=v({insert:!0,after:x}),!x))return null;m||T?n.queueLayer(x,w):n.drawEleInLayer(x,w,r,e),x.eles.push(w),A[r]=x}return m||(T?null:f)};ba.getEleLevelForLayerLevel=function(t,e){return t};ba.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,l=e.boundingBox();l.w===0||l.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,UHe),a.setImgSmoothing(s,!0))};ba.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};ba.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};ba.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=Gu(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,o(function(n,i,a){e.invalidateLayer(n)},"invalAssocLayers")))};ba.invalidateLayer=function(t){if(this.lastInvalidationTime=Gu(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];wf(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l=e._private.rscratch;if(!(a&&!e.visible())&&!(l.badLine||l.allpts==null||isNaN(l.allpts[0]))){var u;r&&(u=r,t.translate(-u.x1,-u.y1));var h=a?e.pstyle("opacity").value:1,f=a?e.pstyle("line-opacity").value:1,d=e.pstyle("curve-style").value,p=e.pstyle("line-style").value,m=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,v=e.pstyle("line-outline-color").value,x=h*f,b=h*f,T=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;d==="straight-triangle"?(s.eleStrokeStyle(t,e,O),s.drawEdgeTrianglePath(e,t,l.allpts)):(t.lineWidth=m,t.lineCap=g,s.eleStrokeStyle(t,e,O),s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLine"),S=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=m+y,t.lineCap=g,y>0)s.colorStrokeStyle(t,v[0],v[1],v[2],O);else{t.lineCap="butt";return}d==="straight-triangle"?s.drawEdgeTrianglePath(e,t,l.allpts):(s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLineOutline"),w=o(function(){i&&s.drawEdgeOverlay(t,e)},"drawOverlay"),k=o(function(){i&&s.drawEdgeUnderlay(t,e)},"drawUnderlay"),A=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,O)},"drawArrows"),C=o(function(){s.drawElementText(t,e,null,n)},"drawText");t.lineJoin="round";var R=e.pstyle("ghost").value==="yes";if(R){var I=e.pstyle("ghost-offset-x").pfValue,L=e.pstyle("ghost-offset-y").pfValue,E=e.pstyle("ghost-opacity").value,D=x*E;t.translate(I,L),T(D),A(D),t.translate(-I,-L)}else S();k(),T(),A(),w(),C(),r&&t.translate(u.x1,u.y1)}};Ohe=o(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),l=n._private.rscratch,u=n.pstyle("".concat(e,"-padding")).pfValue,h=2*u,f=n.pstyle("".concat(e,"-color")).value;r.lineWidth=h,l.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,f[0],f[1],f[2],i),a.drawEdgePath(n,r,l.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");Hu.drawEdgeOverlay=Ohe("overlay");Hu.drawEdgeUnderlay=Ohe("underlay");Hu.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,l=!1,u=this.usePaths(),h=t.pstyle("line-dash-pattern").pfValue,f=t.pstyle("line-dash-offset").pfValue;if(u){var d=r.join("$"),p=i.pathCacheKey&&i.pathCacheKey===d;p?(s=e=i.pathCache,l=!0):(s=e=new Path2D,i.pathCacheKey=d,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(h),a.lineDashOffset=f;break;case"solid":a.setLineDash([]);break}if(!l&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var m=2;m+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var l=e.pstyle("label");if(!l||!l.value)return;var u=s.getLabelJustification(e);t.textAlign=u,t.textBaseline="bottom"}else{var h=e.element()._private.rscratch.badLine,f=e.pstyle("label"),d=e.pstyle("source-label"),p=e.pstyle("target-label");if(h||(!f||!f.value)&&(!d||!d.value)&&(!p||!p.value))return;t.textAlign="center",t.textBaseline="bottom"}var m=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,m,a),e.isEdge()&&(s.drawText(t,e,"source",m,a),s.drawText(t,e,"target",m,a))):s.drawText(t,e,i,m,a),r&&t.translate(g.x1,g.y1)};Cp.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,l=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,u=e.pstyle("text-outline-opacity").value*l,h=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,h[0],h[1],h[2],l),this.colorStrokeStyle(t,f[0],f[1],f[2],u)};o(eqe,"circle");o(Kce,"roundRect");Cp.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation");if(s.strValue==="autorotate"){var l=Us(i,"labelAngle",e);r=t.isEdge()?l:0}else s.strValue==="none"?r=0:r=s.pfValue;return r};Cp.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,l=i?e.effectiveOpacity():1;if(!(i&&(l===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var u=Us(s,"labelX",r),h=Us(s,"labelY",r),f,d,p=this.getLabelText(e,r);if(p!=null&&p!==""&&!isNaN(u)&&!isNaN(h)){this.setupTextStyle(t,e,i);var m=r?r+"-":"",g=Us(s,"labelWidth",r),y=Us(s,"labelHeight",r),v=e.pstyle(m+"text-margin-x").pfValue,x=e.pstyle(m+"text-margin-y").pfValue,b=e.isEdge(),T=e.pstyle("text-halign").value,S=e.pstyle("text-valign").value;b&&(T="center",S="center"),u+=v,h+=x;var w;switch(n?w=this.getTextAngle(e,r):w=0,w!==0&&(f=u,d=h,t.translate(f,d),t.rotate(w),u=0,h=0),S){case"top":break;case"center":h+=y/2;break;case"bottom":h+=y;break}var k=e.pstyle("text-background-opacity").value,A=e.pstyle("text-border-opacity").value,C=e.pstyle("text-border-width").pfValue,R=e.pstyle("text-background-padding").pfValue,I=e.pstyle("text-background-shape").strValue,L=I==="round-rectangle"||I==="roundrectangle",E=I==="circle",D=2;if(k>0||C>0&&A>0){var _=t.fillStyle,O=t.strokeStyle,M=t.lineWidth,P=e.pstyle("text-background-color").value,B=e.pstyle("text-border-color").value,F=e.pstyle("text-border-style").value,G=k>0,$=C>0&&A>0,U=u-R;switch(T){case"left":U-=g;break;case"center":U-=g/2;break}var j=h-y-R,te=g+2*R,Y=y+2*R;if(G&&(t.fillStyle="rgba(".concat(P[0],",").concat(P[1],",").concat(P[2],",").concat(k*l,")")),$&&(t.strokeStyle="rgba(".concat(B[0],",").concat(B[1],",").concat(B[2],",").concat(A*l,")"),t.lineWidth=C,t.setLineDash))switch(F){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=C/4,t.setLineDash([]);break;case"solid":default:t.setLineDash([]);break}if(L?(t.beginPath(),Kce(t,U,j,te,Y,D)):E?(t.beginPath(),eqe(t,U,j,te,Y)):(t.beginPath(),t.rect(U,j,te,Y)),G&&t.fill(),$&&t.stroke(),$&&F==="double"){var oe=C/2;t.beginPath(),L?Kce(t,U+oe,j+oe,te-2*oe,Y-2*oe,D):t.rect(U+oe,j+oe,te-2*oe,Y-2*oe),t.stroke()}t.fillStyle=_,t.strokeStyle=O,t.lineWidth=M,t.setLineDash&&t.setLineDash([])}var J=2*e.pstyle("text-outline-width").pfValue;if(J>0&&(t.lineWidth=J),e.pstyle("text-wrap").value==="wrap"){var ue=Us(s,"labelWrapCachedLines",r),re=Us(s,"labelLineHeight",r),ee=g/2,Z=this.getLabelJustification(e);switch(Z==="auto"||(T==="left"?Z==="left"?u+=-g:Z==="center"&&(u+=-ee):T==="center"?Z==="left"?u+=-ee:Z==="right"&&(u+=ee):T==="right"&&(Z==="center"?u+=ee:Z==="right"&&(u+=g))),S){case"top":h-=(ue.length-1)*re;break;case"center":case"bottom":h-=(ue.length-1)*re;break}for(var K=0;K0&&t.strokeText(ue[K],u,h),t.fillText(ue[K],u,h),h+=re}else J>0&&t.strokeText(p,u,h),t.fillText(p,u,h);w!==0&&(t.rotate(-w),t.translate(-f,-d))}}};Lf={};Lf.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l,u,h=e._private,f=h.rscratch,d=e.position();if(!(!At(d.x)||!At(d.y))&&!(a&&!e.visible())){var p=a?e.effectiveOpacity():1,m=s.usePaths(),g,y=!1,v=e.padding();l=e.width()+2*v,u=e.height()+2*v;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),T=b.value,S=new Array(T.length),w=new Array(T.length),k=0,A=0;A0&&arguments[0]!==void 0?arguments[0]:D;s.eleFillStyle(t,e,W)},"setupShapeColor"),re=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:$;s.colorStrokeStyle(t,_[0],_[1],_[2],W)},"setupBorderColor"),ee=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Y;s.colorStrokeStyle(t,j[0],j[1],j[2],W)},"setupOutlineColor"),Z=o(function(W,he,z,se){var le=s.nodePathCache=s.nodePathCache||[],ke=bue(z==="polygon"?z+","+se.join(","):z,""+he,""+W,""+J),ve=le[ke],ye,Re=!1;return ve!=null?(ye=ve,Re=!0,f.pathCache=ye):(ye=new Path2D,le[ke]=f.pathCache=ye),{path:ye,cacheHit:Re}},"getPath"),K=e.pstyle("shape").strValue,ae=e.pstyle("shape-polygon-points").pfValue;if(m){t.translate(d.x,d.y);var Q=Z(l,u,K,ae);g=Q.path,y=Q.cacheHit}var de=o(function(){if(!y){var W=d;m&&(W={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,W.x,W.y,l,u,J,f)}m?t.fill(g):t.fill()},"drawShape"),ne=o(function(){for(var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,he=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,z=h.backgrounding,se=0,le=0;le0&&arguments[0]!==void 0?arguments[0]:!1,he=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasPie(e)&&(s.drawPie(t,e,he),W&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,J,f)))},"drawPie"),q=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,he=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasStripe(e)&&(t.save(),m?t.clip(f.pathCache):(s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,J,f),t.clip()),s.drawStripe(t,e,he),t.restore(),W&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,J,f)))},"drawStripe"),Ve=o(function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,he=(L>0?L:-L)*W,z=L>0?0:255;L!==0&&(s.colorFillStyle(t,z,z,z,he),m?t.fill(g):t.fill())},"darken"),pe=o(function(){if(E>0){if(t.lineWidth=E,t.lineCap=P,t.lineJoin=M,t.setLineDash)switch(O){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(F),t.lineDashOffset=G;break;case"solid":case"double":t.setLineDash([]);break}if(B!=="center"){if(t.save(),t.lineWidth*=2,B==="inside")m?t.clip(g):t.clip();else{var W=new Path2D;W.rect(-l/2-E,-u/2-E,l+2*E,u+2*E),W.addPath(g),t.clip(W,"evenodd")}m?t.stroke(g):t.stroke(),t.restore()}else m?t.stroke(g):t.stroke();if(O==="double"){t.lineWidth=E/3;var he=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",m?t.stroke(g):t.stroke(),t.globalCompositeOperation=he}t.setLineDash&&t.setLineDash([])}},"drawBorder"),Be=o(function(){if(U>0){if(t.lineWidth=U,t.lineCap="butt",t.setLineDash)switch(te){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var W=d;m&&(W={x:0,y:0});var he=s.getNodeShape(e),z=E;B==="inside"&&(z=0),B==="outside"&&(z*=2);var se=(l+z+(U+oe))/l,le=(u+z+(U+oe))/u,ke=l*se,ve=u*le,ye=s.nodeShapes[he].points,Re;if(m){var _e=Z(ke,ve,he,ye);Re=_e.path}if(he==="ellipse")s.drawEllipsePath(Re||t,W.x,W.y,ke,ve);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(he)){var ze=0,Ke=0,xt=0;he==="round-diamond"?ze=(z+oe+U)*1.4:he==="round-heptagon"?(ze=(z+oe+U)*1.075,xt=-(z/2+oe+U)/35):he==="round-hexagon"?ze=(z+oe+U)*1.12:he==="round-pentagon"?(ze=(z+oe+U)*1.13,xt=-(z/2+oe+U)/15):he==="round-tag"?(ze=(z+oe+U)*1.12,Ke=(z/2+U+oe)*.07):he==="round-triangle"&&(ze=(z+oe+U)*(Math.PI/2),xt=-(z+oe/2+U)/Math.PI),ze!==0&&(se=(l+ze)/l,ke=l*se,["round-hexagon","round-tag"].includes(he)||(le=(u+ze)/u,ve=u*le)),J=J==="auto"?Lue(ke,ve):J;for(var We=ke/2,Oe=ve/2,et=J+(z+U+oe)/2,Ue=new Array(ye.length/2),lt=new Array(ye.length/2),Gt=0;Gt0){if(i=i||n.position(),a==null||s==null){var m=n.padding();a=n.width()+2*m,s=n.height()+2*m}l.colorFillStyle(r,f[0],f[1],f[2],h),l.nodeShapes[d].draw(r,i.x,i.y,a+u*2,s+u*2,p),r.fill()}}}},"drawNodeOverlayUnderlay");Lf.drawNodeOverlay=Phe("overlay");Lf.drawNodeUnderlay=Phe("underlay");Lf.hasPie=function(t){return t=t[0],t._private.hasPie};Lf.hasStripe=function(t){return t=t[0],t._private.hasStripe};Lf.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=e.pstyle("pie-hole"),l=e.pstyle("pie-start-angle").pfValue,u=n.x,h=n.y,f=e.width(),d=e.height(),p=Math.min(f,d)/2,m,g=0,y=this.usePaths();if(y&&(u=0,h=0),a.units==="%"?p=p*a.pfValue:a.pfValue!==void 0&&(p=a.pfValue/2),s.units==="%"?m=p*s.pfValue:s.pfValue!==void 0&&(m=s.pfValue/2),!(m>=p))for(var v=1;v<=i.pieBackgroundN;v++){var x=e.pstyle("pie-"+v+"-background-size").value,b=e.pstyle("pie-"+v+"-background-color").value,T=e.pstyle("pie-"+v+"-background-opacity").value*r,S=x/100;S+g>1&&(S=1-g);var w=1.5*Math.PI+2*Math.PI*g;w+=l;var k=2*Math.PI*S,A=w+k;x===0||g>=1||g+S>1||(m===0?(t.beginPath(),t.moveTo(u,h),t.arc(u,h,p,w,A),t.closePath()):(t.beginPath(),t.arc(u,h,p,w,A),t.arc(u,h,m,A,w,!0),t.closePath()),this.colorFillStyle(t,b[0],b[1],b[2],T),t.fill(),g+=S)}};Lf.drawStripe=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=n.x,s=n.y,l=e.width(),u=e.height(),h=0,f=this.usePaths();t.save();var d=e.pstyle("stripe-direction").value,p=e.pstyle("stripe-size");switch(d){case"vertical":break;case"righward":t.rotate(-Math.PI/2);break}var m=l,g=u;p.units==="%"?(m=m*p.pfValue,g=g*p.pfValue):p.pfValue!==void 0&&(m=p.pfValue,g=p.pfValue),f&&(a=0,s=0),s-=m/2,a-=g/2;for(var y=1;y<=i.stripeBackgroundN;y++){var v=e.pstyle("stripe-"+y+"-background-size").value,x=e.pstyle("stripe-"+y+"-background-color").value,b=e.pstyle("stripe-"+y+"-background-opacity").value*r,T=v/100;T+h>1&&(T=1-h),!(v===0||h>=1||h+T>1)&&(t.beginPath(),t.rect(a,s+g*h,m,g*T),t.closePath(),this.colorFillStyle(t,x[0],x[1],x[2],b),t.fill(),h+=T)}t.restore()};us={},tqe=100;us.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};us.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;ie.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!d&&(f[e.NODE]=!0,f[e.SELECT_BOX]=!0);var b=r.style(),T=r.zoom(),S=s!==void 0?s:T,w=r.pan(),k={x:w.x,y:w.y},A={zoom:T,pan:{x:w.x,y:w.y}},C=e.prevViewport,R=C===void 0||A.zoom!==C.zoom||A.pan.x!==C.pan.x||A.pan.y!==C.pan.y;!R&&!(y&&!g)&&(e.motionBlurPxRatio=1),l&&(k=l),S*=u,k.x*=u,k.y*=u;var I=e.getCachedZSortedEles();function L(re,ee,Z,K,ae){var Q=re.globalCompositeOperation;re.globalCompositeOperation="destination-out",e.colorFillStyle(re,255,255,255,e.motionBlurTransparency),re.fillRect(ee,Z,K,ae),re.globalCompositeOperation=Q}o(L,"mbclear");function E(re,ee){var Z,K,ae,Q;!e.clearingMotionBlur&&(re===h.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||re===h.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(Z={x:w.x*m,y:w.y*m},K=T*m,ae=e.canvasWidth*m,Q=e.canvasHeight*m):(Z=k,K=S,ae=e.canvasWidth,Q=e.canvasHeight),re.setTransform(1,0,0,1,0,0),ee==="motionBlur"?L(re,0,0,ae,Q):!n&&(ee===void 0||ee)&&re.clearRect(0,0,ae,Q),i||(re.translate(Z.x,Z.y),re.scale(K,K)),l&&re.translate(l.x,l.y),s&&re.scale(s,s)}if(o(E,"setContextTransform"),d||(e.textureDrawLastFrame=!1),d){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=r.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var D=e.data.bufferContexts[e.TEXTURE_BUFFER];D.setTransform(1,0,0,1,0,0),D.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:D,drawOnlyNodeLayer:!0,forcedPxRatio:u*e.textureMult});var A=e.textureCache.viewport={zoom:r.zoom(),pan:r.pan(),width:e.canvasWidth,height:e.canvasHeight};A.mpan={x:(0-A.pan.x)/A.zoom,y:(0-A.pan.y)/A.zoom}}f[e.DRAG]=!1,f[e.NODE]=!1;var _=h.contexts[e.NODE],O=e.textureCache.texture,A=e.textureCache.viewport;_.setTransform(1,0,0,1,0,0),p?L(_,0,0,A.width,A.height):_.clearRect(0,0,A.width,A.height);var M=b.core("outside-texture-bg-color").value,P=b.core("outside-texture-bg-opacity").value;e.colorFillStyle(_,M[0],M[1],M[2],P),_.fillRect(0,0,A.width,A.height);var T=r.zoom();E(_,!1),_.clearRect(A.mpan.x,A.mpan.y,A.width/A.zoom/u,A.height/A.zoom/u),_.drawImage(O,A.mpan.x,A.mpan.y,A.width/A.zoom/u,A.height/A.zoom/u)}else e.textureOnViewport&&!n&&(e.textureCache=null);var B=r.extent(),F=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),G=e.hideEdgesOnViewport&&F,$=[];if($[e.NODE]=!f[e.NODE]&&p&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,$[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),$[e.DRAG]=!f[e.DRAG]&&p&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,$[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),f[e.NODE]||i||a||$[e.NODE]){var U=p&&!$[e.NODE]&&m!==1,_=n||(U?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:h.contexts[e.NODE]),j=p&&!U?"motionBlur":void 0;E(_,j),G?e.drawCachedNodes(_,I.nondrag,u,B):e.drawLayeredElements(_,I.nondrag,u,B),e.debug&&e.drawDebugPoints(_,I.nondrag),!i&&!p&&(f[e.NODE]=!1)}if(!a&&(f[e.DRAG]||i||$[e.DRAG])){var U=p&&!$[e.DRAG]&&m!==1,_=n||(U?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:h.contexts[e.DRAG]);E(_,p&&!U?"motionBlur":void 0),G?e.drawCachedNodes(_,I.drag,u,B):e.drawCachedElements(_,I.drag,u,B),e.debug&&e.drawDebugPoints(_,I.drag),!i&&!p&&(f[e.DRAG]=!1)}if(this.drawSelectionRectangle(t,E),p&&m!==1){var te=h.contexts[e.NODE],Y=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],oe=h.contexts[e.DRAG],J=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],ue=o(function(ee,Z,K){ee.setTransform(1,0,0,1,0,0),K||!x?ee.clearRect(0,0,e.canvasWidth,e.canvasHeight):L(ee,0,0,e.canvasWidth,e.canvasHeight);var ae=m;ee.drawImage(Z,0,0,e.canvasWidth*ae,e.canvasHeight*ae,0,0,e.canvasWidth,e.canvasHeight)},"drawMotionBlur");(f[e.NODE]||$[e.NODE])&&(ue(te,Y,$[e.NODE]),f[e.NODE]=!1),(f[e.DRAG]||$[e.DRAG])&&(ue(oe,J,$[e.DRAG]),f[e.DRAG]=!1)}e.prevViewport=A,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),p&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!d,e.mbFrames=0,f[e.NODE]=!0,f[e.DRAG]=!0,e.redraw()},tqe)),n||r.emit("render")};us.drawSelectionRectangle=function(t,e){var r=this,n=r.cy,i=r.data,a=n.style(),s=t.drawOnlyNodeLayer,l=t.drawAllLayers,u=i.canvasNeedsRedraw,h=t.forcedContext;if(r.showFps||!s&&u[r.SELECT_BOX]&&!l){var f=h||i.contexts[r.SELECT_BOX];if(e(f),r.selection[4]==1&&(r.hoverData.selecting||r.touchData.selecting)){var d=r.cy.zoom(),p=a.core("selection-box-border-width").value/d;f.lineWidth=p,f.fillStyle="rgba("+a.core("selection-box-color").value[0]+","+a.core("selection-box-color").value[1]+","+a.core("selection-box-color").value[2]+","+a.core("selection-box-opacity").value+")",f.fillRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]),p>0&&(f.strokeStyle="rgba("+a.core("selection-box-border-color").value[0]+","+a.core("selection-box-border-color").value[1]+","+a.core("selection-box-border-color").value[2]+","+a.core("selection-box-opacity").value+")",f.strokeRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]))}if(i.bgActivePosistion&&!r.hoverData.selecting){var d=r.cy.zoom(),m=i.bgActivePosistion;f.fillStyle="rgba("+a.core("active-bg-color").value[0]+","+a.core("active-bg-color").value[1]+","+a.core("active-bg-color").value[2]+","+a.core("active-bg-opacity").value+")",f.beginPath(),f.arc(m.x,m.y,a.core("active-bg-size").pfValue/d,0,2*Math.PI),f.fill()}var g=r.lastRedrawTime;if(r.showFps&&g){g=Math.round(g);var y=Math.round(1e3/g),v="1 frame = "+g+" ms = "+y+" fps";if(f.setTransform(1,0,0,1,0,0),f.fillStyle="rgba(255, 0, 0, 0.75)",f.strokeStyle="rgba(255, 0, 0, 0.75)",f.font="30px Arial",!j2){var x=f.measureText(v);j2=x.actualBoundingBoxAscent}f.fillText(v,0,j2);var b=60;f.strokeRect(0,j2+10,250,20),f.fillRect(0,j2+10,250*Math.min(y/b,1),20)}l||(u[r.SELECT_BOX]=!1)}};o(Qce,"compileShader");o(rqe,"createProgram");o(nqe,"createTextureCanvas");o(MI,"getEffectivePanZoom");o(iqe,"getEffectiveZoom");o(aqe,"modelToRenderedPosition");o(sqe,"isSimpleShape");o(oqe,"arrayEqual");o(dp,"toWebGLColor");o(Zm,"indexToVec4");o(lqe,"vec4ToIndex");o(cqe,"createTexture");o(Bhe,"getTypeInfo");o(Fhe,"createTypedArray");o(uqe,"createTypedArrayView");o(hqe,"createBufferStaticDraw");o(Mc,"createBufferDynamicDraw");o(fqe,"create3x3MatrixBufferDynamicDraw");o(dqe,"createPickingFrameBuffer");Zce=typeof Float32Array<"u"?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});o(BM,"create");o(Jce,"identity");o(pqe,"multiply");o(Yk,"translate");o(eue,"rotate");o(aI,"scale");o(mqe,"projection");gqe=(function(){function t(e,r,n,i){Af(this,t),this.debugID=Math.floor(Math.random()*1e4),this.r=e,this.texSize=r,this.texRows=n,this.texHeight=Math.floor(r/n),this.enableWrapping=!0,this.locked=!1,this.texture=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=i(e,r,r),this.scratch=i(e,r,this.texHeight,"scratch")}return o(t,"Atlas"),_f(t,[{key:"lock",value:o(function(){this.locked=!0},"lock")},{key:"getKeys",value:o(function(){return new Set(this.keyToLocation.keys())},"getKeys")},{key:"getScale",value:o(function(r){var n=r.w,i=r.h,a=this.texHeight,s=this.texSize,l=a/i,u=n*l,h=i*l;return u>s&&(l=s/n,u=n*l,h=i*l),{scale:l,texW:u,texH:h}},"getScale")},{key:"draw",value:o(function(r,n,i){var a=this;if(this.locked)throw new Error("can't draw, atlas is locked");var s=this.texSize,l=this.texRows,u=this.texHeight,h=this.getScale(n),f=h.scale,d=h.texW,p=h.texH,m=o(function(T,S){if(i&&S){var w=S.context,k=T.x,A=T.row,C=k,R=u*A;w.save(),w.translate(C,R),w.scale(f,f),i(w,n),w.restore()}},"drawAt"),g=[null,null],y=o(function(){m(a.freePointer,a.canvas),g[0]={x:a.freePointer.x,y:a.freePointer.row*u,w:d,h:p},g[1]={x:a.freePointer.x+d,y:a.freePointer.row*u,w:0,h:p},a.freePointer.x+=d,a.freePointer.x==s&&(a.freePointer.x=0,a.freePointer.row++)},"drawNormal"),v=o(function(){var T=a.scratch,S=a.canvas;T.clear(),m({x:0,row:0},T);var w=s-a.freePointer.x,k=d-w,A=u;{var C=a.freePointer.x,R=a.freePointer.row*u,I=w;S.context.drawImage(T,0,0,I,A,C,R,I,A),g[0]={x:C,y:R,w:I,h:p}}{var L=w,E=(a.freePointer.row+1)*u,D=k;S&&S.context.drawImage(T,L,0,D,A,0,E,D,A),g[1]={x:0,y:E,w:D,h:p}}a.freePointer.x=k,a.freePointer.row++},"drawWrapped"),x=o(function(){a.freePointer.x=0,a.freePointer.row++},"moveToStartOfNextRow");if(this.freePointer.x+d<=s)y();else{if(this.freePointer.row>=l-1)return!1;this.freePointer.x===s?(x(),y()):this.enableWrapping?v():(x(),y())}return this.keyToLocation.set(r,g),this.needsBuffer=!0,g},"draw")},{key:"getOffsets",value:o(function(r){return this.keyToLocation.get(r)},"getOffsets")},{key:"isEmpty",value:o(function(){return this.freePointer.x===0&&this.freePointer.row===0},"isEmpty")},{key:"canFit",value:o(function(r){if(this.locked)return!1;var n=this.texSize,i=this.texRows,a=this.getScale(r),s=a.texW;return this.freePointer.x+s>n?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},a=i.forceRedraw,s=a===void 0?!1:a,l=i.filterEle,u=l===void 0?function(){return!0}:l,h=i.filterType,f=h===void 0?function(){return!0}:h,d=!1,p=!1,m=qs(r),g;try{for(m.s();!(g=m.n()).done;){var y=g.value;if(u(y)){var v=qs(this.renderTypes.values()),x;try{var b=o(function(){var S=x.value,w=S.type;if(f(w)){var k=n.collections.get(S.collection),A=S.getKey(y),C=Array.isArray(A)?A:[A];if(s)C.forEach(function(E){return k.markKeyForGC(E)}),p=!0;else{var R=S.getID?S.getID(y):y.id(),I=n._key(w,R),L=n.typeAndIdToKey.get(I);L!==void 0&&!oqe(C,L)&&(d=!0,n.typeAndIdToKey.delete(I),L.forEach(function(E){return k.markKeyForGC(E)}))}}},"_loop2");for(v.s();!(x=v.n()).done;)b()}catch(T){v.e(T)}finally{v.f()}}}}catch(T){m.e(T)}finally{m.f()}return p&&(this.gc(),d=!1),d},"invalidate")},{key:"gc",value:o(function(){var r=qs(this.collections.values()),n;try{for(r.s();!(n=r.n()).done;){var i=n.value;i.gc()}}catch(a){r.e(a)}finally{r.f()}},"gc")},{key:"getOrCreateAtlas",value:o(function(r,n,i,a){var s=this.renderTypes.get(n),l=this.collections.get(s.collection),u=!1,h=l.draw(a,i,function(p){s.drawClipped?(p.save(),p.beginPath(),p.rect(0,0,i.w,i.h),p.clip(),s.drawElement(p,r,i,!0,!0),p.restore()):s.drawElement(p,r,i,!0,!0),u=!0});if(u){var f=s.getID?s.getID(r):r.id(),d=this._key(n,f);this.typeAndIdToKey.has(d)?this.typeAndIdToKey.get(d).push(a):this.typeAndIdToKey.set(d,[a])}return h},"getOrCreateAtlas")},{key:"getAtlasInfo",value:o(function(r,n){var i=this,a=this.renderTypes.get(n),s=a.getKey(r),l=Array.isArray(s)?s:[s];return l.map(function(u){var h=a.getBoundingBox(r,u),f=i.getOrCreateAtlas(r,n,h,u),d=f.getOffsets(u),p=_i(d,2),m=p[0],g=p[1];return{atlas:f,tex:m,tex1:m,tex2:g,bb:h}})},"getAtlasInfo")},{key:"getDebugInfo",value:o(function(){var r=[],n=qs(this.collections),i;try{for(n.s();!(i=n.n()).done;){var a=_i(i.value,2),s=a[0],l=a[1],u=l.getCounts(),h=u.keyCount,f=u.atlasCount;r.push({type:s,keyCount:h,atlasCount:f})}}catch(d){n.e(d)}finally{n.f()}return r},"getDebugInfo")}])})(),bqe=(function(){function t(e){Af(this,t),this.globalOptions=e,this.atlasSize=e.webglTexSize,this.maxAtlasesPerBatch=e.webglTexPerBatch,this.batchAtlases=[]}return o(t,"AtlasBatchManager"),_f(t,[{key:"getMaxAtlasesPerBatch",value:o(function(){return this.maxAtlasesPerBatch},"getMaxAtlasesPerBatch")},{key:"getAtlasSize",value:o(function(){return this.atlasSize},"getAtlasSize")},{key:"getIndexArray",value:o(function(){return Array.from({length:this.maxAtlasesPerBatch},function(r,n){return n})},"getIndexArray")},{key:"startBatch",value:o(function(){this.batchAtlases=[]},"startBatch")},{key:"getAtlasCount",value:o(function(){return this.batchAtlases.length},"getAtlasCount")},{key:"getAtlases",value:o(function(){return this.batchAtlases},"getAtlases")},{key:"canAddToCurrentBatch",value:o(function(r){return this.batchAtlases.length===this.maxAtlasesPerBatch?this.batchAtlases.includes(r):!0},"canAddToCurrentBatch")},{key:"getAtlasIndexForBatch",value:o(function(r){var n=this.batchAtlases.indexOf(r);if(n<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(r),n=this.batchAtlases.length-1}return n},"getAtlasIndexForBatch")}])})(),Tqe=` + float circleSD(vec2 p, float r) { + return distance(vec2(0), p) - r; // signed distance + } +`,wqe=` + float rectangleSD(vec2 p, vec2 b) { + vec2 d = abs(p)-b; + return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0); + } +`,kqe=` + float roundRectangleSD(vec2 p, vec2 b, vec4 cr) { + cr.xy = (p.x > 0.0) ? cr.xy : cr.zw; + cr.x = (p.y > 0.0) ? cr.x : cr.y; + vec2 q = abs(p) - b + cr.x; + return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x; + } +`,Eqe=` + float ellipseSD(vec2 p, vec2 ab) { + p = abs( p ); // symmetry + + // find root with Newton solver + vec2 q = ab*(p-ab); + float w = (q.x1.0) ? d : -d; + } +`,nx={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},sE={IGNORE:1,USE_BB:2},FM=0,tue=1,rue=2,$M=3,Jm=4,Pk=5,K2=6,Q2=7,Sqe=(function(){function t(e,r,n){Af(this,t),this.r=e,this.gl=r,this.maxInstances=n.webglBatchSize,this.atlasSize=n.webglTexSize,this.bgColor=n.bgColor,this.debug=n.webglDebug,this.batchDebugInfo=[],n.enableWrapping=!0,n.createTextureCanvas=nqe,this.atlasManager=new xqe(e,n),this.batchManager=new bqe(n),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(nx.SCREEN),this.pickingProgram=this._createShaderProgram(nx.PICKING),this.vao=this._createVAO()}return o(t,"ElementDrawingWebGL"),_f(t,[{key:"addAtlasCollection",value:o(function(r,n){this.atlasManager.addAtlasCollection(r,n)},"addAtlasCollection")},{key:"addTextureAtlasRenderType",value:o(function(r,n){this.atlasManager.addRenderType(r,n)},"addTextureAtlasRenderType")},{key:"addSimpleShapeRenderType",value:o(function(r,n){this.simpleShapeOptions.set(r,n)},"addSimpleShapeRenderType")},{key:"invalidate",value:o(function(r){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=n.type,a=this.atlasManager;return i?a.invalidate(r,{filterType:o(function(l){return l===i},"filterType"),forceRedraw:!0}):a.invalidate(r)},"invalidate")},{key:"gc",value:o(function(){this.atlasManager.gc()},"gc")},{key:"_createShaderProgram",value:o(function(r){var n=this.gl,i=`#version 300 es + precision highp float; + + uniform mat3 uPanZoomMatrix; + uniform int uAtlasSize; + + // instanced + in vec2 aPosition; // a vertex from the unit square + + in mat3 aTransform; // used to transform verticies, eg into a bounding box + in int aVertType; // the type of thing we are rendering + + // the z-index that is output when using picking mode + in vec4 aIndex; + + // For textures + in int aAtlasId; // which shader unit/atlas to use + in vec4 aTex; // x/y/w/h of texture in atlas + + // for edges + in vec4 aPointAPointB; + in vec4 aPointCPointD; + in vec2 aLineWidth; // also used for node border width + + // simple shapes + in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left] + in vec4 aColor; // also used for edges + in vec4 aBorderColor; // aLineWidth is used for border width + + // output values passed to the fragment shader + out vec2 vTexCoord; + out vec4 vColor; + out vec2 vPosition; + // flat values are not interpolated + flat out int vAtlasId; + flat out int vVertType; + flat out vec2 vTopRight; + flat out vec2 vBotLeft; + flat out vec4 vCornerRadius; + flat out vec4 vBorderColor; + flat out vec2 vBorderWidth; + flat out vec4 vIndex; + + void main(void) { + int vid = gl_VertexID; + vec2 position = aPosition; // TODO make this a vec3, simplifies some code below + + if(aVertType == `.concat(FM,`) { + float texX = aTex.x; // texture coordinates + float texY = aTex.y; + float texW = aTex.z; + float texH = aTex.w; + + if(vid == 1 || vid == 2 || vid == 4) { + texX += texW; + } + if(vid == 2 || vid == 4 || vid == 5) { + texY += texH; + } + + float d = float(uAtlasSize); + vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(Jm," || aVertType == ").concat(Q2,` + || aVertType == `).concat(Pk," || aVertType == ").concat(K2,`) { // simple shapes + + // the bounding box is needed by the fragment shader + vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat + vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat + vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated + + // calculations are done in the fragment shader, just pass these along + vColor = aColor; + vCornerRadius = aCornerRadius; + vBorderColor = aBorderColor; + vBorderWidth = aLineWidth; + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(tue,`) { + vec2 source = aPointAPointB.xy; + vec2 target = aPointAPointB.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + // stretch the unit square into a long skinny rectangle + vec2 xBasis = target - source; + vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); + vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y; + + gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); + vColor = aColor; + } + else if(aVertType == `).concat(rue,`) { + vec2 pointA = aPointAPointB.xy; + vec2 pointB = aPointAPointB.zw; + vec2 pointC = aPointCPointD.xy; + vec2 pointD = aPointCPointD.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + vec2 p0, p1, p2, pos; + if(position.x == 0.0) { // The left side of the unit square + p0 = pointA; + p1 = pointB; + p2 = pointC; + pos = position; + } else { // The right side of the unit square, use same approach but flip the geometry upside down + p0 = pointD; + p1 = pointC; + p2 = pointB; + pos = vec2(0.0, -position.y); + } + + vec2 p01 = p1 - p0; + vec2 p12 = p2 - p1; + vec2 p21 = p1 - p2; + + // Find the normal vector. + vec2 tangent = normalize(normalize(p12) + normalize(p01)); + vec2 normal = vec2(-tangent.y, tangent.x); + + // Find the vector perpendicular to p0 -> p1. + vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); + + // Determine the bend direction. + float sigma = sign(dot(p01 + p21, normal)); + float width = aLineWidth[0]; + + if(sign(pos.y) == -sigma) { + // This is an intersecting vertex. Adjust the position so that there's no overlap. + vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } else { + // This is a non-intersecting vertex. Treat it like a mitre join. + vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } + + vColor = aColor; + } + else if(aVertType == `).concat($M,` && vid < 3) { + // massage the first triangle into an edge arrow + if(vid == 0) + position = vec2(-0.15, -0.3); + if(vid == 1) + position = vec2( 0.0, 0.0); + if(vid == 2) + position = vec2( 0.15, -0.3); + + gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0); + vColor = aColor; + } + else { + gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space + } + + vAtlasId = aAtlasId; + vVertType = aVertType; + vIndex = aIndex; + } + `),a=this.batchManager.getIndexArray(),s=`#version 300 es + precision highp float; + + // declare texture unit for each texture atlas in the batch + `.concat(a.map(function(h){return"uniform sampler2D uTexture".concat(h,";")}).join(` + `),` + + uniform vec4 uBGColor; + uniform float uZoom; + + in vec2 vTexCoord; + in vec4 vColor; + in vec2 vPosition; // model coordinates + + flat in int vAtlasId; + flat in vec4 vIndex; + flat in int vVertType; + flat in vec2 vTopRight; + flat in vec2 vBotLeft; + flat in vec4 vCornerRadius; + flat in vec4 vBorderColor; + flat in vec2 vBorderWidth; + + out vec4 outColor; + + `).concat(Tqe,` + `).concat(wqe,` + `).concat(kqe,` + `).concat(Eqe,` + + vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha + return vec4( + top.rgb + (bot.rgb * (1.0 - top.a)), + top.a + (bot.a * (1.0 - top.a)) + ); + } + + vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance + // scale to the zoom level so that borders don't look blurry when zoomed in + // note 1.5 is an aribitrary value chosen because it looks good + return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); + } + + void main(void) { + if(vVertType == `).concat(FM,`) { + // look up the texel from the texture unit + `).concat(a.map(function(h){return"if(vAtlasId == ".concat(h,") outColor = texture(uTexture").concat(h,", vTexCoord);")}).join(` + else `),` + } + else if(vVertType == `).concat($M,`) { + // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out'; + outColor = blend(vColor, uBGColor); + outColor.a = 1.0; // make opaque, masks out line under arrow + } + else if(vVertType == `).concat(Jm,` && vBorderWidth == vec2(0.0)) { // simple rectangle with no border + outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done + } + else if(vVertType == `).concat(Jm," || vVertType == ").concat(Q2,` + || vVertType == `).concat(Pk," || vVertType == ").concat(K2,`) { // use SDF + + float outerBorder = vBorderWidth[0]; + float innerBorder = vBorderWidth[1]; + float borderPadding = outerBorder * 2.0; + float w = vTopRight.x - vBotLeft.x - borderPadding; + float h = vTopRight.y - vBotLeft.y - borderPadding; + vec2 b = vec2(w/2.0, h/2.0); // half width, half height + vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center + + float d; // signed distance + if(vVertType == `).concat(Jm,`) { + d = rectangleSD(p, b); + } else if(vVertType == `).concat(Q2,` && w == h) { + d = circleSD(p, b.x); // faster than ellipse + } else if(vVertType == `).concat(Q2,`) { + d = ellipseSD(p, b); + } else { + d = roundRectangleSD(p, b, vCornerRadius.wzyx); + } + + // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling + // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box + if(d > 0.0) { + if(d > outerBorder) { + discard; + } else { + outColor = distInterp(vBorderColor, vec4(0), d - outerBorder); + } + } else { + if(d > innerBorder) { + vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor; + vec4 innerBorderColor = blend(vBorderColor, vColor); + outColor = distInterp(innerBorderColor, outerColor, d); + } + else { + vec4 outerColor; + if(innerBorder == 0.0 && outerBorder == 0.0) { + outerColor = vec4(0); + } else if(innerBorder == 0.0) { + outerColor = vBorderColor; + } else { + outerColor = blend(vBorderColor, vColor); + } + outColor = distInterp(vColor, outerColor, d - innerBorder); + } + } + } + else { + outColor = vColor; + } + + `).concat(r.picking?`if(outColor.a == 0.0) discard; + else outColor = vIndex;`:"",` + } + `),l=rqe(n,i,s);l.aPosition=n.getAttribLocation(l,"aPosition"),l.aIndex=n.getAttribLocation(l,"aIndex"),l.aVertType=n.getAttribLocation(l,"aVertType"),l.aTransform=n.getAttribLocation(l,"aTransform"),l.aAtlasId=n.getAttribLocation(l,"aAtlasId"),l.aTex=n.getAttribLocation(l,"aTex"),l.aPointAPointB=n.getAttribLocation(l,"aPointAPointB"),l.aPointCPointD=n.getAttribLocation(l,"aPointCPointD"),l.aLineWidth=n.getAttribLocation(l,"aLineWidth"),l.aColor=n.getAttribLocation(l,"aColor"),l.aCornerRadius=n.getAttribLocation(l,"aCornerRadius"),l.aBorderColor=n.getAttribLocation(l,"aBorderColor"),l.uPanZoomMatrix=n.getUniformLocation(l,"uPanZoomMatrix"),l.uAtlasSize=n.getUniformLocation(l,"uAtlasSize"),l.uBGColor=n.getUniformLocation(l,"uBGColor"),l.uZoom=n.getUniformLocation(l,"uZoom"),l.uTextures=[];for(var u=0;u1&&arguments[1]!==void 0?arguments[1]:nx.SCREEN;this.panZoomMatrix=r,this.renderTarget=n,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()},"startFrame")},{key:"startBatch",value:o(function(){this.instanceCount=0,this.batchManager.startBatch()},"startBatch")},{key:"endFrame",value:o(function(){this.endBatch()},"endFrame")},{key:"_isVisible",value:o(function(r,n){return r.visible()?n&&n.isVisible?n.isVisible(r):!0:!1},"_isVisible")},{key:"drawTexture",value:o(function(r,n,i){var a=this.atlasManager,s=this.batchManager,l=a.getRenderTypeOpts(i);if(this._isVisible(r,l)&&!(r.isEdge()&&!this._isValidEdge(r))){if(this.renderTarget.picking&&l.getTexPickingMode){var u=l.getTexPickingMode(r);if(u===sE.IGNORE)return;if(u==sE.USE_BB){this.drawPickingRectangle(r,n,i);return}}var h=a.getAtlasInfo(r,i),f=qs(h),d;try{for(f.s();!(d=f.n()).done;){var p=d.value,m=p.atlas,g=p.tex1,y=p.tex2;s.canAddToCurrentBatch(m)||this.endBatch();for(var v=s.getAtlasIndexForBatch(m),x=0,b=[[g,!0],[y,!1]];x=this.maxInstances&&this.endBatch()}}}}catch(L){f.e(L)}finally{f.f()}}},"drawTexture")},{key:"setTransformMatrix",value:o(function(r,n,i,a){var s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,l=0;if(i.shapeProps&&i.shapeProps.padding&&(l=r.pstyle(i.shapeProps.padding).pfValue),a){var u=a.bb,h=a.tex1,f=a.tex2,d=h.w/(h.w+f.w);s||(d=1-d);var p=this._getAdjustedBB(u,l,s,d);this._applyTransformMatrix(n,p,i,r)}else{var m=i.getBoundingBox(r),g=this._getAdjustedBB(m,l,!0,1);this._applyTransformMatrix(n,g,i,r)}},"setTransformMatrix")},{key:"_applyTransformMatrix",value:o(function(r,n,i,a){var s,l;Jce(r);var u=i.getRotation?i.getRotation(a):0;if(u!==0){var h=i.getRotationPoint(a),f=h.x,d=h.y;Yk(r,r,[f,d]),eue(r,r,u);var p=i.getRotationOffset(a);s=p.x+(n.xOffset||0),l=p.y+(n.yOffset||0)}else s=n.x1,l=n.y1;Yk(r,r,[s,l]),aI(r,r,[n.w,n.h])},"_applyTransformMatrix")},{key:"_getAdjustedBB",value:o(function(r,n,i,a){var s=r.x1,l=r.y1,u=r.w,h=r.h,f=r.yOffset;n&&(s-=n,l-=n,u+=2*n,h+=2*n);var d=0,p=u*a;return i&&a<1?u=p:!i&&a<1&&(d=u-p,s+=d,u=p),{x1:s,y1:l,w:u,h,xOffset:d,yOffset:f}},"_getAdjustedBB")},{key:"drawPickingRectangle",value:o(function(r,n,i){var a=this.atlasManager.getRenderTypeOpts(i),s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=Jm;var l=this.indexBuffer.getView(s);Zm(n,l);var u=this.colorBuffer.getView(s);dp([0,0,0],1,u);var h=this.transformBuffer.getMatrixView(s);this.setTransformMatrix(r,h,a),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()},"drawPickingRectangle")},{key:"drawNode",value:o(function(r,n,i){var a=this.simpleShapeOptions.get(i);if(this._isVisible(r,a)){var s=a.shapeProps,l=this._getVertTypeForShape(r,s.shape);if(l===void 0||a.isSimple&&!a.isSimple(r)){this.drawTexture(r,n,i);return}var u=this.instanceCount;if(this.vertTypeBuffer.getView(u)[0]=l,l===Pk||l===K2){var h=a.getBoundingBox(r),f=this._getCornerRadius(r,s.radius,h),d=this.cornerRadiusBuffer.getView(u);d[0]=f,d[1]=f,d[2]=f,d[3]=f,l===K2&&(d[0]=0,d[2]=0)}var p=this.indexBuffer.getView(u);Zm(n,p);var m=r.pstyle(s.color).value,g=r.pstyle(s.opacity).value,y=this.colorBuffer.getView(u);dp(m,g,y);var v=this.lineWidthBuffer.getView(u);if(v[0]=0,v[1]=0,s.border){var x=r.pstyle("border-width").value;if(x>0){var b=r.pstyle("border-color").value,T=r.pstyle("border-opacity").value,S=this.borderColorBuffer.getView(u);dp(b,T,S);var w=r.pstyle("border-position").value;if(w==="inside")v[0]=0,v[1]=-x;else if(w==="outside")v[0]=x,v[1]=0;else{var k=x/2;v[0]=k,v[1]=-k}}}var A=this.transformBuffer.getMatrixView(u);this.setTransformMatrix(r,A,a),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},"drawNode")},{key:"_getVertTypeForShape",value:o(function(r,n){var i=r.pstyle(n).value;switch(i){case"rectangle":return Jm;case"ellipse":return Q2;case"roundrectangle":case"round-rectangle":return Pk;case"bottom-round-rectangle":return K2;default:return}},"_getVertTypeForShape")},{key:"_getCornerRadius",value:o(function(r,n,i){var a=i.w,s=i.h;if(r.pstyle(n).value==="auto")return kf(a,s);var l=r.pstyle(n).pfValue,u=a/2,h=s/2;return Math.min(l,h,u)},"_getCornerRadius")},{key:"drawEdgeArrow",value:o(function(r,n,i){if(r.visible()){var a=r._private.rscratch,s,l,u;if(i==="source"?(s=a.arrowStartX,l=a.arrowStartY,u=a.srcArrowAngle):(s=a.arrowEndX,l=a.arrowEndY,u=a.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(l)||l==null||isNaN(u)||u==null)){var h=r.pstyle(i+"-arrow-shape").value;if(h!=="none"){var f=r.pstyle(i+"-arrow-color").value,d=r.pstyle("opacity").value,p=r.pstyle("line-opacity").value,m=d*p,g=r.pstyle("width").pfValue,y=r.pstyle("arrow-scale").value,v=this.r.getArrowWidth(g,y),x=this.instanceCount,b=this.transformBuffer.getMatrixView(x);Jce(b),Yk(b,b,[s,l]),aI(b,b,[v,v]),eue(b,b,u),this.vertTypeBuffer.getView(x)[0]=$M;var T=this.indexBuffer.getView(x);Zm(n,T);var S=this.colorBuffer.getView(x);dp(f,m,S),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},"drawEdgeArrow")},{key:"drawEdgeLine",value:o(function(r,n){if(r.visible()){var i=this._getEdgePoints(r);if(i){var a=r.pstyle("opacity").value,s=r.pstyle("line-opacity").value,l=r.pstyle("width").pfValue,u=r.pstyle("line-color").value,h=a*s;if(i.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),i.length==4){var f=this.instanceCount;this.vertTypeBuffer.getView(f)[0]=tue;var d=this.indexBuffer.getView(f);Zm(n,d);var p=this.colorBuffer.getView(f);dp(u,h,p);var m=this.lineWidthBuffer.getView(f);m[0]=l;var g=this.pointAPointBBuffer.getView(f);g[0]=i[0],g[1]=i[1],g[2]=i[2],g[3]=i[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}}}},"drawEdgeLine")},{key:"_isValidEdge",value:o(function(r){var n=r._private.rscratch;return!(n.badLine||n.allpts==null||isNaN(n.allpts[0]))},"_isValidEdge")},{key:"_getEdgePoints",value:o(function(r){var n=r._private.rscratch;if(this._isValidEdge(r)){var i=n.allpts;if(i.length==4)return i;var a=this._getNumSegments(r);return this._getCurveSegmentPoints(i,a)}},"_getEdgePoints")},{key:"_getNumSegments",value:o(function(r){var n=15;return Math.min(Math.max(n,5),this.maxInstances)},"_getNumSegments")},{key:"_getCurveSegmentPoints",value:o(function(r,n){if(r.length==4)return r;for(var i=Array((n+1)*2),a=0;a<=n;a++)if(a==0)i[0]=r[0],i[1]=r[1];else if(a==n)i[a*2]=r[r.length-2],i[a*2+1]=r[r.length-1];else{var s=a/n;this._setCurvePoint(r,s,i,a*2)}return i},"_getCurveSegmentPoints")},{key:"_setCurvePoint",value:o(function(r,n,i,a){if(r.length<=2)i[a]=r[0],i[a+1]=r[1];else{for(var s=Array(r.length-2),l=0;l0}},"isLayerVisible"),l=o(function(d){var p=d.pstyle("text-events").strValue==="yes";return p?sE.USE_BB:sE.IGNORE},"getTexPickingMode"),u=o(function(d){var p=d.position(),m=p.x,g=p.y,y=d.outerWidth(),v=d.outerHeight();return{w:y,h:v,x1:m-y/2,y1:g-v/2}},"getBBForSimpleShape");r.drawing.addAtlasCollection("node",{texRows:t.webglTexRowsNodes}),r.drawing.addAtlasCollection("label",{texRows:t.webglTexRows}),r.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement}),r.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:u,isSimple:sqe,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),r.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:u,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),r.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:u,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),r.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:l,getKey:zM(e.getLabelKey,null),getBoundingBox:GM(e.getLabelBox,null),drawClipped:!0,drawElement:e.drawLabel,getRotation:i(null),getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:a("label")}),r.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:l,getKey:zM(e.getSourceLabelKey,"source"),getBoundingBox:GM(e.getSourceLabelBox,"source"),drawClipped:!0,drawElement:e.drawSourceLabel,getRotation:i("source"),getRotationPoint:e.getSourceLabelRotationPoint,getRotationOffset:e.getSourceLabelRotationOffset,isVisible:a("source-label")}),r.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:l,getKey:zM(e.getTargetLabelKey,"target"),getBoundingBox:GM(e.getTargetLabelBox,"target"),drawClipped:!0,drawElement:e.drawTargetLabel,getRotation:i("target"),getRotationPoint:e.getTargetLabelRotationPoint,getRotationOffset:e.getTargetLabelRotationOffset,isVisible:a("target-label")});var h=xx(function(){console.log("garbage collect flag set"),r.data.gc=!0},1e4);r.onUpdateEleCalcs(function(f,d){var p=!1;d&&d.length>0&&(p|=r.drawing.invalidate(d)),p&&h()}),Aqe(r)};o(Cqe,"getBGColor");o(zhe,"getLabelLines");zM=o(function(e,r){return function(n){var i=e(n),a=zhe(n,r);return a.length>1?a.map(function(s,l){return"".concat(i,"_").concat(l)}):i}},"getStyleKeysForLabel"),GM=o(function(e,r){return function(n,i){var a=e(n);if(typeof i=="string"){var s=i.indexOf("_");if(s>0){var l=Number(i.substring(s+1)),u=zhe(n,r),h=a.h/u.length,f=h*l,d=a.y1+f;return{x1:a.x1,w:a.w,y1:d,h,yOffset:f}}}return a}},"getBoundingBoxForLabel");o(Aqe,"overrideCanvasRendererFunctions");o(_qe,"clearWebgl");o(Dqe,"clearCanvas");o(Lqe,"createPanZoomMatrix");o(Ghe,"setContextTransform");o(Rqe,"drawSelectionRectangle");o(Nqe,"drawAxes");o(Mqe,"drawAtlases");o(Iqe,"getPickingIndexes");o(Oqe,"findNearestElementsWebgl");o(VM,"drawEle");o(Vhe,"renderWebgl");Rf={};Rf.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,l=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+l*a[1]);for(var u=1;u0&&s>0){m.clearRect(0,0,a,s),m.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)m.translate(-n.x1*h,-n.y1*h),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(n.x1*h,n.y1*h);else{var y=e.pan(),v={x:y.x*h,y:y.y*h};h*=e.zoom(),m.translate(v.x,v.y),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(-v.x,-v.y)}t.bg&&(m.globalCompositeOperation="destination-over",m.fillStyle=t.bg,m.rect(0,0,a,s),m.fill())}return p};o(Pqe,"b64ToBlob");o(aue,"b64UriToB64");o(Hhe,"output");Sx.png=function(t){return Hhe(t,this.bufferCanvasImage(t),"image/png")};Sx.jpg=function(t){return Hhe(t,this.bufferCanvasImage(t),"image/jpeg")};qhe={};qhe.nodeShapeImpl=function(t,e,r,n,i,a,s,l){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,l);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,l);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,l);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,l);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};Bqe=Whe,Cr=Whe.prototype;Cr.CANVAS_LAYERS=3;Cr.SELECT_BOX=0;Cr.DRAG=1;Cr.NODE=2;Cr.WEBGL=3;Cr.CANVAS_TYPES=["2d","2d","2d","webgl2"];Cr.BUFFER_COUNT=3;Cr.TEXTURE_BUFFER=0;Cr.MOTIONBLUR_BUFFER_NODE=1;Cr.MOTIONBLUR_BUFFER_DRAG=2;o(Whe,"CanvasRenderer");Cr.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Cr.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Cr.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Cr.SELECT_BOX]=e;break;case"gc":r.data.gc=!0;break}};Fqe=typeof Path2D<"u";Cr.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Cr.usePaths=function(){return Fqe&&this.pathsEnabled};Cr.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Cr.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Cr.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":$i(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[Ihe,Fc,Hu,NI,Cp,Lf,us,$he,Rf,Sx,qhe].forEach(function(t){ir(Cr,t)});$qe=[{name:"null",impl:bhe},{name:"base",impl:Lhe},{name:"canvas",impl:Bqe}],zqe=[{type:"layout",extensions:hHe},{type:"renderer",extensions:$qe}],Yhe={},Xhe={};o(jhe,"setExtension");o(Khe,"getExtension");o(Gqe,"setModule");o(Vqe,"getModule");lI=o(function(){if(arguments.length===2)return Khe.apply(null,arguments);if(arguments.length===3)return jhe.apply(null,arguments);if(arguments.length===4)return Vqe.apply(null,arguments);if(arguments.length===5)return Gqe.apply(null,arguments);Kn("Invalid extension access syntax")},"extension");fx.prototype.extension=lI;zqe.forEach(function(t){t.extensions.forEach(function(e){jhe(t.type,e.name,e.impl)})});oE=o(function(){if(!(this instanceof oE))return new oE;this.length=0},"Stylesheet"),Ep=oE.prototype;Ep.instanceString=function(){return"stylesheet"};Ep.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};Ep.css=function(t,e){var r=this.length-1;if(Jt(t))this[r].properties.push({name:t,value:e});else if(Yr(t))for(var n=t,i=Object.keys(n),a=0;a{"use strict";o((function(e,r){typeof Cx=="object"&&typeof OI=="object"?OI.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Cx=="object"?Cx.layoutBase=r():e.layoutBase=r()}),"webpackUniversalModuleDefinition")(Cx,function(){return(function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)})([(function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s}),(function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(4);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp&&(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)),this.labelHeight>m&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-m)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-m),this.setHeight(this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h}),(function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&k>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(k,1);var S=x.source.owner.getEdges().indexOf(x);if(S==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(S,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),S=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,S,w,k,A,C=this.nodes,R=C.length,I=0;IT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var R=0;v.forEach(function(I){I.owner==g&&R++}),R==this.nodes.length&&(this.isConnected=!0)}},t.exports=p}),(function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=C,!1;if(hf)return l[0]=p,l[1]=h,l[2]=k,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,E=!0):(l[0]=g,l[1]=m,E=!0):_===M&&(u>f?(l[0]=p,l[1]=m,E=!0):(l[0]=x,l[1]=v,E=!0)),-O===M?f>u?(l[2]=A,l[3]=C,D=!0):(l[2]=k,l[3]=w,D=!0):O===M&&(f>u?(l[2]=S,l[3]=w,D=!0):(l[2]=R,l[3]=C,D=!0)),E&&D)return!1;if(u>f?h>d?(P=this.getCardinalDirection(_,M,4),B=this.getCardinalDirection(O,M,2)):(P=this.getCardinalDirection(-_,M,3),B=this.getCardinalDirection(-O,M,1)):h>d?(P=this.getCardinalDirection(-_,M,1),B=this.getCardinalDirection(-O,M,3)):(P=this.getCardinalDirection(_,M,2),B=this.getCardinalDirection(O,M,4)),!E)switch(P){case 1:G=m,F=u+-T/M,l[0]=F,l[1]=G;break;case 2:F=x,G=h+b*M,l[0]=F,l[1]=G;break;case 3:G=v,F=u+T/M,l[0]=F,l[1]=G;break;case 4:F=y,G=h+-b*M,l[0]=F,l[1]=G;break}if(!D)switch(B){case 1:U=w,$=f+-L/M,l[2]=$,l[3]=U;break;case 2:$=R,U=d+I*M,l[2]=$,l[3]=U;break;case 3:U=C,$=f+L/M,l[2]=$,l[3]=U;break;case 4:$=A,U=d+-I*M,l[2]=$,l[3]=U;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,S=void 0,w=void 0,k=void 0,A=void 0,C=void 0,R=void 0;return T=p-f,w=h-d,A=d*f-h*p,S=v-g,k=m-y,C=y*g-m*v,R=T*k-S*w,R===0?null:(x=(w*C-k*A)/R,b=(S*A-T*C)/R,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n}),(function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i}),(function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var k=T[0];T.splice(0,1),b.add(k);for(var A=k.getEdges(),x=0;x-1&&w.splice(L,1)}b=new Set,S=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(C,1);var R=S.getNeighborsList();R.forEach(function(E){if(y.indexOf(E)<0){var D=v.get(E),_=D-1;_==1&&k.push(E),v.set(E,_)}})}y=y.concat(k),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p}),(function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n}),(function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i}),(function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var S=0;Sh},"_defaultCompareFunction")}]),l})();t.exports=s}),(function(t,e,r){"use strict";var n=(function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o((function(e,r){typeof Ax=="object"&&typeof BI=="object"?BI.exports=r(PI()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof Ax=="object"?Ax.coseBase=r(PI()):e.coseBase=r(e.layoutBase)}),"webpackUniversalModuleDefinition")(Ax,function(t){return(function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)})([(function(e,r){e.exports=t}),(function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}o(a,"CoSEConstants");for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a}),(function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEEdge"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).LGraph;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEGraph"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(l){i.call(this,l)}o(a,"CoSEGraphManager"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a}),(function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(u,h,f,d){i.call(this,u,h,f,d)}o(s,"CoSENode"),s.prototype=Object.create(i.prototype);for(var l in i)s[l]=i[l];s.prototype.move=function(){var u=this.graphManager.getLayout();this.displacementX=u.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=u.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementX=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementY=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),u.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(u,h){for(var f=this.getChild().getNodes(),d,p=0;p0)this.positionNodesRadially(w);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(C){return k.has(C)});this.graphManager.setAllNodesToApplyGravitation(A),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%f.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var w=new Set(this.getAllNodes()),k=this.nodesWithGravity.filter(function(R){return w.has(R)});this.graphManager.setAllNodesToApplyGravitation(k),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var A=!this.isTreeGrowing&&!this.isGrowthFinished,C=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(A,C),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var w=this.graphManager.getAllNodes(),k={},A=0;A1){var E;for(E=0;EC&&(C=Math.floor(L.y)),I=Math.floor(L.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new m(d.WORLD_CENTER_X-L.x/2,d.WORLD_CENTER_Y-L.y/2))},T.radialLayout=function(w,k,A){var C=Math.max(this.maxDiagonalInTree(w),h.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(k,null,0,359,0,C);var R=x.calculateBounds(w),I=new b;I.setDeviceOrgX(R.getMinX()),I.setDeviceOrgY(R.getMinY()),I.setWorldOrgX(A.x),I.setWorldOrgY(A.y);for(var L=0;L1;){var j=U[0];U.splice(0,1);var te=P.indexOf(j);te>=0&&P.splice(te,1),G--,B--}k!=null?$=(P.indexOf(U[0])+1)%G:$=0;for(var Y=Math.abs(C-A)/B,oe=$;F!=B;oe=++oe%G){var J=P[oe].getOtherEnd(w);if(J!=k){var ue=(A+F*Y)%360,re=(ue+Y)%360;T.branchRadialLayout(J,w,ue,re,R+I,I),F++}}},T.maxDiagonalInTree=function(w){for(var k=y.MIN_VALUE,A=0;Ak&&(k=R)}return k},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var w=this,k={};this.memberGroups={},this.idToDummyNode={};for(var A=[],C=this.graphManager.getAllNodes(),R=0;R"u"&&(k[E]=[]),k[E]=k[E].concat(I)}Object.keys(k).forEach(function(D){if(k[D].length>1){var _="DummyCompound_"+D;w.memberGroups[_]=k[D];var O=k[D][0].getParent(),M=new l(w.graphManager);M.id=_,M.paddingLeft=O.paddingLeft||0,M.paddingRight=O.paddingRight||0,M.paddingBottom=O.paddingBottom||0,M.paddingTop=O.paddingTop||0,w.idToDummyNode[_]=M;var P=w.getGraphManager().add(w.newGraph(),M),B=O.getChild();B.add(M);for(var F=0;F=0;w--){var k=this.compoundOrder[w],A=k.id,C=k.paddingLeft,R=k.paddingTop;this.adjustLocations(this.tiledMemberPack[A],k.rect.x,k.rect.y,C,R)}},T.prototype.repopulateZeroDegreeMembers=function(){var w=this,k=this.tiledZeroDegreePack;Object.keys(k).forEach(function(A){var C=w.idToDummyNode[A],R=C.paddingLeft,I=C.paddingTop;w.adjustLocations(k[A],C.rect.x,C.rect.y,R,I)})},T.prototype.getToBeTiled=function(w){var k=w.id;if(this.toBeTiled[k]!=null)return this.toBeTiled[k];var A=w.getChild();if(A==null)return this.toBeTiled[k]=!1,!1;for(var C=A.getNodes(),R=0;R0)return this.toBeTiled[k]=!1,!1;if(I.getChild()==null){this.toBeTiled[I.id]=!1;continue}if(!this.getToBeTiled(I))return this.toBeTiled[k]=!1,!1}return this.toBeTiled[k]=!0,!0},T.prototype.getNodeDegree=function(w){for(var k=w.id,A=w.getEdges(),C=0,R=0;RD&&(D=O.rect.height)}A+=D+w.verticalPadding}},T.prototype.tileCompoundMembers=function(w,k){var A=this;this.tiledMemberPack=[],Object.keys(w).forEach(function(C){var R=k[C];A.tiledMemberPack[C]=A.tileNodes(w[C],R.paddingLeft+R.paddingRight),R.rect.width=A.tiledMemberPack[C].width,R.rect.height=A.tiledMemberPack[C].height})},T.prototype.tileNodes=function(w,k){var A=h.TILING_PADDING_VERTICAL,C=h.TILING_PADDING_HORIZONTAL,R={rows:[],rowWidth:[],rowHeight:[],width:0,height:k,verticalPadding:A,horizontalPadding:C};w.sort(function(E,D){return E.rect.width*E.rect.height>D.rect.width*D.rect.height?-1:E.rect.width*E.rect.height0&&(L+=w.horizontalPadding),w.rowWidth[A]=L,w.width0&&(E+=w.verticalPadding);var D=0;E>w.rowHeight[A]&&(D=w.rowHeight[A],w.rowHeight[A]=E,D=w.rowHeight[A]-D),w.height+=D,w.rows[A].push(k)},T.prototype.getShortestRowIndex=function(w){for(var k=-1,A=Number.MAX_VALUE,C=0;CA&&(k=C,A=w.rowWidth[C]);return k},T.prototype.canAddHorizontal=function(w,k,A){var C=this.getShortestRowIndex(w);if(C<0)return!0;var R=w.rowWidth[C];if(R+w.horizontalPadding+k<=w.width)return!0;var I=0;w.rowHeight[C]0&&(I=A+w.verticalPadding-w.rowHeight[C]);var L;w.width-R>=k+w.horizontalPadding?L=(w.height+I)/(R+k+w.horizontalPadding):L=(w.height+I)/w.width,I=A+w.verticalPadding;var E;return w.widthI&&k!=A){C.splice(-1,1),w.rows[A].push(R),w.rowWidth[k]=w.rowWidth[k]-I,w.rowWidth[A]=w.rowWidth[A]+I,w.width=w.rowWidth[instance.getLongestRowIndex(w)];for(var L=Number.MIN_VALUE,E=0;EL&&(L=C[E].height);k>0&&(L+=w.verticalPadding);var D=w.rowHeight[k]+w.rowHeight[A];w.rowHeight[k]=L,w.rowHeight[A]0)for(var B=R;B<=I;B++)P[0]+=this.grid[B][L-1].length+this.grid[B][L].length-1;if(I0)for(var B=L;B<=E;B++)P[3]+=this.grid[R-1][B].length+this.grid[R][B].length-1;for(var F=y.MAX_VALUE,G,$,U=0;U{"use strict";o((function(e,r){typeof _x=="object"&&typeof $I=="object"?$I.exports=r(FI()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof _x=="object"?_x.cytoscapeCoseBilkent=r(FI()):e.cytoscapeCoseBilkent=r(e.coseBase)}),"webpackUniversalModuleDefinition")(_x,function(t){return(function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)})([(function(e,r){e.exports=t}),(function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,l=n(0).CoSELayout,u=n(0).CoSENode,h=n(0).layoutBase.PointD,f=n(0).layoutBase.DimensionD,d={ready:o(function(){},"ready"),stop:o(function(){},"stop"),quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function p(v,x){var b={};for(var T in v)b[T]=v[T];for(var T in x)b[T]=x[T];return b}o(p,"extend");function m(v){this.options=p(d,v),g(this.options)}o(m,"_CoSELayout");var g=o(function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal},"getUserOptions");m.prototype.run=function(){var v,x,b=this.options,T=this.idToLNode={},S=this.layout=new l,w=this;w.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var k=S.newGraphManager();this.gm=k;var A=this.options.eles.nodes(),C=this.options.eles.edges();this.root=k.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(A),S);for(var R=0;R0){var E;E=b.getGraphManager().add(b.newGraph(),A),this.processChildrenList(E,k,b)}}},m.prototype.stop=function(){return this.stopped=!0,this};var y=o(function(x){x("layout","cose-bilkent",m)},"register");typeof cytoscape<"u"&&y(cytoscape),e.exports=y})])})});function Hqe(t,e){t.forEach(r=>{let n={id:r.id,labelText:r.label,height:r.height,width:r.width,padding:r.padding??0};Object.keys(r).forEach(i=>{["id","label","height","width","padding","x","y"].includes(i)||(n[i]=r[i])}),e.add({group:"nodes",data:n,position:{x:r.x??0,y:r.y??0}})})}function qqe(t,e){t.forEach(r=>{let n={id:r.id,source:r.start,target:r.end};Object.keys(r).forEach(i=>{["id","start","end"].includes(i)||(n[i]=r[i])}),e.add({group:"edges",data:n})})}function Jhe(t){return new Promise(e=>{let r=qe("body").append("div").attr("id","cy").attr("style","display:none"),n=Ko({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});r.remove(),Hqe(t.nodes,n),qqe(t.edges,n),n.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}});let i={name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1};n.layout(i).run(),n.ready(a=>{X.info("Cytoscape ready",a),e(n)})})}function efe(t){return t.nodes().map(e=>{let r=e.data(),n=e.position(),i={id:r.id,x:n.x,y:n.y};return Object.keys(r).forEach(a=>{a!=="id"&&(i[a]=r[a])}),i})}function tfe(t){return t.edges().map(e=>{let r=e.data(),n=e._private.rscratch,i={id:r.id,source:r.source,target:r.target,startX:n.startX,startY:n.startY,midX:n.midX,midY:n.midY,endX:n.endX,endY:n.endY};return Object.keys(r).forEach(a=>{["id","source","target"].includes(a)||(i[a]=r[a])}),i})}var Zhe,rfe=N(()=>{"use strict";II();Zhe=ja(Qhe(),1);yr();pt();Ko.use(Zhe.default);o(Hqe,"addNodes");o(qqe,"addEdges");o(Jhe,"createCytoscapeInstance");o(efe,"extractPositionedNodes");o(tfe,"extractPositionedEdges")});async function nfe(t,e){X.debug("Starting cose-bilkent layout algorithm");try{Wqe(t);let r=await Jhe(t),n=efe(r),i=tfe(r);return X.debug(`Layout completed: ${n.length} nodes, ${i.length} edges`),{nodes:n,edges:i}}catch(r){throw X.error("Error in cose-bilkent layout algorithm:",r),r}}function Wqe(t){if(!t)throw new Error("Layout data is required");if(!t.config)throw new Error("Configuration is required in layout data");if(!t.rootNode)throw new Error("Root node is required");if(!t.nodes||!Array.isArray(t.nodes))throw new Error("No nodes found in layout data");if(!Array.isArray(t.edges))throw new Error("Edges array is required in layout data");return!0}var ife=N(()=>{"use strict";pt();rfe();o(nfe,"executeCoseBilkentLayout");o(Wqe,"validateLayoutData")});var afe,sfe=N(()=>{"use strict";ife();afe=o(async(t,e,{insertCluster:r,insertEdge:n,insertEdgeLabel:i,insertMarkers:a,insertNode:s,log:l,positionEdgeLabel:u},{algorithm:h})=>{let f={},d={},p=e.select("g");a(p,t.markers,t.type,t.diagramId);let m=p.insert("g").attr("class","subgraphs"),g=p.insert("g").attr("class","edgePaths"),y=p.insert("g").attr("class","edgeLabels"),v=p.insert("g").attr("class","nodes");l.debug("Inserting nodes into DOM for dimension calculation"),await Promise.all(t.nodes.map(async T=>{if(T.isGroup){let S={...T};d[T.id]=S,f[T.id]=S,await r(m,T)}else{let S={...T};f[T.id]=S;let w=await s(v,T,{config:t.config,dir:t.direction||"TB"}),k=w.node().getBBox();S.width=k.width,S.height=k.height,S.domId=w,l.debug(`Node ${T.id} dimensions: ${k.width}x${k.height}`)}})),l.debug("Running cose-bilkent layout algorithm");let x={...t,nodes:t.nodes.map(T=>{let S=f[T.id];return{...T,width:S.width,height:S.height}})},b=await nfe(x,t.config);l.debug("Positioning nodes based on layout results"),b.nodes.forEach(T=>{let S=f[T.id];S?.domId&&(S.domId.attr("transform",`translate(${T.x}, ${T.y})`),S.x=T.x,S.y=T.y,l.debug(`Positioned node ${S.id} at center (${T.x}, ${T.y})`))}),b.edges.forEach(T=>{let S=t.edges.find(w=>w.id===T.id);S&&(S.points=[{x:T.startX,y:T.startY},{x:T.midX,y:T.midY},{x:T.endX,y:T.endY}])}),l.debug("Inserting and positioning edges"),await Promise.all(t.edges.map(async T=>{let S=await i(y,T),w=f[T.start??""],k=f[T.end??""];if(w&&k){let A=b.edges.find(C=>C.id===T.id);if(A){l.debug("APA01 positionedEdge",A);let C={...T},R=n(g,C,d,t.type,w,k,t.diagramId);u(C,R)}else{let C={...T,points:[{x:w.x||0,y:w.y||0},{x:k.x||0,y:k.y||0}]},R=n(g,C,d,t.type,w,k,t.diagramId);u(C,R)}}})),l.debug("Cose-bilkent rendering completed")},"render")});var ofe={};dr(ofe,{render:()=>Yqe});var Yqe,lfe=N(()=>{"use strict";sfe();Yqe=afe});var Dx,zI,Xqe,Qo,$c,Nf=N(()=>{"use strict";Qte();pt();Dx={},zI=o(t=>{for(let e of t)Dx[e.name]=e},"registerLayoutLoaders"),Xqe=o(()=>{zI([{name:"dagre",loader:o(async()=>await Promise.resolve().then(()=>(Roe(),Loe)),"loader")},{name:"cose-bilkent",loader:o(async()=>await Promise.resolve().then(()=>(lfe(),ofe)),"loader")}])},"registerDefaultLayoutLoaders");Xqe();Qo=o(async(t,e)=>{if(!(t.layoutAlgorithm in Dx))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=Dx[t.layoutAlgorithm];return(await r.loader()).render(t,e,Kte,{algorithm:r.algorithm})},"render"),$c=o((t="",{fallback:e="dagre"}={})=>{if(t in Dx)return t;if(e in Dx)return X.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var Ws,jqe,Kqe,Mf=N(()=>{"use strict";Ei();pt();Ws=o((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:l}=jqe(t,e);mn(t,a,i,n);let u=Kqe(s,l,i,a,e);t.attr("viewBox",u),X.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),jqe=o((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),Kqe=o((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var Qqe,Zqe,cfe,ufe=N(()=>{"use strict";yr();Xt();pt();ep();Nf();Mf();tr();Qqe=o(function(t,e){return e.db.getClasses()},"getClasses"),Zqe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=ge(),l;i==="sandbox"&&(l=qe("#i"+e));let u=i==="sandbox"?l.nodes()[0].contentDocument:document;X.debug("Before getData: ");let h=n.db.getData();X.debug("Data: ",h);let f=Vo(e,i),d=n.db.getDirection();h.type=n.type,h.layoutAlgorithm=$c(s),h.layoutAlgorithm==="dagre"&&s==="elk"&&X.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),h.direction=d,h.nodeSpacing=a?.nodeSpacing||50,h.rankSpacing=a?.rankSpacing||50,h.markers=["point","circle","cross"],h.diagramId=e,X.debug("REF1:",h),await Qo(h,f);let p=h.config.flowchart?.diagramPadding??8;qt.insertTitle(f,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),Ws(f,p,"flowchart",a?.useMaxWidth||!1);for(let m of h.nodes){let g=qe(`#${e} [id="${m.id}"]`);if(!g||!m.link)continue;let y=u.createElementNS("http://www.w3.org/2000/svg","a");y.setAttributeNS("http://www.w3.org/2000/svg","class",m.cssClasses),y.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?y.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):m.linkTarget&&y.setAttributeNS("http://www.w3.org/2000/svg","target",m.linkTarget);let v=g.insert(function(){return y},":first-child"),x=g.select(".label-container");x&&v.append(function(){return x.node()});let b=g.select(".label");b&&v.append(function(){return b.node()})}},"draw"),cfe={getClasses:Qqe,draw:Zqe}});var GI,VI,hfe=N(()=>{"use strict";GI=(function(){var t=o(function(fr,it,kt,jt){for(kt=kt||{},jt=fr.length;jt--;kt[fr[jt]]=it);return kt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],a=[2,2],s=[1,13],l=[1,14],u=[1,15],h=[1,16],f=[1,23],d=[1,25],p=[1,26],m=[1,27],g=[1,49],y=[1,48],v=[1,29],x=[1,30],b=[1,31],T=[1,32],S=[1,33],w=[1,44],k=[1,46],A=[1,42],C=[1,47],R=[1,43],I=[1,50],L=[1,45],E=[1,51],D=[1,52],_=[1,34],O=[1,35],M=[1,36],P=[1,37],B=[1,57],F=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],G=[1,61],$=[1,60],U=[1,62],j=[8,9,11,75,77,78],te=[1,78],Y=[1,91],oe=[1,96],J=[1,95],ue=[1,92],re=[1,88],ee=[1,94],Z=[1,90],K=[1,97],ae=[1,93],Q=[1,98],de=[1,89],ne=[8,9,10,11,40,75,77,78],Te=[8,9,10,11,40,46,75,77,78],q=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],Ve=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],pe=[44,60,89,102,105,106,109,111,114,115,116],Be=[1,121],Ye=[1,122],He=[1,124],Le=[1,123],Ie=[44,60,62,74,89,102,105,106,109,111,114,115,116],Ne=[1,133],Ce=[1,147],Fe=[1,148],fe=[1,149],xe=[1,150],W=[1,135],he=[1,137],z=[1,141],se=[1,142],le=[1,143],ke=[1,144],ve=[1,145],ye=[1,146],Re=[1,151],_e=[1,152],ze=[1,131],Ke=[1,132],xt=[1,139],We=[1,134],Oe=[1,138],et=[1,136],Ue=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],lt=[1,154],Gt=[1,156],vt=[8,9,11],Lt=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],dt=[1,176],nt=[1,172],bt=[1,173],wt=[1,177],yt=[1,174],ft=[1,175],Ur=[77,116,119],_t=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],bn=[10,106],Br=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],cr=[1,247],ar=[1,245],_r=[1,249],Ct=[1,243],Se=[1,244],at=[1,246],Nt=[1,248],wr=[1,250],Tn=[1,268],yn=[8,9,11,106],sn=[8,9,10,11,60,84,105,106,109,110,111,112],Hi={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1]],performAction:o(function(it,kt,jt,ht,Dr,me,Yl){var be=me.length-1;switch(Dr){case 2:this.$=[];break;case 3:(!Array.isArray(me[be])||me[be].length>0)&&me[be-1].push(me[be]),this.$=me[be-1];break;case 4:case 183:this.$=me[be];break;case 11:ht.setDirection("TB"),this.$="TB";break;case 12:ht.setDirection(me[be-1]),this.$=me[be-1];break;case 27:this.$=me[be-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=ht.addSubGraph(me[be-6],me[be-1],me[be-4]);break;case 34:this.$=ht.addSubGraph(me[be-3],me[be-1],me[be-3]);break;case 35:this.$=ht.addSubGraph(void 0,me[be-1],void 0);break;case 37:this.$=me[be].trim(),ht.setAccTitle(this.$);break;case 38:case 39:this.$=me[be].trim(),ht.setAccDescription(this.$);break;case 43:this.$=me[be-1]+me[be];break;case 44:this.$=me[be];break;case 45:ht.addVertex(me[be-1][me[be-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,me[be]),ht.addLink(me[be-3].stmt,me[be-1],me[be-2]),this.$={stmt:me[be-1],nodes:me[be-1].concat(me[be-3].nodes)};break;case 46:ht.addLink(me[be-2].stmt,me[be],me[be-1]),this.$={stmt:me[be],nodes:me[be].concat(me[be-2].nodes)};break;case 47:ht.addLink(me[be-3].stmt,me[be-1],me[be-2]),this.$={stmt:me[be-1],nodes:me[be-1].concat(me[be-3].nodes)};break;case 48:this.$={stmt:me[be-1],nodes:me[be-1]};break;case 49:ht.addVertex(me[be-1][me[be-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,me[be]),this.$={stmt:me[be-1],nodes:me[be-1],shapeData:me[be]};break;case 50:this.$={stmt:me[be],nodes:me[be]};break;case 51:this.$=[me[be]];break;case 52:ht.addVertex(me[be-5][me[be-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,me[be-4]),this.$=me[be-5].concat(me[be]);break;case 53:this.$=me[be-4].concat(me[be]);break;case 54:this.$=me[be];break;case 55:this.$=me[be-2],ht.setClass(me[be-2],me[be]);break;case 56:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"square");break;case 57:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"doublecircle");break;case 58:this.$=me[be-5],ht.addVertex(me[be-5],me[be-2],"circle");break;case 59:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"ellipse");break;case 60:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"stadium");break;case 61:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"subroutine");break;case 62:this.$=me[be-7],ht.addVertex(me[be-7],me[be-1],"rect",void 0,void 0,void 0,Object.fromEntries([[me[be-5],me[be-3]]]));break;case 63:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"cylinder");break;case 64:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"round");break;case 65:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"diamond");break;case 66:this.$=me[be-5],ht.addVertex(me[be-5],me[be-2],"hexagon");break;case 67:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"odd");break;case 68:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"trapezoid");break;case 69:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"inv_trapezoid");break;case 70:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"lean_right");break;case 71:this.$=me[be-3],ht.addVertex(me[be-3],me[be-1],"lean_left");break;case 72:this.$=me[be],ht.addVertex(me[be]);break;case 73:me[be-1].text=me[be],this.$=me[be-1];break;case 74:case 75:me[be-2].text=me[be-1],this.$=me[be-2];break;case 76:this.$=me[be];break;case 77:var jr=ht.destructLink(me[be],me[be-2]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length,text:me[be-1]};break;case 78:var jr=ht.destructLink(me[be],me[be-2]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length,text:me[be-1],id:me[be-3]};break;case 79:this.$={text:me[be],type:"text"};break;case 80:this.$={text:me[be-1].text+""+me[be],type:me[be-1].type};break;case 81:this.$={text:me[be],type:"string"};break;case 82:this.$={text:me[be],type:"markdown"};break;case 83:var jr=ht.destructLink(me[be]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length};break;case 84:var jr=ht.destructLink(me[be]);this.$={type:jr.type,stroke:jr.stroke,length:jr.length,id:me[be-1]};break;case 85:this.$=me[be-1];break;case 86:this.$={text:me[be],type:"text"};break;case 87:this.$={text:me[be-1].text+""+me[be],type:me[be-1].type};break;case 88:this.$={text:me[be],type:"string"};break;case 89:case 104:this.$={text:me[be],type:"markdown"};break;case 101:this.$={text:me[be],type:"text"};break;case 102:this.$={text:me[be-1].text+""+me[be],type:me[be-1].type};break;case 103:this.$={text:me[be],type:"text"};break;case 105:this.$=me[be-4],ht.addClass(me[be-2],me[be]);break;case 106:this.$=me[be-4],ht.setClass(me[be-2],me[be]);break;case 107:case 115:this.$=me[be-1],ht.setClickEvent(me[be-1],me[be]);break;case 108:case 116:this.$=me[be-3],ht.setClickEvent(me[be-3],me[be-2]),ht.setTooltip(me[be-3],me[be]);break;case 109:this.$=me[be-2],ht.setClickEvent(me[be-2],me[be-1],me[be]);break;case 110:this.$=me[be-4],ht.setClickEvent(me[be-4],me[be-3],me[be-2]),ht.setTooltip(me[be-4],me[be]);break;case 111:this.$=me[be-2],ht.setLink(me[be-2],me[be]);break;case 112:this.$=me[be-4],ht.setLink(me[be-4],me[be-2]),ht.setTooltip(me[be-4],me[be]);break;case 113:this.$=me[be-4],ht.setLink(me[be-4],me[be-2],me[be]);break;case 114:this.$=me[be-6],ht.setLink(me[be-6],me[be-4],me[be]),ht.setTooltip(me[be-6],me[be-2]);break;case 117:this.$=me[be-1],ht.setLink(me[be-1],me[be]);break;case 118:this.$=me[be-3],ht.setLink(me[be-3],me[be-2]),ht.setTooltip(me[be-3],me[be]);break;case 119:this.$=me[be-3],ht.setLink(me[be-3],me[be-2],me[be]);break;case 120:this.$=me[be-5],ht.setLink(me[be-5],me[be-4],me[be]),ht.setTooltip(me[be-5],me[be-2]);break;case 121:this.$=me[be-4],ht.addVertex(me[be-2],void 0,void 0,me[be]);break;case 122:this.$=me[be-4],ht.updateLink([me[be-2]],me[be]);break;case 123:this.$=me[be-4],ht.updateLink(me[be-2],me[be]);break;case 124:this.$=me[be-8],ht.updateLinkInterpolate([me[be-6]],me[be-2]),ht.updateLink([me[be-6]],me[be]);break;case 125:this.$=me[be-8],ht.updateLinkInterpolate(me[be-6],me[be-2]),ht.updateLink(me[be-6],me[be]);break;case 126:this.$=me[be-6],ht.updateLinkInterpolate([me[be-4]],me[be]);break;case 127:this.$=me[be-6],ht.updateLinkInterpolate(me[be-4],me[be]);break;case 128:case 130:this.$=[me[be]];break;case 129:case 131:me[be-2].push(me[be]),this.$=me[be-2];break;case 133:this.$=me[be-1]+me[be];break;case 181:this.$=me[be];break;case 182:this.$=me[be-1]+""+me[be];break;case 184:this.$=me[be-1]+""+me[be];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,54],9:[1,55],10:B,15:53,18:56},t(F,[2,3]),t(F,[2,4]),t(F,[2,5]),t(F,[2,6]),t(F,[2,7]),t(F,[2,8]),{8:G,9:$,11:U,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:G,9:$,11:U,21:67},{8:G,9:$,11:U,21:68},{8:G,9:$,11:U,21:69},{8:G,9:$,11:U,21:70},{8:G,9:$,11:U,21:71},{8:G,9:$,10:[1,72],11:U,21:73},t(F,[2,36]),{35:[1,74]},{37:[1,75]},t(F,[2,39]),t(j,[2,50],{18:76,39:77,10:B,40:te}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:Y,44:oe,60:J,80:[1,86],89:ue,95:[1,83],97:[1,84],101:85,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de,120:87},t(F,[2,185]),t(F,[2,186]),t(F,[2,187]),t(F,[2,188]),t(ne,[2,51]),t(ne,[2,54],{46:[1,99]}),t(Te,[2,72],{113:112,29:[1,100],44:g,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:y,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:w,102:k,105:A,106:C,109:R,111:I,114:L,115:E,116:D}),t(q,[2,181]),t(q,[2,142]),t(q,[2,143]),t(q,[2,144]),t(q,[2,145]),t(q,[2,146]),t(q,[2,147]),t(q,[2,148]),t(q,[2,149]),t(q,[2,150]),t(q,[2,151]),t(q,[2,152]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,113]},t(Ve,[2,26],{18:114,10:B}),t(F,[2,27]),{42:115,43:38,44:g,45:39,47:40,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(F,[2,40]),t(F,[2,41]),t(F,[2,42]),t(pe,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:Be,81:Ye,116:He,119:Le},{75:[1,125],77:[1,126]},t(Ie,[2,83]),t(F,[2,28]),t(F,[2,29]),t(F,[2,30]),t(F,[2,31]),t(F,[2,32]),{10:Ne,12:Ce,14:Fe,27:fe,28:127,32:xe,44:W,60:he,75:z,80:[1,129],81:[1,130],83:140,84:se,85:le,86:ke,87:ve,88:ye,89:Re,90:_e,91:128,105:ze,109:Ke,111:xt,114:We,115:Oe,116:et},t(Ue,a,{5:153}),t(F,[2,37]),t(F,[2,38]),t(j,[2,48],{44:lt}),t(j,[2,49],{18:155,10:B,40:Gt}),t(ne,[2,44]),{44:g,47:157,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{102:[1,158],103:159,105:[1,160]},{44:g,47:161,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{44:g,47:162,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(vt,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},t(vt,[2,115],{120:167,10:[1,166],14:Y,44:oe,60:J,89:ue,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de}),t(vt,[2,117],{10:[1,168]}),t(Lt,[2,183]),t(Lt,[2,170]),t(Lt,[2,171]),t(Lt,[2,172]),t(Lt,[2,173]),t(Lt,[2,174]),t(Lt,[2,175]),t(Lt,[2,176]),t(Lt,[2,177]),t(Lt,[2,178]),t(Lt,[2,179]),t(Lt,[2,180]),{44:g,47:169,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{30:170,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:178,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:180,50:[1,179],67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:181,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:182,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:183,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{109:[1,184]},{30:185,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:186,65:[1,187],67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:188,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:189,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{30:190,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},t(q,[2,182]),t(i,[2,20]),t(Ve,[2,25]),t(j,[2,46],{39:191,18:192,10:B,40:te}),t(pe,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{77:[1,196],79:197,116:He,119:Le},t(Ur,[2,79]),t(Ur,[2,81]),t(Ur,[2,82]),t(Ur,[2,168]),t(Ur,[2,169]),{76:198,79:120,80:Be,81:Ye,116:He,119:Le},t(Ie,[2,84]),{8:G,9:$,10:Ne,11:U,12:Ce,14:Fe,21:200,27:fe,29:[1,199],32:xe,44:W,60:he,75:z,83:140,84:se,85:le,86:ke,87:ve,88:ye,89:Re,90:_e,91:201,105:ze,109:Ke,111:xt,114:We,115:Oe,116:et},t(_t,[2,101]),t(_t,[2,103]),t(_t,[2,104]),t(_t,[2,157]),t(_t,[2,158]),t(_t,[2,159]),t(_t,[2,160]),t(_t,[2,161]),t(_t,[2,162]),t(_t,[2,163]),t(_t,[2,164]),t(_t,[2,165]),t(_t,[2,166]),t(_t,[2,167]),t(_t,[2,90]),t(_t,[2,91]),t(_t,[2,92]),t(_t,[2,93]),t(_t,[2,94]),t(_t,[2,95]),t(_t,[2,96]),t(_t,[2,97]),t(_t,[2,98]),t(_t,[2,99]),t(_t,[2,100]),{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,202],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},{10:B,18:203},{44:[1,204]},t(ne,[2,43]),{10:[1,205],44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:112,114:L,115:E,116:D},{10:[1,206]},{10:[1,207],106:[1,208]},t(bn,[2,128]),{10:[1,209],44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:112,114:L,115:E,116:D},{10:[1,210],44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:112,114:L,115:E,116:D},{80:[1,211]},t(vt,[2,109],{10:[1,212]}),t(vt,[2,111],{10:[1,213]}),{80:[1,214]},t(Lt,[2,184]),{80:[1,215],98:[1,216]},t(ne,[2,55],{113:112,44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,114:L,115:E,116:D}),{31:[1,217],67:dt,82:218,116:wt,117:yt,118:ft},t(Br,[2,86]),t(Br,[2,88]),t(Br,[2,89]),t(Br,[2,153]),t(Br,[2,154]),t(Br,[2,155]),t(Br,[2,156]),{49:[1,219],67:dt,82:218,116:wt,117:yt,118:ft},{30:220,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{51:[1,221],67:dt,82:218,116:wt,117:yt,118:ft},{53:[1,222],67:dt,82:218,116:wt,117:yt,118:ft},{55:[1,223],67:dt,82:218,116:wt,117:yt,118:ft},{57:[1,224],67:dt,82:218,116:wt,117:yt,118:ft},{60:[1,225]},{64:[1,226],67:dt,82:218,116:wt,117:yt,118:ft},{66:[1,227],67:dt,82:218,116:wt,117:yt,118:ft},{30:228,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},{31:[1,229],67:dt,82:218,116:wt,117:yt,118:ft},{67:dt,69:[1,230],71:[1,231],82:218,116:wt,117:yt,118:ft},{67:dt,69:[1,233],71:[1,232],82:218,116:wt,117:yt,118:ft},t(j,[2,45],{18:155,10:B,40:Gt}),t(j,[2,47],{44:lt}),t(pe,[2,75]),t(pe,[2,74]),{62:[1,234],67:dt,82:218,116:wt,117:yt,118:ft},t(pe,[2,77]),t(Ur,[2,80]),{77:[1,235],79:197,116:He,119:Le},{30:236,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},t(Ue,a,{5:237}),t(_t,[2,102]),t(F,[2,35]),{43:238,44:g,45:39,47:40,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},{10:B,18:239},{10:cr,60:ar,84:_r,92:240,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{10:cr,60:ar,84:_r,92:251,104:[1,252],105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{10:cr,60:ar,84:_r,92:253,104:[1,254],105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{105:[1,255]},{10:cr,60:ar,84:_r,92:256,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{44:g,47:257,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(vt,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},t(vt,[2,116]),t(vt,[2,118],{10:[1,261]}),t(vt,[2,119]),t(Te,[2,56]),t(Br,[2,87]),t(Te,[2,57]),{51:[1,262],67:dt,82:218,116:wt,117:yt,118:ft},t(Te,[2,64]),t(Te,[2,59]),t(Te,[2,60]),t(Te,[2,61]),{109:[1,263]},t(Te,[2,63]),t(Te,[2,65]),{66:[1,264],67:dt,82:218,116:wt,117:yt,118:ft},t(Te,[2,67]),t(Te,[2,68]),t(Te,[2,70]),t(Te,[2,69]),t(Te,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(pe,[2,78]),{31:[1,265],67:dt,82:218,116:wt,117:yt,118:ft},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,266],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},t(ne,[2,53]),{43:267,44:g,45:39,47:40,60:y,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D},t(vt,[2,121],{106:Tn}),t(yn,[2,130],{108:269,10:cr,60:ar,84:_r,105:Ct,109:Se,110:at,111:Nt,112:wr}),t(sn,[2,132]),t(sn,[2,134]),t(sn,[2,135]),t(sn,[2,136]),t(sn,[2,137]),t(sn,[2,138]),t(sn,[2,139]),t(sn,[2,140]),t(sn,[2,141]),t(vt,[2,122],{106:Tn}),{10:[1,270]},t(vt,[2,123],{106:Tn}),{10:[1,271]},t(bn,[2,129]),t(vt,[2,105],{106:Tn}),t(vt,[2,106],{113:112,44:g,60:y,89:w,102:k,105:A,106:C,109:R,111:I,114:L,115:E,116:D}),t(vt,[2,110]),t(vt,[2,112],{10:[1,272]}),t(vt,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:G,9:$,11:U,21:277},t(F,[2,34]),t(ne,[2,52]),{10:cr,60:ar,84:_r,105:Ct,107:278,108:242,109:Se,110:at,111:Nt,112:wr},t(sn,[2,133]),{14:Y,44:oe,60:J,89:ue,101:279,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de,120:87},{14:Y,44:oe,60:J,89:ue,101:280,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de,120:87},{98:[1,281]},t(vt,[2,120]),t(Te,[2,58]),{30:282,67:dt,80:nt,81:bt,82:171,116:wt,117:yt,118:ft},t(Te,[2,66]),t(Ue,a,{5:283}),t(yn,[2,131],{108:269,10:cr,60:ar,84:_r,105:Ct,109:Se,110:at,111:Nt,112:wr}),t(vt,[2,126],{120:167,10:[1,284],14:Y,44:oe,60:J,89:ue,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de}),t(vt,[2,127],{120:167,10:[1,285],14:Y,44:oe,60:J,89:ue,105:re,106:ee,109:Z,111:K,114:ae,115:Q,116:de}),t(vt,[2,114]),{31:[1,286],67:dt,82:218,116:wt,117:yt,118:ft},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,287],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:k,105:A,106:C,109:R,111:I,113:41,114:L,115:E,116:D,121:_,122:O,123:M,124:P},{10:cr,60:ar,84:_r,92:288,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},{10:cr,60:ar,84:_r,92:289,105:Ct,107:241,108:242,109:Se,110:at,111:Nt,112:wr},t(Te,[2,62]),t(F,[2,33]),t(vt,[2,124],{106:Tn}),t(vt,[2,125],{106:Tn})],defaultActions:{},parseError:o(function(it,kt){if(kt.recoverable)this.trace(it);else{var jt=new Error(it);throw jt.hash=kt,jt}},"parseError"),parse:o(function(it){var kt=this,jt=[0],ht=[],Dr=[null],me=[],Yl=this.table,be="",jr=0,V4=0,XC=0,jC=2,Gz=1,$3e=me.slice.call(arguments,1),qi=Object.create(this.lexer),ad={yy:{}};for(var KC in this.yy)Object.prototype.hasOwnProperty.call(this.yy,KC)&&(ad.yy[KC]=this.yy[KC]);qi.setInput(it,ad.yy),ad.yy.lexer=qi,ad.yy.parser=this,typeof qi.yylloc>"u"&&(qi.yylloc={});var QC=qi.yylloc;me.push(QC);var z3e=qi.options&&qi.options.ranges;typeof ad.yy.parseError=="function"?this.parseError=ad.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Pat(Js){jt.length=jt.length-2*Js,Dr.length=Dr.length-Js,me.length=me.length-Js}o(Pat,"popStack");function G3e(){var Js;return Js=ht.pop()||qi.lex()||Gz,typeof Js!="number"&&(Js instanceof Array&&(ht=Js,Js=ht.pop()),Js=kt.symbols_[Js]||Js),Js}o(G3e,"lex");for(var Xa,ZC,sd,ko,Bat,JC,g0={},U4,iu,Vz,H4;;){if(sd=jt[jt.length-1],this.defaultActions[sd]?ko=this.defaultActions[sd]:((Xa===null||typeof Xa>"u")&&(Xa=G3e()),ko=Yl[sd]&&Yl[sd][Xa]),typeof ko>"u"||!ko.length||!ko[0]){var e7="";H4=[];for(U4 in Yl[sd])this.terminals_[U4]&&U4>jC&&H4.push("'"+this.terminals_[U4]+"'");qi.showPosition?e7="Parse error on line "+(jr+1)+`: +`+qi.showPosition()+` +Expecting `+H4.join(", ")+", got '"+(this.terminals_[Xa]||Xa)+"'":e7="Parse error on line "+(jr+1)+": Unexpected "+(Xa==Gz?"end of input":"'"+(this.terminals_[Xa]||Xa)+"'"),this.parseError(e7,{text:qi.match,token:this.terminals_[Xa]||Xa,line:qi.yylineno,loc:QC,expected:H4})}if(ko[0]instanceof Array&&ko.length>1)throw new Error("Parse Error: multiple actions possible at state: "+sd+", token: "+Xa);switch(ko[0]){case 1:jt.push(Xa),Dr.push(qi.yytext),me.push(qi.yylloc),jt.push(ko[1]),Xa=null,ZC?(Xa=ZC,ZC=null):(V4=qi.yyleng,be=qi.yytext,jr=qi.yylineno,QC=qi.yylloc,XC>0&&XC--);break;case 2:if(iu=this.productions_[ko[1]][1],g0.$=Dr[Dr.length-iu],g0._$={first_line:me[me.length-(iu||1)].first_line,last_line:me[me.length-1].last_line,first_column:me[me.length-(iu||1)].first_column,last_column:me[me.length-1].last_column},z3e&&(g0._$.range=[me[me.length-(iu||1)].range[0],me[me.length-1].range[1]]),JC=this.performAction.apply(g0,[be,V4,jr,ad.yy,ko[1],Dr,me].concat($3e)),typeof JC<"u")return JC;iu&&(jt=jt.slice(0,-1*iu*2),Dr=Dr.slice(0,-1*iu),me=me.slice(0,-1*iu)),jt.push(this.productions_[ko[1]][0]),Dr.push(g0.$),me.push(g0._$),Vz=Yl[jt[jt.length-2]][jt[jt.length-1]],jt.push(Vz);break;case 3:return!0}}return!0},"parse")},Zs=(function(){var fr={EOF:1,parseError:o(function(kt,jt){if(this.yy.parser)this.yy.parser.parseError(kt,jt);else throw new Error(kt)},"parseError"),setInput:o(function(it,kt){return this.yy=kt||this.yy||{},this._input=it,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var it=this._input[0];this.yytext+=it,this.yyleng++,this.offset++,this.match+=it,this.matched+=it;var kt=it.match(/(?:\r\n?|\n).*/g);return kt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),it},"input"),unput:o(function(it){var kt=it.length,jt=it.split(/(?:\r\n?|\n)/g);this._input=it+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-kt),this.offset-=kt;var ht=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),jt.length-1&&(this.yylineno-=jt.length-1);var Dr=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:jt?(jt.length===ht.length?this.yylloc.first_column:0)+ht[ht.length-jt.length].length-jt[0].length:this.yylloc.first_column-kt},this.options.ranges&&(this.yylloc.range=[Dr[0],Dr[0]+this.yyleng-kt]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(it){this.unput(this.match.slice(it))},"less"),pastInput:o(function(){var it=this.matched.substr(0,this.matched.length-this.match.length);return(it.length>20?"...":"")+it.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var it=this.match;return it.length<20&&(it+=this._input.substr(0,20-it.length)),(it.substr(0,20)+(it.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var it=this.pastInput(),kt=new Array(it.length+1).join("-");return it+this.upcomingInput()+` +`+kt+"^"},"showPosition"),test_match:o(function(it,kt){var jt,ht,Dr;if(this.options.backtrack_lexer&&(Dr={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Dr.yylloc.range=this.yylloc.range.slice(0))),ht=it[0].match(/(?:\r\n?|\n).*/g),ht&&(this.yylineno+=ht.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ht?ht[ht.length-1].length-ht[ht.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+it[0].length},this.yytext+=it[0],this.match+=it[0],this.matches=it,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(it[0].length),this.matched+=it[0],jt=this.performAction.call(this,this.yy,this,kt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),jt)return jt;if(this._backtrack){for(var me in Dr)this[me]=Dr[me];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var it,kt,jt,ht;this._more||(this.yytext="",this.match="");for(var Dr=this._currentRules(),me=0;mekt[0].length)){if(kt=jt,ht=me,this.options.backtrack_lexer){if(it=this.test_match(jt,Dr[me]),it!==!1)return it;if(this._backtrack){kt=!1;continue}else return!1}else if(!this.options.flex)break}return kt?(it=this.test_match(kt,Dr[ht]),it!==!1?it:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var kt=this.next();return kt||this.lex()},"lex"),begin:o(function(kt){this.conditionStack.push(kt)},"begin"),popState:o(function(){var kt=this.conditionStack.length-1;return kt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(kt){return kt=this.conditionStack.length-1-Math.abs(kt||0),kt>=0?this.conditionStack[kt]:"INITIAL"},"topState"),pushState:o(function(kt){this.begin(kt)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(kt,jt,ht,Dr){var me=Dr;switch(ht){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),jt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Yl=/\n\s*/g;return jt.yytext=jt.yytext.replace(Yl,"
      "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return kt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return kt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return kt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 78;case 60:return 105;case 61:return 111;case 62:return 46;case 63:return 60;case 64:return 44;case 65:return 8;case 66:return 106;case 67:return 115;case 68:return this.popState(),77;break;case 69:return this.pushState("edgeText"),75;break;case 70:return 119;case 71:return this.popState(),77;break;case 72:return this.pushState("thickEdgeText"),75;break;case 73:return 119;case 74:return this.popState(),77;break;case 75:return this.pushState("dottedEdgeText"),75;break;case 76:return 119;case 77:return 77;case 78:return this.popState(),53;break;case 79:return"TEXT";case 80:return this.pushState("ellipseText"),52;break;case 81:return this.popState(),55;break;case 82:return this.pushState("text"),54;break;case 83:return this.popState(),57;break;case 84:return this.pushState("text"),56;break;case 85:return 58;case 86:return this.pushState("text"),67;break;case 87:return this.popState(),64;break;case 88:return this.pushState("text"),63;break;case 89:return this.popState(),49;break;case 90:return this.pushState("text"),48;break;case 91:return this.popState(),69;break;case 92:return this.popState(),71;break;case 93:return 117;case 94:return this.pushState("trapText"),68;break;case 95:return this.pushState("trapText"),70;break;case 96:return 118;case 97:return 67;case 98:return 90;case 99:return"SEP";case 100:return 89;case 101:return 115;case 102:return 111;case 103:return 44;case 104:return 109;case 105:return 114;case 106:return 116;case 107:return this.popState(),62;break;case 108:return this.pushState("text"),62;break;case 109:return this.popState(),51;break;case 110:return this.pushState("text"),50;break;case 111:return this.popState(),31;break;case 112:return this.pushState("text"),29;break;case 113:return this.popState(),66;break;case 114:return this.pushState("text"),65;break;case 115:return"TEXT";case 116:return"QUOTE";case 117:return 9;case 118:return 10;case 119:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeData:{rules:[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackargs:{rules:[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackname:{rules:[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},href:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},click:{rules:[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dottedEdgeText:{rules:[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},thickEdgeText:{rules:[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},edgeText:{rules:[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},trapText:{rules:[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],inclusive:!1},ellipseText:{rules:[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},text:{rules:[21,24,77,80,81,82,83,84,87,88,89,90,94,95,107,108,109,110,111,112,113,114,115],inclusive:!1},vertex:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr:{rules:[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_title:{rules:[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},md_string:{rules:[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},string:{rules:[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,77,80,82,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,105,106,108,110,112,114,116,117,118,119],inclusive:!0}}};return fr})();Hi.lexer=Zs;function _a(){this.yy={}}return o(_a,"Parser"),_a.prototype=Hi,Hi.Parser=_a,new _a})();GI.parser=GI;VI=GI});var ffe,dfe,pfe=N(()=>{"use strict";hfe();ffe=Object.assign({},VI);ffe.parse=t=>{let e=t.replace(/}\s*\n/g,`} +`);return VI.parse(e)};dfe=ffe});var zc,yg=N(()=>{"use strict";zc=o(()=>` + /* Font Awesome icon styling - consolidated */ + .label-icon { + display: inline-block; + height: 1em; + overflow: visible; + vertical-align: -0.125em; + } + + .node .label-icon path { + fill: currentColor; + stroke: revert; + stroke-width: revert; + } +`,"getIconStyles")});var Jqe,eWe,mfe,gfe=N(()=>{"use strict";eo();yg();Jqe=o((t,e)=>{let r=ld,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Ka(n,i,a,e)},"fade"),eWe=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span { + color: ${t.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .katex path { + fill: #000; + stroke: #000; + stroke-width: 1px; + } + + .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + + .root .anchor path { + fill: ${t.lineColor} !important; + stroke-width: 0; + stroke: ${t.lineColor}; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${Jqe(t.edgeLabelBackground,.5)}; + // background-color: + } + + .cluster rect { + fill: ${t.clusterBkg}; + stroke: ${t.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + + rect.text { + fill: none; + stroke-width: 0; + } + + .icon-shape, .image-shape { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + padding: 2px; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + ${zc()} +`,"getStyles"),mfe=eWe});var CE={};dr(CE,{diagram:()=>tWe});var tWe,AE=N(()=>{"use strict";Xt();Bte();ufe();pfe();gfe();tWe={parser:dfe,get db(){return new lw},renderer:cfe,styles:mfe,init:o(t=>{t.flowchart||(t.flowchart={}),t.layout&&nv({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,nv({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})},"init")}});var UI,Tfe,wfe=N(()=>{"use strict";UI=(function(){var t=o(function(K,ae,Q,de){for(Q=Q||{},de=K.length;de--;Q[K[de]]=ae);return Q},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,50],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,20],l=[1,21],u=[1,22],h=[1,23],f=[1,24],d=[1,19],p=[1,25],m=[1,26],g=[1,18],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],S=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,50,63,64,65,66,67],w=[1,42],k=[1,43],A=[1,52],C=[40,50,68,69],R=[1,63],I=[1,61],L=[1,58],E=[1,62],D=[1,64],_=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,63,64,65,66,67],O=[63,64,65,66,67],M=[1,81],P=[1,80],B=[1,78],F=[1,79],G=[6,10,42,47],$=[6,10,13,41,42,47,48,49],U=[1,89],j=[1,88],te=[1,87],Y=[19,56],oe=[1,98],J=[1,97],ue=[19,56,58,60],re={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,attribute:51,attributeType:52,attributeName:53,attributeKeyTypeList:54,attributeComment:55,ATTRIBUTE_WORD:56,attributeKeyType:57,",":58,ATTRIBUTE_KEY:59,COMMENT:60,cardinality:61,relType:62,ZERO_OR_ONE:63,ZERO_OR_MORE:64,ONE_OR_MORE:65,ONLY_ONE:66,MD_PARENT:67,NON_IDENTIFYING:68,IDENTIFYING:69,WORD:70,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",56:"ATTRIBUTE_WORD",58:",",59:"ATTRIBUTE_KEY",60:"COMMENT",63:"ZERO_OR_ONE",64:"ZERO_OR_MORE",65:"ONE_OR_MORE",66:"ONLY_ONE",67:"MD_PARENT",68:"NON_IDENTIFYING",69:"IDENTIFYING",70:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[18,1],[18,2],[51,2],[51,3],[51,3],[51,4],[52,1],[53,1],[54,1],[54,3],[57,1],[55,1],[12,3],[61,1],[61,1],[61,1],[61,1],[61,1],[62,1],[62,1],[14,1],[14,1],[14,1]],performAction:o(function(ae,Q,de,ne,Te,q,Ve){var pe=q.length-1;switch(Te){case 1:break;case 2:this.$=[];break;case 3:q[pe-1].push(q[pe]),this.$=q[pe-1];break;case 4:case 5:this.$=q[pe];break;case 6:case 7:this.$=[];break;case 8:ne.addEntity(q[pe-4]),ne.addEntity(q[pe-2]),ne.addRelationship(q[pe-4],q[pe],q[pe-2],q[pe-3]);break;case 9:ne.addEntity(q[pe-8]),ne.addEntity(q[pe-4]),ne.addRelationship(q[pe-8],q[pe],q[pe-4],q[pe-5]),ne.setClass([q[pe-8]],q[pe-6]),ne.setClass([q[pe-4]],q[pe-2]);break;case 10:ne.addEntity(q[pe-6]),ne.addEntity(q[pe-2]),ne.addRelationship(q[pe-6],q[pe],q[pe-2],q[pe-3]),ne.setClass([q[pe-6]],q[pe-4]);break;case 11:ne.addEntity(q[pe-6]),ne.addEntity(q[pe-4]),ne.addRelationship(q[pe-6],q[pe],q[pe-4],q[pe-5]),ne.setClass([q[pe-4]],q[pe-2]);break;case 12:ne.addEntity(q[pe-3]),ne.addAttributes(q[pe-3],q[pe-1]);break;case 13:ne.addEntity(q[pe-5]),ne.addAttributes(q[pe-5],q[pe-1]),ne.setClass([q[pe-5]],q[pe-3]);break;case 14:ne.addEntity(q[pe-2]);break;case 15:ne.addEntity(q[pe-4]),ne.setClass([q[pe-4]],q[pe-2]);break;case 16:ne.addEntity(q[pe]);break;case 17:ne.addEntity(q[pe-2]),ne.setClass([q[pe-2]],q[pe]);break;case 18:ne.addEntity(q[pe-6],q[pe-4]),ne.addAttributes(q[pe-6],q[pe-1]);break;case 19:ne.addEntity(q[pe-8],q[pe-6]),ne.addAttributes(q[pe-8],q[pe-1]),ne.setClass([q[pe-8]],q[pe-3]);break;case 20:ne.addEntity(q[pe-5],q[pe-3]);break;case 21:ne.addEntity(q[pe-7],q[pe-5]),ne.setClass([q[pe-7]],q[pe-2]);break;case 22:ne.addEntity(q[pe-3],q[pe-1]);break;case 23:ne.addEntity(q[pe-5],q[pe-3]),ne.setClass([q[pe-5]],q[pe]);break;case 24:case 25:this.$=q[pe].trim(),ne.setAccTitle(this.$);break;case 26:case 27:this.$=q[pe].trim(),ne.setAccDescription(this.$);break;case 32:ne.setDirection("TB");break;case 33:ne.setDirection("BT");break;case 34:ne.setDirection("RL");break;case 35:ne.setDirection("LR");break;case 36:this.$=q[pe-3],ne.addClass(q[pe-2],q[pe-1]);break;case 37:case 38:case 56:case 64:this.$=[q[pe]];break;case 39:case 40:this.$=q[pe-2].concat([q[pe]]);break;case 41:this.$=q[pe-2],ne.setClass(q[pe-1],q[pe]);break;case 42:this.$=q[pe-3],ne.addCssStyles(q[pe-2],q[pe-1]);break;case 43:this.$=[q[pe]];break;case 44:q[pe-2].push(q[pe]),this.$=q[pe-2];break;case 46:this.$=q[pe-1]+q[pe];break;case 54:case 76:case 77:this.$=q[pe].replace(/"/g,"");break;case 55:case 78:this.$=q[pe];break;case 57:q[pe].push(q[pe-1]),this.$=q[pe];break;case 58:this.$={type:q[pe-1],name:q[pe]};break;case 59:this.$={type:q[pe-2],name:q[pe-1],keys:q[pe]};break;case 60:this.$={type:q[pe-2],name:q[pe-1],comment:q[pe]};break;case 61:this.$={type:q[pe-3],name:q[pe-2],keys:q[pe-1],comment:q[pe]};break;case 62:case 63:case 66:this.$=q[pe];break;case 65:q[pe-2].push(q[pe]),this.$=q[pe-2];break;case 67:this.$=q[pe].replace(/"/g,"");break;case 68:this.$={cardA:q[pe],relType:q[pe-1],cardB:q[pe-2]};break;case 69:this.$=ne.Cardinality.ZERO_OR_ONE;break;case 70:this.$=ne.Cardinality.ZERO_OR_MORE;break;case 71:this.$=ne.Cardinality.ONE_OR_MORE;break;case 72:this.$=ne.Cardinality.ONLY_ONE;break;case 73:this.$=ne.Cardinality.MD_PARENT;break;case 74:this.$=ne.Identification.NON_IDENTIFYING;break;case 75:this.$=ne.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:27,11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:28,61:32,15:[1,29],17:[1,30],20:[1,31],63:y,64:v,65:x,66:b,67:T}),{23:[1,38]},{25:[1,39]},{27:[1,40]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(S,[2,54]),t(S,[2,55]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:41,40:w,41:k},{16:44,40:w,41:k},{16:45,40:w,41:k},t(e,[2,4]),{11:46,40:d,50:g},{16:47,40:w,41:k},{18:48,19:[1,49],51:50,52:51,56:A},{11:53,40:d,50:g},{62:54,68:[1,55],69:[1,56]},t(C,[2,69]),t(C,[2,70]),t(C,[2,71]),t(C,[2,72]),t(C,[2,73]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:R,38:57,41:I,42:L,45:59,46:60,48:E,49:D},t(_,[2,37]),t(_,[2,38]),{16:65,40:w,41:k,42:L},{13:R,38:66,41:I,42:L,45:59,46:60,48:E,49:D},{13:[1,67],15:[1,68]},t(e,[2,17],{61:32,12:69,17:[1,70],42:L,63:y,64:v,65:x,66:b,67:T}),{19:[1,71]},t(e,[2,14]),{18:72,19:[2,56],51:50,52:51,56:A},{53:73,56:[1,74]},{56:[2,62]},{21:[1,75]},{61:76,63:y,64:v,65:x,66:b,67:T},t(O,[2,74]),t(O,[2,75]),{6:M,10:P,39:77,42:B,47:F},{40:[1,82],41:[1,83]},t(G,[2,43],{46:84,13:R,41:I,48:E,49:D}),t($,[2,45]),t($,[2,50]),t($,[2,51]),t($,[2,52]),t($,[2,53]),t(e,[2,41],{42:L}),{6:M,10:P,39:85,42:B,47:F},{14:86,40:U,50:j,70:te},{16:90,40:w,41:k},{11:91,40:d,50:g},{18:92,19:[1,93],51:50,52:51,56:A},t(e,[2,12]),{19:[2,57]},t(Y,[2,58],{54:94,55:95,57:96,59:oe,60:J}),t([19,56,59,60],[2,63]),t(e,[2,22],{15:[1,100],17:[1,99]}),t([40,50],[2,68]),t(e,[2,36]),{13:R,41:I,45:101,46:60,48:E,49:D},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(_,[2,39]),t(_,[2,40]),t($,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,76]),t(e,[2,77]),t(e,[2,78]),{13:[1,102],42:L},{13:[1,104],15:[1,103]},{19:[1,105]},t(e,[2,15]),t(Y,[2,59],{55:106,58:[1,107],60:J}),t(Y,[2,60]),t(ue,[2,64]),t(Y,[2,67]),t(ue,[2,66]),{18:108,19:[1,109],51:50,52:51,56:A},{16:110,40:w,41:k},t(G,[2,44],{46:84,13:R,41:I,48:E,49:D}),{14:111,40:U,50:j,70:te},{16:112,40:w,41:k},{14:113,40:U,50:j,70:te},t(e,[2,13]),t(Y,[2,61]),{57:114,59:oe},{19:[1,115]},t(e,[2,20]),t(e,[2,23],{17:[1,116],42:L}),t(e,[2,11]),{13:[1,117],42:L},t(e,[2,10]),t(ue,[2,65]),t(e,[2,18]),{18:118,19:[1,119],51:50,52:51,56:A},{14:120,40:U,50:j,70:te},{19:[1,121]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{52:[2,62],72:[2,57]},parseError:o(function(ae,Q){if(Q.recoverable)this.trace(ae);else{var de=new Error(ae);throw de.hash=Q,de}},"parseError"),parse:o(function(ae){var Q=this,de=[0],ne=[],Te=[null],q=[],Ve=this.table,pe="",Be=0,Ye=0,He=0,Le=2,Ie=1,Ne=q.slice.call(arguments,1),Ce=Object.create(this.lexer),Fe={yy:{}};for(var fe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,fe)&&(Fe.yy[fe]=this.yy[fe]);Ce.setInput(ae,Fe.yy),Fe.yy.lexer=Ce,Fe.yy.parser=this,typeof Ce.yylloc>"u"&&(Ce.yylloc={});var xe=Ce.yylloc;q.push(xe);var W=Ce.options&&Ce.options.ranges;typeof Fe.yy.parseError=="function"?this.parseError=Fe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function he(et){de.length=de.length-2*et,Te.length=Te.length-et,q.length=q.length-et}o(he,"popStack");function z(){var et;return et=ne.pop()||Ce.lex()||Ie,typeof et!="number"&&(et instanceof Array&&(ne=et,et=ne.pop()),et=Q.symbols_[et]||et),et}o(z,"lex");for(var se,le,ke,ve,ye,Re,_e={},ze,Ke,xt,We;;){if(ke=de[de.length-1],this.defaultActions[ke]?ve=this.defaultActions[ke]:((se===null||typeof se>"u")&&(se=z()),ve=Ve[ke]&&Ve[ke][se]),typeof ve>"u"||!ve.length||!ve[0]){var Oe="";We=[];for(ze in Ve[ke])this.terminals_[ze]&&ze>Le&&We.push("'"+this.terminals_[ze]+"'");Ce.showPosition?Oe="Parse error on line "+(Be+1)+`: +`+Ce.showPosition()+` +Expecting `+We.join(", ")+", got '"+(this.terminals_[se]||se)+"'":Oe="Parse error on line "+(Be+1)+": Unexpected "+(se==Ie?"end of input":"'"+(this.terminals_[se]||se)+"'"),this.parseError(Oe,{text:Ce.match,token:this.terminals_[se]||se,line:Ce.yylineno,loc:xe,expected:We})}if(ve[0]instanceof Array&&ve.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ke+", token: "+se);switch(ve[0]){case 1:de.push(se),Te.push(Ce.yytext),q.push(Ce.yylloc),de.push(ve[1]),se=null,le?(se=le,le=null):(Ye=Ce.yyleng,pe=Ce.yytext,Be=Ce.yylineno,xe=Ce.yylloc,He>0&&He--);break;case 2:if(Ke=this.productions_[ve[1]][1],_e.$=Te[Te.length-Ke],_e._$={first_line:q[q.length-(Ke||1)].first_line,last_line:q[q.length-1].last_line,first_column:q[q.length-(Ke||1)].first_column,last_column:q[q.length-1].last_column},W&&(_e._$.range=[q[q.length-(Ke||1)].range[0],q[q.length-1].range[1]]),Re=this.performAction.apply(_e,[pe,Ye,Be,Fe.yy,ve[1],Te,q].concat(Ne)),typeof Re<"u")return Re;Ke&&(de=de.slice(0,-1*Ke*2),Te=Te.slice(0,-1*Ke),q=q.slice(0,-1*Ke)),de.push(this.productions_[ve[1]][0]),Te.push(_e.$),q.push(_e._$),xt=Ve[de[de.length-2]][de[de.length-1]],de.push(xt);break;case 3:return!0}}return!0},"parse")},ee=(function(){var K={EOF:1,parseError:o(function(Q,de){if(this.yy.parser)this.yy.parser.parseError(Q,de);else throw new Error(Q)},"parseError"),setInput:o(function(ae,Q){return this.yy=Q||this.yy||{},this._input=ae,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var ae=this._input[0];this.yytext+=ae,this.yyleng++,this.offset++,this.match+=ae,this.matched+=ae;var Q=ae.match(/(?:\r\n?|\n).*/g);return Q?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ae},"input"),unput:o(function(ae){var Q=ae.length,de=ae.split(/(?:\r\n?|\n)/g);this._input=ae+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Q),this.offset-=Q;var ne=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),de.length-1&&(this.yylineno-=de.length-1);var Te=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:de?(de.length===ne.length?this.yylloc.first_column:0)+ne[ne.length-de.length].length-de[0].length:this.yylloc.first_column-Q},this.options.ranges&&(this.yylloc.range=[Te[0],Te[0]+this.yyleng-Q]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(ae){this.unput(this.match.slice(ae))},"less"),pastInput:o(function(){var ae=this.matched.substr(0,this.matched.length-this.match.length);return(ae.length>20?"...":"")+ae.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var ae=this.match;return ae.length<20&&(ae+=this._input.substr(0,20-ae.length)),(ae.substr(0,20)+(ae.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var ae=this.pastInput(),Q=new Array(ae.length+1).join("-");return ae+this.upcomingInput()+` +`+Q+"^"},"showPosition"),test_match:o(function(ae,Q){var de,ne,Te;if(this.options.backtrack_lexer&&(Te={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Te.yylloc.range=this.yylloc.range.slice(0))),ne=ae[0].match(/(?:\r\n?|\n).*/g),ne&&(this.yylineno+=ne.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ne?ne[ne.length-1].length-ne[ne.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ae[0].length},this.yytext+=ae[0],this.match+=ae[0],this.matches=ae,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ae[0].length),this.matched+=ae[0],de=this.performAction.call(this,this.yy,this,Q,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),de)return de;if(this._backtrack){for(var q in Te)this[q]=Te[q];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ae,Q,de,ne;this._more||(this.yytext="",this.match="");for(var Te=this._currentRules(),q=0;qQ[0].length)){if(Q=de,ne=q,this.options.backtrack_lexer){if(ae=this.test_match(de,Te[q]),ae!==!1)return ae;if(this._backtrack){Q=!1;continue}else return!1}else if(!this.options.flex)break}return Q?(ae=this.test_match(Q,Te[ne]),ae!==!1?ae:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Q=this.next();return Q||this.lex()},"lex"),begin:o(function(Q){this.conditionStack.push(Q)},"begin"),popState:o(function(){var Q=this.conditionStack.length-1;return Q>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Q){return Q=this.conditionStack.length-1-Math.abs(Q||0),Q>=0?this.conditionStack[Q]:"INITIAL"},"topState"),pushState:o(function(Q){this.begin(Q)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(Q,de,ne,Te){var q=Te;switch(ne){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 70;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 59;case 25:return 56;case 26:return 56;case 27:return 60;case 28:break;case 29:return this.popState(),19;break;case 30:return de.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 63;case 42:return 65;case 43:return 65;case 44:return 65;case 45:return 63;case 46:return 63;case 47:return 64;case 48:return 64;case 49:return 64;case 50:return 64;case 51:return 64;case 52:return 65;case 53:return 64;case 54:return 65;case 55:return 66;case 56:return 66;case 57:return 66;case 58:return 66;case 59:return 63;case 60:return 64;case 61:return 65;case 62:return 67;case 63:return 68;case 64:return 69;case 65:return 69;case 66:return 68;case 67:return 68;case 68:return 68;case 69:return 41;case 70:return 47;case 71:return 40;case 72:return 48;case 73:return de.yytext[0];case 74:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:[0-9])/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,69,70],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74],inclusive:!0}}};return K})();re.lexer=ee;function Z(){this.yy={}}return o(Z,"Parser"),Z.prototype=re,re.Parser=Z,new Z})();UI.parser=UI;Tfe=UI});var _E,kfe=N(()=>{"use strict";pt();Xt();ci();tr();_E=class{constructor(){this.entities=new Map;this.relationships=[];this.classes=new Map;this.direction="TB";this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"};this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"};this.setAccTitle=Rr;this.getAccTitle=Mr;this.setAccDescription=Ir;this.getAccDescription=Or;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getConfig=o(()=>ge().er,"getConfig");this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"ErDB")}addEntity(e,r=""){return this.entities.has(e)?!this.entities.get(e)?.alias&&r&&(this.entities.get(e).alias=r,X.info(`Add alias '${r}' to entity '${e}'`)):(this.entities.set(e,{id:`entity-${e}-${this.entities.size}`,label:e,attributes:[],alias:r,shape:"erBox",look:ge().look??"default",cssClasses:"default",cssStyles:[]}),X.info("Added new entity :",e)),this.entities.get(e)}getEntity(e){return this.entities.get(e)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(e,r){let n=this.addEntity(e),i;for(i=r.length-1;i>=0;i--)r[i].keys||(r[i].keys=[]),r[i].comment||(r[i].comment=""),n.attributes.push(r[i]),X.debug("Added attribute ",r[i].name)}addRelationship(e,r,n,i){let a=this.entities.get(e),s=this.entities.get(n);if(!a||!s)return;let l={entityA:a.id,roleA:r,entityB:s.id,relSpec:i};this.relationships.push(l),X.debug("Added new relationship :",l)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(e){this.direction=e}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}addCssStyles(e,r){for(let n of e){let i=this.entities.get(n);if(!r||!i)return;for(let a of r)i.cssStyles.push(a)}}addClass(e,r){e.forEach(n=>{let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)})})}setClass(e,r){for(let n of e){let i=this.entities.get(n);if(i)for(let a of r)i.cssClasses+=" "+a}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],Sr()}getData(){let e=[],r=[],n=ge();for(let a of this.entities.keys()){let s=this.entities.get(a);s&&(s.cssCompiledStyles=this.getCompiledStyles(s.cssClasses.split(" ")),e.push(s))}let i=0;for(let a of this.relationships){let s={id:xc(a.entityA,a.entityB,{prefix:"id",counter:i++}),type:"normal",curve:"basis",start:a.entityA,end:a.entityB,label:a.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:a.relSpec.cardB.toLowerCase(),arrowTypeEnd:a.relSpec.cardA.toLowerCase(),pattern:a.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:"TB"}}}});var HI={};dr(HI,{draw:()=>lWe});var lWe,Efe=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();yr();lWe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing er diagram (unified)",e);let{securityLevel:i,er:a,layout:s}=ge(),l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=$c(s),l.config.flowchart.nodeSpacing=a?.nodeSpacing||140,l.config.flowchart.rankSpacing=a?.rankSpacing||80,l.direction=n.db.getDirection(),l.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],l.diagramId=e,await Qo(l,u),l.layoutAlgorithm==="elk"&&u.select(".edges").lower();let h=u.selectAll('[id*="-background"]');Array.from(h).length>0&&h.each(function(){let d=qe(this),m=d.attr("id").replace("-background",""),g=u.select(`#${CSS.escape(m)}`);if(!g.empty()){let y=g.attr("transform");d.attr("transform",y)}});let f=8;qt.insertTitle(u,"erDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,f,"erDiagram",a?.useMaxWidth??!0)},"draw")});var cWe,uWe,Sfe,Cfe=N(()=>{"use strict";eo();cWe=o((t,e)=>{let r=ld,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Ka(n,i,a,e)},"fade"),uWe=o(t=>` + .entityBox { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${t.tertiaryColor}; + opacity: 0.7; + background-color: ${t.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .labelBkg { + background-color: ${cWe(t.tertiaryColor,.5)}; + } + + .edgeLabel .label { + fill: ${t.nodeBorder}; + font-size: 14px; + } + + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + + .edge-pattern-dashed { + stroke-dasharray: 8,8; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon + { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .relationshipLine { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; + } + + .marker { + fill: none !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; + } +`,"getStyles"),Sfe=uWe});var Afe={};dr(Afe,{diagram:()=>hWe});var hWe,_fe=N(()=>{"use strict";wfe();kfe();Efe();Cfe();hWe={parser:Tfe,get db(){return new _E},renderer:HI,styles:Sfe}});function li(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function Ta(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"}function qI(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function _p(t){return typeof t=="object"&&t!==null&&li(t.container)&&Ta(t.reference)&&typeof t.message=="string"}function Ol(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function If(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function Lx(t){return Ol(t)&&typeof t.fullText=="string"}var Ap,Pl=N(()=>{"use strict";o(li,"isAstNode");o(Ta,"isReference");o(qI,"isAstNodeDescription");o(_p,"isLinkingError");Ap=class{static{o(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,r){return li(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.computeIsSubtype(e,r);return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}};o(Ol,"isCompositeCstNode");o(If,"isLeafCstNode");o(Lx,"isRootCstNode")});function mWe(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function DE(t){return!!t&&typeof t[Symbol.iterator]=="function"}function an(...t){if(t.length===1){let e=t[0];if(e instanceof po)return e;if(DE(e))return new po(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new po(()=>({index:0}),r=>r.index1?new po(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{"use strict";po=class t{static{o(this,"StreamImpl")}constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return za})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=mWe(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?za:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return za})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(DE(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return za})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(DE(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return za})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?za:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return za})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};o(mWe,"toString");o(DE,"isIterable");Rx=new po(()=>{},()=>za),za=Object.freeze({done:!0,value:void 0});o(an,"stream");Gc=class extends po{static{o(this,"TreeStreamImpl")}constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return za})}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),prune:o(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,l)=>s+l,0)}o(e,"sum"),t.sum=e;function r(a){return a.reduce((s,l)=>s*l,0)}o(r,"product"),t.product=r;function n(a){return a.reduce((s,l)=>Math.min(s,l))}o(n,"min"),t.min=n;function i(a){return a.reduce((s,l)=>Math.max(s,l))}o(i,"max"),t.max=i})(vg||(vg={}))});var RE={};dr(RE,{DefaultNameRegexp:()=>LE,RangeComparison:()=>Vc,compareRange:()=>Rfe,findCommentNode:()=>jI,findDeclarationNodeAtOffset:()=>yWe,findLeafNodeAtOffset:()=>KI,findLeafNodeBeforeOffset:()=>Nfe,flattenCst:()=>gWe,getInteriorNodes:()=>bWe,getNextNode:()=>vWe,getPreviousNode:()=>Ife,getStartlineNode:()=>xWe,inRange:()=>XI,isChildNode:()=>YI,isCommentNode:()=>WI,streamCst:()=>Dp,toDocumentSegment:()=>Lp,tokenToRange:()=>xg});function Dp(t){return new Gc(t,e=>Ol(e)?e.content:[],{includeRoot:!0})}function gWe(t){return Dp(t).filter(If)}function YI(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function xg(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function Lp(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function Rfe(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return Vc.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineVc.After}function yWe(t,e,r=LE){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return KI(t,e)}}function jI(t,e){if(t){let r=Ife(t,!0);if(r&&WI(r,e))return r;if(Lx(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(WI(a,e))return a}}}}function WI(t,e){return If(t)&&e.includes(t.tokenType.name)}function KI(t,e){if(If(t))return t;if(Ol(t)){let r=Mfe(t,e,!1);if(r)return KI(r,e)}}function Nfe(t,e){if(If(t))return t;if(Ol(t)){let r=Mfe(t,e,!0);if(r)return Nfe(r,e)}}function Mfe(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),l=t.content[s];if(l.offset<=e&&l.end>e)return l;l.end<=e?(a=r?l:void 0,n=s+1):i=s-1}return a}function Ife(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function vWe(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{"use strict";Pl();Ys();o(Dp,"streamCst");o(gWe,"flattenCst");o(YI,"isChildNode");o(xg,"tokenToRange");o(Lp,"toDocumentSegment");(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside"})(Vc||(Vc={}));o(Rfe,"compareRange");o(XI,"inRange");LE=/^[\w\p{L}]$/u;o(yWe,"findDeclarationNodeAtOffset");o(jI,"findCommentNode");o(WI,"isCommentNode");o(KI,"findLeafNodeAtOffset");o(Nfe,"findLeafNodeBeforeOffset");o(Mfe,"binarySearch");o(Ife,"getPreviousNode");o(vWe,"getNextNode");o(xWe,"getStartlineNode");o(bWe,"getInteriorNodes");o(TWe,"getCommonParent");o(Lfe,"getParentChain")});function Uc(t){throw new Error("Error! The input value was not handled.")}var Rp,NE=N(()=>{"use strict";Rp=class extends Error{static{o(this,"ErrorWithLocation")}constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};o(Uc,"assertUnreachable")});var zx={};dr(zx,{AbstractElement:()=>wg,AbstractRule:()=>bg,AbstractType:()=>Tg,Action:()=>Gg,Alternatives:()=>Vg,ArrayLiteral:()=>kg,ArrayType:()=>Eg,Assignment:()=>Ug,BooleanLiteral:()=>Sg,CharacterRange:()=>Hg,Condition:()=>Nx,Conjunction:()=>Cg,CrossReference:()=>qg,Disjunction:()=>Ag,EndOfFile:()=>Wg,Grammar:()=>_g,GrammarImport:()=>Ix,Group:()=>Yg,InferredType:()=>Dg,Interface:()=>Lg,Keyword:()=>Xg,LangiumGrammarAstReflection:()=>i1,LangiumGrammarTerminals:()=>wWe,NamedArgument:()=>Ox,NegatedToken:()=>jg,Negation:()=>Rg,NumberLiteral:()=>Ng,Parameter:()=>Mg,ParameterReference:()=>Ig,ParserRule:()=>Og,ReferenceType:()=>Pg,RegexToken:()=>Kg,ReturnType:()=>Px,RuleCall:()=>Qg,SimpleType:()=>Bg,StringLiteral:()=>Fg,TerminalAlternatives:()=>Zg,TerminalGroup:()=>Jg,TerminalRule:()=>Np,TerminalRuleCall:()=>e1,Type:()=>$g,TypeAttribute:()=>Bx,TypeDefinition:()=>ME,UnionType:()=>zg,UnorderedGroup:()=>t1,UntilToken:()=>r1,ValueLiteral:()=>Mx,Wildcard:()=>n1,isAbstractElement:()=>Fx,isAbstractRule:()=>kWe,isAbstractType:()=>EWe,isAction:()=>qu,isAlternatives:()=>BE,isArrayLiteral:()=>DWe,isArrayType:()=>QI,isAssignment:()=>Fl,isBooleanLiteral:()=>ZI,isCharacterRange:()=>sO,isCondition:()=>SWe,isConjunction:()=>JI,isCrossReference:()=>Mp,isDisjunction:()=>eO,isEndOfFile:()=>oO,isFeatureName:()=>CWe,isGrammar:()=>LWe,isGrammarImport:()=>RWe,isGroup:()=>Of,isInferredType:()=>IE,isInterface:()=>OE,isKeyword:()=>Zo,isNamedArgument:()=>NWe,isNegatedToken:()=>lO,isNegation:()=>tO,isNumberLiteral:()=>MWe,isParameter:()=>IWe,isParameterReference:()=>rO,isParserRule:()=>Ga,isPrimitiveType:()=>Ofe,isReferenceType:()=>nO,isRegexToken:()=>cO,isReturnType:()=>iO,isRuleCall:()=>$l,isSimpleType:()=>PE,isStringLiteral:()=>OWe,isTerminalAlternatives:()=>uO,isTerminalGroup:()=>hO,isTerminalRule:()=>mo,isTerminalRuleCall:()=>FE,isType:()=>$x,isTypeAttribute:()=>PWe,isTypeDefinition:()=>AWe,isUnionType:()=>aO,isUnorderedGroup:()=>$E,isUntilToken:()=>fO,isValueLiteral:()=>_We,isWildcard:()=>dO,reflection:()=>pr});function kWe(t){return pr.isInstance(t,bg)}function EWe(t){return pr.isInstance(t,Tg)}function SWe(t){return pr.isInstance(t,Nx)}function CWe(t){return Ofe(t)||t==="current"||t==="entry"||t==="extends"||t==="false"||t==="fragment"||t==="grammar"||t==="hidden"||t==="import"||t==="interface"||t==="returns"||t==="terminal"||t==="true"||t==="type"||t==="infer"||t==="infers"||t==="with"||typeof t=="string"&&/\^?[_a-zA-Z][\w_]*/.test(t)}function Ofe(t){return t==="string"||t==="number"||t==="boolean"||t==="Date"||t==="bigint"}function AWe(t){return pr.isInstance(t,ME)}function _We(t){return pr.isInstance(t,Mx)}function Fx(t){return pr.isInstance(t,wg)}function DWe(t){return pr.isInstance(t,kg)}function QI(t){return pr.isInstance(t,Eg)}function ZI(t){return pr.isInstance(t,Sg)}function JI(t){return pr.isInstance(t,Cg)}function eO(t){return pr.isInstance(t,Ag)}function LWe(t){return pr.isInstance(t,_g)}function RWe(t){return pr.isInstance(t,Ix)}function IE(t){return pr.isInstance(t,Dg)}function OE(t){return pr.isInstance(t,Lg)}function NWe(t){return pr.isInstance(t,Ox)}function tO(t){return pr.isInstance(t,Rg)}function MWe(t){return pr.isInstance(t,Ng)}function IWe(t){return pr.isInstance(t,Mg)}function rO(t){return pr.isInstance(t,Ig)}function Ga(t){return pr.isInstance(t,Og)}function nO(t){return pr.isInstance(t,Pg)}function iO(t){return pr.isInstance(t,Px)}function PE(t){return pr.isInstance(t,Bg)}function OWe(t){return pr.isInstance(t,Fg)}function mo(t){return pr.isInstance(t,Np)}function $x(t){return pr.isInstance(t,$g)}function PWe(t){return pr.isInstance(t,Bx)}function aO(t){return pr.isInstance(t,zg)}function qu(t){return pr.isInstance(t,Gg)}function BE(t){return pr.isInstance(t,Vg)}function Fl(t){return pr.isInstance(t,Ug)}function sO(t){return pr.isInstance(t,Hg)}function Mp(t){return pr.isInstance(t,qg)}function oO(t){return pr.isInstance(t,Wg)}function Of(t){return pr.isInstance(t,Yg)}function Zo(t){return pr.isInstance(t,Xg)}function lO(t){return pr.isInstance(t,jg)}function cO(t){return pr.isInstance(t,Kg)}function $l(t){return pr.isInstance(t,Qg)}function uO(t){return pr.isInstance(t,Zg)}function hO(t){return pr.isInstance(t,Jg)}function FE(t){return pr.isInstance(t,e1)}function $E(t){return pr.isInstance(t,t1)}function fO(t){return pr.isInstance(t,r1)}function dO(t){return pr.isInstance(t,n1)}var wWe,bg,Tg,Nx,ME,Mx,wg,kg,Eg,Sg,Cg,Ag,_g,Ix,Dg,Lg,Ox,Rg,Ng,Mg,Ig,Og,Pg,Px,Bg,Fg,Np,$g,Bx,zg,Gg,Vg,Ug,Hg,qg,Wg,Yg,Xg,jg,Kg,Qg,Zg,Jg,e1,t1,r1,n1,i1,pr,Hc=N(()=>{"use strict";Pl();wWe={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},bg="AbstractRule";o(kWe,"isAbstractRule");Tg="AbstractType";o(EWe,"isAbstractType");Nx="Condition";o(SWe,"isCondition");o(CWe,"isFeatureName");o(Ofe,"isPrimitiveType");ME="TypeDefinition";o(AWe,"isTypeDefinition");Mx="ValueLiteral";o(_We,"isValueLiteral");wg="AbstractElement";o(Fx,"isAbstractElement");kg="ArrayLiteral";o(DWe,"isArrayLiteral");Eg="ArrayType";o(QI,"isArrayType");Sg="BooleanLiteral";o(ZI,"isBooleanLiteral");Cg="Conjunction";o(JI,"isConjunction");Ag="Disjunction";o(eO,"isDisjunction");_g="Grammar";o(LWe,"isGrammar");Ix="GrammarImport";o(RWe,"isGrammarImport");Dg="InferredType";o(IE,"isInferredType");Lg="Interface";o(OE,"isInterface");Ox="NamedArgument";o(NWe,"isNamedArgument");Rg="Negation";o(tO,"isNegation");Ng="NumberLiteral";o(MWe,"isNumberLiteral");Mg="Parameter";o(IWe,"isParameter");Ig="ParameterReference";o(rO,"isParameterReference");Og="ParserRule";o(Ga,"isParserRule");Pg="ReferenceType";o(nO,"isReferenceType");Px="ReturnType";o(iO,"isReturnType");Bg="SimpleType";o(PE,"isSimpleType");Fg="StringLiteral";o(OWe,"isStringLiteral");Np="TerminalRule";o(mo,"isTerminalRule");$g="Type";o($x,"isType");Bx="TypeAttribute";o(PWe,"isTypeAttribute");zg="UnionType";o(aO,"isUnionType");Gg="Action";o(qu,"isAction");Vg="Alternatives";o(BE,"isAlternatives");Ug="Assignment";o(Fl,"isAssignment");Hg="CharacterRange";o(sO,"isCharacterRange");qg="CrossReference";o(Mp,"isCrossReference");Wg="EndOfFile";o(oO,"isEndOfFile");Yg="Group";o(Of,"isGroup");Xg="Keyword";o(Zo,"isKeyword");jg="NegatedToken";o(lO,"isNegatedToken");Kg="RegexToken";o(cO,"isRegexToken");Qg="RuleCall";o($l,"isRuleCall");Zg="TerminalAlternatives";o(uO,"isTerminalAlternatives");Jg="TerminalGroup";o(hO,"isTerminalGroup");e1="TerminalRuleCall";o(FE,"isTerminalRuleCall");t1="UnorderedGroup";o($E,"isUnorderedGroup");r1="UntilToken";o(fO,"isUntilToken");n1="Wildcard";o(dO,"isWildcard");i1=class extends Ap{static{o(this,"LangiumGrammarAstReflection")}getAllTypes(){return[wg,bg,Tg,Gg,Vg,kg,Eg,Ug,Sg,Hg,Nx,Cg,qg,Ag,Wg,_g,Ix,Yg,Dg,Lg,Xg,Ox,jg,Rg,Ng,Mg,Ig,Og,Pg,Kg,Px,Qg,Bg,Fg,Zg,Jg,Np,e1,$g,Bx,ME,zg,t1,r1,Mx,n1]}computeIsSubtype(e,r){switch(e){case Gg:case Vg:case Ug:case Hg:case qg:case Wg:case Yg:case Xg:case jg:case Kg:case Qg:case Zg:case Jg:case e1:case t1:case r1:case n1:return this.isSubtype(wg,r);case kg:case Ng:case Fg:return this.isSubtype(Mx,r);case Eg:case Pg:case Bg:case zg:return this.isSubtype(ME,r);case Sg:return this.isSubtype(Nx,r)||this.isSubtype(Mx,r);case Cg:case Ag:case Rg:case Ig:return this.isSubtype(Nx,r);case Dg:case Lg:case $g:return this.isSubtype(Tg,r);case Og:return this.isSubtype(bg,r)||this.isSubtype(Tg,r);case Np:return this.isSubtype(bg,r);default:return!1}}getReferenceType(e){let r=`${e.container.$type}:${e.property}`;switch(r){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return Tg;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return bg;case"Grammar:usedGrammars":return _g;case"NamedArgument:parameter":case"ParameterReference:parameter":return Mg;case"TerminalRuleCall:rule":return Np;default:throw new Error(`${r} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case wg:return{name:wg,properties:[{name:"cardinality"},{name:"lookahead"}]};case kg:return{name:kg,properties:[{name:"elements",defaultValue:[]}]};case Eg:return{name:Eg,properties:[{name:"elementType"}]};case Sg:return{name:Sg,properties:[{name:"true",defaultValue:!1}]};case Cg:return{name:Cg,properties:[{name:"left"},{name:"right"}]};case Ag:return{name:Ag,properties:[{name:"left"},{name:"right"}]};case _g:return{name:_g,properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case Ix:return{name:Ix,properties:[{name:"path"}]};case Dg:return{name:Dg,properties:[{name:"name"}]};case Lg:return{name:Lg,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case Ox:return{name:Ox,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case Rg:return{name:Rg,properties:[{name:"value"}]};case Ng:return{name:Ng,properties:[{name:"value"}]};case Mg:return{name:Mg,properties:[{name:"name"}]};case Ig:return{name:Ig,properties:[{name:"parameter"}]};case Og:return{name:Og,properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case Pg:return{name:Pg,properties:[{name:"referenceType"}]};case Px:return{name:Px,properties:[{name:"name"}]};case Bg:return{name:Bg,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case Fg:return{name:Fg,properties:[{name:"value"}]};case Np:return{name:Np,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case $g:return{name:$g,properties:[{name:"name"},{name:"type"}]};case Bx:return{name:Bx,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case zg:return{name:zg,properties:[{name:"types",defaultValue:[]}]};case Gg:return{name:Gg,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case Vg:return{name:Vg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Ug:return{name:Ug,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case Hg:return{name:Hg,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case qg:return{name:qg,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case Wg:return{name:Wg,properties:[{name:"cardinality"},{name:"lookahead"}]};case Yg:return{name:Yg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case Xg:return{name:Xg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case jg:return{name:jg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case Kg:return{name:Kg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case Qg:return{name:Qg,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case Zg:return{name:Zg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Jg:return{name:Jg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case e1:return{name:e1,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case t1:return{name:t1,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case r1:return{name:r1,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case n1:return{name:n1,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},pr=new i1});var GE={};dr(GE,{assignMandatoryProperties:()=>gO,copyAstNode:()=>mO,findLocalReferences:()=>FWe,findRootNode:()=>Gx,getContainerOfType:()=>Ip,getDocument:()=>Va,hasContainerOfType:()=>BWe,linkContentToContainer:()=>zE,streamAllContents:()=>qc,streamAst:()=>Jo,streamContents:()=>Vx,streamReferences:()=>a1});function zE(t){for(let[e,r]of Object.entries(t))e.startsWith("$")||(Array.isArray(r)?r.forEach((n,i)=>{li(n)&&(n.$container=t,n.$containerProperty=e,n.$containerIndex=i)}):li(r)&&(r.$container=t,r.$containerProperty=e))}function Ip(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function BWe(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function Va(t){let r=Gx(t).$document;if(!r)throw new Error("AST node has no document.");return r}function Gx(t){for(;t.$container;)t=t.$container;return t}function Vx(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new po(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexVx(r,e))}function Jo(t,e){if(t){if(e?.range&&!pO(t,e.range))return new Gc(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new Gc(t,r=>Vx(r,e),{includeRoot:!0})}function pO(t,e){var r;if(!e)return!0;let n=(r=t.$cstNode)===null||r===void 0?void 0:r.range;return n?XI(n,e):!1}function a1(t){return new po(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{a1(n).forEach(i=>{i.reference.ref===t&&r.push(i.reference)})}),an(r)}function gO(t,e){let r=t.getTypeMetaData(e.$type),n=e;for(let i of r.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=Pfe(i.defaultValue))}function Pfe(t){return Array.isArray(t)?[...t.map(Pfe)]:t}function mO(t,e){let r={$type:t.$type};for(let[n,i]of Object.entries(t))if(!n.startsWith("$"))if(li(i))r[n]=mO(i,e);else if(Ta(i))r[n]=e(r,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let a=[];for(let s of i)li(s)?a.push(mO(s,e)):Ta(s)?a.push(e(r,n,s.$refNode,s.$refText)):a.push(s);r[n]=a}else r[n]=i;return zE(r),r}var hs=N(()=>{"use strict";Pl();Ys();Bl();o(zE,"linkContentToContainer");o(Ip,"getContainerOfType");o(BWe,"hasContainerOfType");o(Va,"getDocument");o(Gx,"findRootNode");o(Vx,"streamContents");o(qc,"streamAllContents");o(Jo,"streamAst");o(pO,"isAstNodeInRange");o(a1,"streamReferences");o(FWe,"findLocalReferences");o(gO,"assignMandatoryProperties");o(Pfe,"copyDefaultValue");o(mO,"copyAstNode")});function lr(t){return t.charCodeAt(0)}function VE(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function s1(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function Op(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function Ux(){throw Error("Internal Error - Should never get here!")}function yO(t){return t.type==="Character"}var vO=N(()=>{"use strict";o(lr,"cc");o(VE,"insertToSet");o(s1,"addFlag");o(Op,"ASSERT_EXISTS");o(Ux,"ASSERT_NEVER_REACH_HERE");o(yO,"isCharacter")});var Hx,qx,xO,Bfe=N(()=>{"use strict";vO();Hx=[];for(let t=lr("0");t<=lr("9");t++)Hx.push(t);qx=[lr("_")].concat(Hx);for(let t=lr("a");t<=lr("z");t++)qx.push(t);for(let t=lr("A");t<=lr("Z");t++)qx.push(t);xO=[lr(" "),lr("\f"),lr(` +`),lr("\r"),lr(" "),lr("\v"),lr(" "),lr("\xA0"),lr("\u1680"),lr("\u2000"),lr("\u2001"),lr("\u2002"),lr("\u2003"),lr("\u2004"),lr("\u2005"),lr("\u2006"),lr("\u2007"),lr("\u2008"),lr("\u2009"),lr("\u200A"),lr("\u2028"),lr("\u2029"),lr("\u202F"),lr("\u205F"),lr("\u3000"),lr("\uFEFF")]});var $We,UE,zWe,Pp,Ffe=N(()=>{"use strict";vO();Bfe();$We=/[0-9a-fA-F]/,UE=/[0-9]/,zWe=/[1-9]/,Pp=class{static{o(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":s1(n,"global");break;case"i":s1(n,"ignoreCase");break;case"m":s1(n,"multiLine");break;case"u":s1(n,"unicode");break;case"y":s1(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break}Op(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return Ux()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;Op(r);break}if(!(e===!0&&r===void 0)&&Op(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),Op(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):Ux()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[lr(` +`),lr("\r"),lr("\u2028"),lr("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=Hx;break;case"D":e=Hx,r=!0;break;case"s":e=xO;break;case"S":e=xO,r=!0;break;case"w":e=qx;break;case"W":e=qx,r=!0;break}return Op(e)?{type:"Set",value:e,complement:r}:Ux()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=lr("\f");break;case"n":e=lr(` +`);break;case"r":e=lr("\r");break;case"t":e=lr(" ");break;case"v":e=lr("\v");break}return Op(e)?{type:"Character",value:e}:Ux()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:lr("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:lr(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:lr(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(yO(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(yO(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var Wc,$fe=N(()=>{"use strict";Wc=class{static{o(this,"BaseRegExpVisitor")}visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var Wx=N(()=>{"use strict";Ffe();$fe()});var HE={};dr(HE,{NEWLINE_REGEXP:()=>TO,escapeRegExp:()=>Fp,getCaseInsensitivePattern:()=>kO,getTerminalParts:()=>GWe,isMultilineComment:()=>wO,isWhitespace:()=>o1,partialMatches:()=>EO,partialRegExp:()=>Vfe,whitespaceCharacters:()=>Gfe});function GWe(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=zfe.pattern(t),r=[];for(let n of e.value.value)Bp.reset(t),Bp.visit(n),r.push({start:Bp.startRegexp,end:Bp.endRegex});return r}catch{return[]}}function wO(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),Bp.reset(t),Bp.visit(zfe.pattern(t)),Bp.multiline}catch{return!1}}function o1(t){let e=typeof t=="string"?new RegExp(t):t;return Gfe.some(r=>e.test(r))}function Fp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kO(t){return Array.prototype.map.call(t,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:Fp(e)).join("")}function EO(t,e){let r=Vfe(t),n=e.match(r);return!!n&&n[0].length>0}function Vfe(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function l(h){a+=r.substr(n,h),n+=h}o(l,"appendRaw");function u(h){a+="(?:"+r.substr(n,h)+"|$)",n+=h}for(o(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],u(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?l(s[0].length):u(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:l(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else l(1),a+=i()+"|$)";break;case")":return++n,a;default:u(1);break}return a}return o(i,"process"),new RegExp(i(),t.flags)}var TO,zfe,bO,Bp,Gfe,l1=N(()=>{"use strict";Wx();TO=/\r?\n/gm,zfe=new Pp,bO=class extends Wc{static{o(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` +`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=Fp(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` +`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},Bp=new bO;o(GWe,"getTerminalParts");o(wO,"isMultilineComment");Gfe=`\f +\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");o(o1,"isWhitespace");o(Fp,"escapeRegExp");o(kO,"getCaseInsensitivePattern");o(EO,"partialMatches");o(Vfe,"partialRegExp")});var WE={};dr(WE,{findAssignment:()=>MO,findNameAssignment:()=>qE,findNodeForKeyword:()=>RO,findNodeForProperty:()=>Xx,findNodesForKeyword:()=>VWe,findNodesForKeywordInternal:()=>NO,findNodesForProperty:()=>DO,getActionAtElement:()=>Yfe,getActionType:()=>jfe,getAllReachableRules:()=>Yx,getCrossReferenceTerminal:()=>AO,getEntryRule:()=>Ufe,getExplicitRuleType:()=>c1,getHiddenRules:()=>Hfe,getRuleType:()=>IO,getRuleTypeName:()=>YWe,getTypeName:()=>Kx,isArrayCardinality:()=>HWe,isArrayOperator:()=>qWe,isCommentTerminal:()=>_O,isDataType:()=>WWe,isDataTypeRule:()=>jx,isOptionalCardinality:()=>UWe,terminalRegex:()=>u1});function Ufe(t){return t.rules.find(e=>Ga(e)&&e.entry)}function Hfe(t){return t.rules.filter(e=>mo(e)&&e.hidden)}function Yx(t,e){let r=new Set,n=Ufe(t);if(!n)return new Set(t.rules);let i=[n].concat(Hfe(t));for(let s of i)qfe(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||mo(s)&&s.hidden)&&a.add(s);return a}function qfe(t,e,r){e.add(t.name),qc(t).forEach(n=>{if($l(n)||r&&FE(n)){let i=n.rule.ref;i&&!e.has(i.name)&&qfe(i,e,r)}})}function AO(t){if(t.terminal)return t.terminal;if(t.type.ref){let e=qE(t.type.ref);return e?.terminal}}function _O(t){return t.hidden&&!o1(u1(t))}function DO(t,e){return!t||!e?[]:LO(t,e,t.astNode,!0)}function Xx(t,e,r){if(!t||!e)return;let n=LO(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function LO(t,e,r,n){if(!n){let i=Ip(t.grammarSource,Fl);if(i&&i.feature===e)return[t]}return Ol(t)&&t.astNode===r?t.content.flatMap(i=>LO(i,e,r,!1)):[]}function VWe(t,e){return t?NO(t,e,t?.astNode):[]}function RO(t,e,r){if(!t)return;let n=NO(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function NO(t,e,r){if(t.astNode!==r)return[];if(Zo(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Dp(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?Zo(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function MO(t){var e;let r=t.astNode;for(;r===((e=t.container)===null||e===void 0?void 0:e.astNode);){let n=Ip(t.grammarSource,Fl);if(n)return n;t=t.container}}function qE(t){let e=t;return IE(e)&&(qu(e.$container)?e=e.$container.$container:Ga(e.$container)?e=e.$container:Uc(e.$container)),Wfe(t,e,new Map)}function Wfe(t,e,r){var n;function i(a,s){let l;return Ip(a,Fl)||(l=Wfe(s,s,r)),r.set(t,l),l}if(o(i,"go"),r.has(t))return r.get(t);r.set(t,void 0);for(let a of qc(e)){if(Fl(a)&&a.feature.toLowerCase()==="name")return r.set(t,a),a;if($l(a)&&Ga(a.rule.ref))return i(a,a.rule.ref);if(PE(a)&&(!((n=a.typeRef)===null||n===void 0)&&n.ref))return i(a,a.typeRef.ref)}}function Yfe(t){let e=t.$container;if(Of(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if(qu(a))return a;{let s=qc(r[i]).find(qu);if(s)return s}}}if(Fx(e))return Yfe(e)}function UWe(t,e){return t==="?"||t==="*"||Of(e)&&!!e.guardCondition}function HWe(t){return t==="*"||t==="+"}function qWe(t){return t==="+="}function jx(t){return Xfe(t,new Set)}function Xfe(t,e){if(e.has(t))return!0;e.add(t);for(let r of qc(t))if($l(r)){if(!r.rule.ref||Ga(r.rule.ref)&&!Xfe(r.rule.ref,e))return!1}else{if(Fl(r))return!1;if(qu(r))return!1}return!!t.definition}function WWe(t){return CO(t.type,new Set)}function CO(t,e){if(e.has(t))return!0;if(e.add(t),QI(t))return!1;if(nO(t))return!1;if(aO(t))return t.types.every(r=>CO(r,e));if(PE(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return $x(r)?CO(r.type,e):!1}else return!1}else return!1}function c1(t){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e){if(Ga(e))return e.name;if(OE(e)||$x(e))return e.name}}}function Kx(t){var e;if(Ga(t))return jx(t)?t.name:(e=c1(t))!==null&&e!==void 0?e:t.name;if(OE(t)||$x(t)||iO(t))return t.name;if(qu(t)){let r=jfe(t);if(r)return r}else if(IE(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function jfe(t){var e;if(t.inferredType)return t.inferredType.name;if(!((e=t.type)===null||e===void 0)&&e.ref)return Kx(t.type.ref)}function YWe(t){var e,r,n;return mo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":jx(t)?t.name:(n=c1(t))!==null&&n!==void 0?n:t.name}function IO(t){var e,r,n;return mo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":(n=c1(t))!==null&&n!==void 0?n:t.name}function u1(t){let e={s:!1,i:!1,u:!1},r=h1(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function h1(t,e){if(uO(t))return XWe(t);if(hO(t))return jWe(t);if(sO(t))return ZWe(t);if(FE(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return Wu(h1(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead})}else{if(lO(t))return QWe(t);if(fO(t))return KWe(t);if(cO(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),Wu(n,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}else{if(dO(t))return Wu(OO,{cardinality:t.cardinality,lookahead:t.lookahead});throw new Error(`Invalid terminal element: ${t?.$type}`)}}}function XWe(t){return Wu(t.elements.map(e=>h1(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead})}function jWe(t){return Wu(t.elements.map(e=>h1(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead})}function KWe(t){return Wu(`${OO}*?${h1(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead})}function QWe(t){return Wu(`(?!${h1(t.terminal)})${OO}*?`,{cardinality:t.cardinality,lookahead:t.lookahead})}function ZWe(t){return t.right?Wu(`[${SO(t.left)}-${SO(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1}):Wu(SO(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}function SO(t){return Fp(t.value)}function Wu(t,e){var r;return(e.wrap!==!1||e.lookahead)&&(t=`(${(r=e.lookahead)!==null&&r!==void 0?r:""}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var OO,zl=N(()=>{"use strict";NE();Hc();Pl();hs();Bl();l1();o(Ufe,"getEntryRule");o(Hfe,"getHiddenRules");o(Yx,"getAllReachableRules");o(qfe,"ruleDfs");o(AO,"getCrossReferenceTerminal");o(_O,"isCommentTerminal");o(DO,"findNodesForProperty");o(Xx,"findNodeForProperty");o(LO,"findNodesForPropertyInternal");o(VWe,"findNodesForKeyword");o(RO,"findNodeForKeyword");o(NO,"findNodesForKeywordInternal");o(MO,"findAssignment");o(qE,"findNameAssignment");o(Wfe,"findNameAssignmentInternal");o(Yfe,"getActionAtElement");o(UWe,"isOptionalCardinality");o(HWe,"isArrayCardinality");o(qWe,"isArrayOperator");o(jx,"isDataTypeRule");o(Xfe,"isDataTypeRuleInternal");o(WWe,"isDataType");o(CO,"isDataTypeInternal");o(c1,"getExplicitRuleType");o(Kx,"getTypeName");o(jfe,"getActionType");o(YWe,"getRuleTypeName");o(IO,"getRuleType");o(u1,"terminalRegex");OO=/[\s\S]/.source;o(h1,"abstractElementToRegex");o(XWe,"terminalAlternativesToRegex");o(jWe,"terminalGroupToRegex");o(KWe,"untilTokenToRegex");o(QWe,"negateTokenToRegex");o(ZWe,"characterRangeToRegex");o(SO,"keywordToRegex");o(Wu,"withCardinality")});function PO(t){let e=[],r=t.Grammar;for(let n of r.rules)mo(n)&&_O(n)&&wO(u1(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:LE}}var BO=N(()=>{"use strict";Bl();zl();l1();Hc();o(PO,"createGrammarConfig")});var FO=N(()=>{"use strict"});function f1(t){console&&console.error&&console.error(`Error: ${t}`)}function Qx(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var Kfe=N(()=>{"use strict";o(f1,"PRINT_ERROR");o(Qx,"PRINT_WARNING")});function Zx(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var Qfe=N(()=>{"use strict";o(Zx,"timer")});function Jx(t){function e(){}o(e,"FakeConstructor"),e.prototype=t;let r=new e;function n(){return typeof r.bar}return o(n,"fakeAccess"),n(),n(),t;(0,eval)(t)}var Zfe=N(()=>{"use strict";o(Jx,"toFastProperties")});var d1=N(()=>{"use strict";Kfe();Qfe();Zfe()});function JWe(t){return eYe(t)?t.LABEL:t.name}function eYe(t){return xi(t.LABEL)&&t.LABEL!==""}function YE(t){return rt(t,p1)}function p1(t){function e(r){return rt(r,p1)}if(o(e,"convertDefinition"),t instanceof fn){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return xi(t.label)&&(r.label=t.label),r}else{if(t instanceof Pn)return{type:"Alternative",definition:e(t.definition)};if(t instanceof dn)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Bn)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Fn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:p1(new Ar({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof _n)return{type:"RepetitionWithSeparator",idx:t.idx,separator:p1(new Ar({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof zr)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof Dn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof Ar){let r={type:"Terminal",name:t.terminalType.name,label:JWe(t.terminalType),idx:t.idx};xi(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=Uo(n)?n.source:n),r}else{if(t instanceof fs)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var go,fn,fs,Pn,dn,Bn,Fn,zr,_n,Dn,Ar,XE=N(()=>{"use strict";Yt();o(JWe,"tokenLabel");o(eYe,"hasTokenLabel");go=class{static{o(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Ae(this.definition,r=>{r.accept(e)})}},fn=class extends go{static{o(this,"NonTerminal")}constructor(e){super([]),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},fs=class extends go{static{o(this,"Rule")}constructor(e){super(e.definition),this.orgText="",pa(this,Vs(e,r=>r!==void 0))}},Pn=class extends go{static{o(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,pa(this,Vs(e,r=>r!==void 0))}},dn=class extends go{static{o(this,"Option")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},Bn=class extends go{static{o(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},Fn=class extends go{static{o(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},zr=class extends go{static{o(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},_n=class extends go{static{o(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,pa(this,Vs(e,r=>r!==void 0))}},Dn=class extends go{static{o(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,pa(this,Vs(e,r=>r!==void 0))}},Ar=class{static{o(this,"Terminal")}constructor(e){this.idx=1,pa(this,Vs(e,r=>r!==void 0))}accept(e){e.visit(this)}};o(YE,"serializeGrammar");o(p1,"serializeProduction")});var ds,Jfe=N(()=>{"use strict";XE();ds=class{static{o(this,"GAstVisitor")}visit(e){let r=e;switch(r.constructor){case fn:return this.visitNonTerminal(r);case Pn:return this.visitAlternative(r);case dn:return this.visitOption(r);case Bn:return this.visitRepetitionMandatory(r);case Fn:return this.visitRepetitionMandatoryWithSeparator(r);case _n:return this.visitRepetitionWithSeparator(r);case zr:return this.visitRepetition(r);case Dn:return this.visitAlternation(r);case Ar:return this.visitTerminal(r);case fs:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function $O(t){return t instanceof Pn||t instanceof dn||t instanceof zr||t instanceof Bn||t instanceof Fn||t instanceof _n||t instanceof Ar||t instanceof fs}function $p(t,e=[]){return t instanceof dn||t instanceof zr||t instanceof _n?!0:t instanceof Dn?z2(t.definition,n=>$p(n,e)):t instanceof fn&&jn(e,t)?!1:t instanceof go?(t instanceof fn&&e.push(t),Pa(t.definition,n=>$p(n,e))):!1}function zO(t){return t instanceof Dn}function Xs(t){if(t instanceof fn)return"SUBRULE";if(t instanceof dn)return"OPTION";if(t instanceof Dn)return"OR";if(t instanceof Bn)return"AT_LEAST_ONE";if(t instanceof Fn)return"AT_LEAST_ONE_SEP";if(t instanceof _n)return"MANY_SEP";if(t instanceof zr)return"MANY";if(t instanceof Ar)return"CONSUME";throw Error("non exhaustive match")}var ede=N(()=>{"use strict";Yt();XE();o($O,"isSequenceProd");o($p,"isOptionalProd");o(zO,"isBranchingProd");o(Xs,"getProductionDslName")});var ps=N(()=>{"use strict";XE();Jfe();ede()});function tde(t,e,r){return[new dn({definition:[new Ar({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var Yu,jE=N(()=>{"use strict";Yt();ps();Yu=class{static{o(this,"RestWalker")}walk(e,r=[]){Ae(e.definition,(n,i)=>{let a=yi(e.definition,i+1);if(n instanceof fn)this.walkProdRef(n,a,r);else if(n instanceof Ar)this.walkTerminal(n,a,r);else if(n instanceof Pn)this.walkFlat(n,a,r);else if(n instanceof dn)this.walkOption(n,a,r);else if(n instanceof Bn)this.walkAtLeastOne(n,a,r);else if(n instanceof Fn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof _n)this.walkManySep(n,a,r);else if(n instanceof zr)this.walkMany(n,a,r);else if(n instanceof Dn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new dn({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=tde(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new dn({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=tde(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Ae(e.definition,a=>{let s=new Pn({definition:[a]});this.walk(s,i)})}};o(tde,"restForRepetitionWithSeparator")});function zp(t){if(t instanceof fn)return zp(t.referencedRule);if(t instanceof Ar)return nYe(t);if($O(t))return tYe(t);if(zO(t))return rYe(t);throw Error("non exhaustive match")}function tYe(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=$p(a),e=e.concat(zp(a)),n=n+1,i=r.length>n;return qm(e)}function rYe(t){let e=rt(t.definition,r=>zp(r));return qm(Qr(e))}function nYe(t){return[t.terminalType]}var GO=N(()=>{"use strict";Yt();ps();o(zp,"first");o(tYe,"firstForSequence");o(rYe,"firstForBranching");o(nYe,"firstForTerminal")});var KE,VO=N(()=>{"use strict";KE="_~IN~_"});function rde(t){let e={};return Ae(t,r=>{let n=new UO(r).startWalking();pa(e,n)}),e}function iYe(t,e){return t.name+e+KE}var UO,nde=N(()=>{"use strict";jE();GO();Yt();VO();ps();UO=class extends Yu{static{o(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=iYe(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new Pn({definition:a}),l=zp(s);this.follows[i]=l}};o(rde,"computeAllProdsFollows");o(iYe,"buildBetweenProdsFollowPrefix")});function m1(t){let e=t.toString();if(QE.hasOwnProperty(e))return QE[e];{let r=aYe.pattern(e);return QE[e]=r,r}}function ide(){QE={}}var QE,aYe,ZE=N(()=>{"use strict";Wx();QE={},aYe=new Pp;o(m1,"getRegExpAst");o(ide,"clearRegExpParserCache")});function ode(t,e=!1){try{let r=m1(t);return HO(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===sde)e&&Qx(`${eb} Unable to optimize: < ${t.toString()} > + Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),f1(`${eb} + Failed parsing: < ${t.toString()} > + Using the @chevrotain/regexp-to-ast library + Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function HO(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")JE(u,e,r);else{let h=u;if(r===!0)for(let f=h.from;f<=h.to;f++)JE(f,e,r);else{for(let f=h.from;f<=h.to&&f=g1){let f=h.from>=g1?h.from:g1,d=h.to,p=Yc(f),m=Yc(d);for(let g=p;g<=m;g++)e[g]=g}}}});break;case"Group":HO(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let l=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&qO(s)===!1||s.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return kr(e)}function JE(t,e,r){let n=Yc(t);e[n]=n,r===!0&&sYe(t,e)}function sYe(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=Yc(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=Yc(i.charCodeAt(0));e[a]=a}}}function ade(t,e){return os(t.value,r=>{if(typeof r=="number")return jn(e,r);{let n=r;return os(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function qO(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Bt(t.value)?Pa(t.value,qO):qO(t.value):!1}function eS(t,e){if(e instanceof RegExp){let r=m1(e),n=new WO(t);return n.visit(r),n.found}else return os(e,r=>jn(t,r.charCodeAt(0)))!==void 0}var sde,eb,WO,lde=N(()=>{"use strict";Wx();Yt();d1();ZE();YO();sde="Complement Sets are not supported for first char optimization",eb=`Unable to use "first char" lexer optimizations: +`;o(ode,"getOptimizedStartCodesIndices");o(HO,"firstCharOptimizedIndices");o(JE,"addOptimizedIdxToResult");o(sYe,"handleIgnoreCase");o(ade,"findCode");o(qO,"isWholeOptional");WO=class extends Wc{static{o(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){jn(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?ade(e,this.targetCharCodes)===void 0&&(this.found=!0):ade(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};o(eS,"canMatchCharCode")});function hde(t,e){e=of(e,{useSticky:jO,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:o((b,T)=>T(),"tracer")});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{EYe()});let n;r("Reject Lexer.NA",()=>{n=cf(t,b=>b[Gp]===Zn.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=rt(n,b=>{let T=b[Gp];if(Uo(T)){let S=T.source;return S.length===1&&S!=="^"&&S!=="$"&&S!=="."&&!T.ignoreCase?S:S.length===2&&S[0]==="\\"&&!jn(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],S[1])?S[1]:e.useSticky?ude(T):cde(T)}else{if(Si(T))return i=!0,{exec:T};if(typeof T=="object")return i=!0,T;if(typeof T=="string"){if(T.length===1)return T;{let S=T.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),w=new RegExp(S);return e.useSticky?ude(w):cde(w)}}else throw Error("non exhaustive match")}})});let s,l,u,h,f;r("misc mapping",()=>{s=rt(n,b=>b.tokenTypeIdx),l=rt(n,b=>{let T=b.GROUP;if(T!==Zn.SKIPPED){if(xi(T))return T;if(xr(T))return!1;throw Error("non exhaustive match")}}),u=rt(n,b=>{let T=b.LONGER_ALT;if(T)return Bt(T)?rt(T,w=>ck(n,w)):[ck(n,T)]}),h=rt(n,b=>b.PUSH_MODE),f=rt(n,b=>Ft(b,"POP_MODE"))});let d;r("Line Terminator Handling",()=>{let b=xde(e.lineTerminatorCharacters);d=rt(n,T=>!1),e.positionTracking!=="onlyOffset"&&(d=rt(n,T=>Ft(T,"LINE_BREAKS")?!!T.LINE_BREAKS:vde(T,b)===!1&&eS(b,T.PATTERN)))});let p,m,g,y;r("Misc Mapping #2",()=>{p=rt(n,gde),m=rt(a,wYe),g=Jr(n,(b,T)=>{let S=T.GROUP;return xi(S)&&S!==Zn.SKIPPED&&(b[S]=[]),b},{}),y=rt(a,(b,T)=>({pattern:a[T],longerAlt:u[T],canLineTerminator:d[T],isCustom:p[T],short:m[T],group:l[T],push:h[T],pop:f[T],tokenTypeIdx:s[T],tokenType:n[T]}))});let v=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=Jr(n,(b,T,S)=>{if(typeof T.PATTERN=="string"){let w=T.PATTERN.charCodeAt(0),k=Yc(w);XO(b,k,y[S])}else if(Bt(T.START_CHARS_HINT)){let w;Ae(T.START_CHARS_HINT,k=>{let A=typeof k=="string"?k.charCodeAt(0):k,C=Yc(A);w!==C&&(w=C,XO(b,C,y[S]))})}else if(Uo(T.PATTERN))if(T.PATTERN.unicode)v=!1,e.ensureOptimizations&&f1(`${eb} Unable to analyze < ${T.PATTERN.toString()} > pattern. + The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let w=ode(T.PATTERN,e.ensureOptimizations);mr(w)&&(v=!1),Ae(w,k=>{XO(b,k,y[S])})}else e.ensureOptimizations&&f1(`${eb} TokenType: <${T.name}> is using a custom token pattern without providing parameter. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}function fde(t,e){let r=[],n=lYe(t);r=r.concat(n.errors);let i=cYe(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(oYe(a)),r=r.concat(yYe(a)),r=r.concat(vYe(a,e)),r=r.concat(xYe(a)),r}function oYe(t){let e=[],r=Zr(t,n=>Uo(n[Gp]));return e=e.concat(hYe(r)),e=e.concat(pYe(r)),e=e.concat(mYe(r)),e=e.concat(gYe(r)),e=e.concat(fYe(r)),e}function lYe(t){let e=Zr(t,i=>!Ft(i,Gp)),r=rt(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:Qn.MISSING_PATTERN,tokenTypes:[i]})),n=lf(t,e);return{errors:r,valid:n}}function cYe(t){let e=Zr(t,i=>{let a=i[Gp];return!Uo(a)&&!Si(a)&&!Ft(a,"exec")&&!xi(a)}),r=rt(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Qn.INVALID_PATTERN,tokenTypes:[i]})),n=lf(t,e);return{errors:r,valid:n}}function hYe(t){class e extends Wc{static{o(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=Zr(t,i=>{let a=i.PATTERN;try{let s=m1(a),l=new e;return l.visit(s),l.found}catch{return uYe.test(a.source)}});return rt(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Qn.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function fYe(t){let e=Zr(t,n=>n.PATTERN.test(""));return rt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:Qn.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function pYe(t){class e extends Wc{static{o(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=Zr(t,i=>{let a=i.PATTERN;try{let s=m1(a),l=new e;return l.visit(s),l.found}catch{return dYe.test(a.source)}});return rt(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Qn.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function mYe(t){let e=Zr(t,n=>{let i=n[Gp];return i instanceof RegExp&&(i.multiline||i.global)});return rt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Qn.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function gYe(t){let e=[],r=rt(t,a=>Jr(t,(s,l)=>(a.PATTERN.source===l.PATTERN.source&&!jn(e,l)&&l.PATTERN!==Zn.NA&&(e.push(l),s.push(l)),s),[]));r=_c(r);let n=Zr(r,a=>a.length>1);return rt(n,a=>{let s=rt(a,u=>u.name);return{message:`The same RegExp pattern ->${ea(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:Qn.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function yYe(t){let e=Zr(t,n=>{if(!Ft(n,"GROUP"))return!1;let i=n.GROUP;return i!==Zn.SKIPPED&&i!==Zn.NA&&!xi(i)});return rt(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Qn.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function vYe(t,e){let r=Zr(t,i=>i.PUSH_MODE!==void 0&&!jn(e,i.PUSH_MODE));return rt(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:Qn.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function xYe(t){let e=[],r=Jr(t,(n,i,a)=>{let s=i.PATTERN;return s===Zn.NA||(xi(s)?n.push({str:s,idx:a,tokenType:i}):Uo(s)&&TYe(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Ae(t,(n,i)=>{Ae(r,({str:a,idx:s,tokenType:l})=>{if(i${l.name}<- can never be matched. +Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:Qn.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}function bYe(t,e){if(Uo(e)){let r=e.exec(t);return r!==null&&r.index===0}else{if(Si(e))return e(t,0,[],{});if(Ft(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function TYe(t){return os([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function cde(t){let e=t.ignoreCase?"i":"";return new RegExp(`^(?:${t.source})`,e)}function ude(t){let e=t.ignoreCase?"iy":"y";return new RegExp(`${t.source}`,e)}function dde(t,e,r){let n=[];return Ft(t,y1)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+y1+`> property in its definition +`,type:Qn.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),Ft(t,tS)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+tS+`> property in its definition +`,type:Qn.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),Ft(t,tS)&&Ft(t,y1)&&!Ft(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${y1}: <${t.defaultMode}>which does not exist +`,type:Qn.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),Ft(t,tS)&&Ae(t.modes,(i,a)=>{Ae(i,(s,l)=>{if(xr(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${l}> +`,type:Qn.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(Ft(s,"LONGER_ALT")){let u=Bt(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Ae(u,h=>{!xr(h)&&!jn(i,h)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${h.name}> on token <${s.name}> outside of mode <${a}> +`,type:Qn.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function pde(t,e,r){let n=[],i=!1,a=_c(Qr(kr(t.modes))),s=cf(a,u=>u[Gp]===Zn.NA),l=xde(r);return e&&Ae(s,u=>{let h=vde(u,l);if(h!==!1){let d={message:kYe(u,h),type:h.issue,tokenType:u};n.push(d)}else Ft(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):eS(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:Qn.NO_LINE_BREAKS_FLAGS}),n}function mde(t){let e={},r=qr(t);return Ae(r,n=>{let i=t[n];if(Bt(i))e[n]=[];else throw Error("non exhaustive match")}),e}function gde(t){let e=t.PATTERN;if(Uo(e))return!1;if(Si(e))return!0;if(Ft(e,"exec"))return!0;if(xi(e))return!1;throw Error("non exhaustive match")}function wYe(t){return xi(t)&&t.length===1?t.charCodeAt(0):!1}function vde(t,e){if(Ft(t,"LINE_BREAKS"))return!1;if(Uo(t.PATTERN)){try{eS(e,t.PATTERN)}catch(r){return{issue:Qn.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(xi(t.PATTERN))return!1;if(gde(t))return{issue:Qn.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function kYe(t,e){if(e.issue===Qn.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. + The problem is in the <${t.name}> Token Type + Root cause: ${e.errMsg}. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===Qn.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. + The problem is in the <${t.name}> Token Type + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function xde(t){return rt(t,r=>xi(r)?r.charCodeAt(0):r)}function XO(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function Yc(t){return t255?255+~~(t/255):t}}var Gp,y1,tS,jO,uYe,dYe,yde,g1,rS,YO=N(()=>{"use strict";Wx();tb();Yt();d1();lde();ZE();Gp="PATTERN",y1="defaultMode",tS="modes",jO=typeof new RegExp("(?:)").sticky=="boolean";o(hde,"analyzeTokenTypes");o(fde,"validatePatterns");o(oYe,"validateRegExpPattern");o(lYe,"findMissingPatterns");o(cYe,"findInvalidPatterns");uYe=/[^\\][$]/;o(hYe,"findEndOfInputAnchor");o(fYe,"findEmptyMatchRegExps");dYe=/[^\\[][\^]|^\^/;o(pYe,"findStartOfInputAnchor");o(mYe,"findUnsupportedFlags");o(gYe,"findDuplicatePatterns");o(yYe,"findInvalidGroupType");o(vYe,"findModesThatDoNotExist");o(xYe,"findUnreachablePatterns");o(bYe,"testTokenType");o(TYe,"noMetaChar");o(cde,"addStartOfInput");o(ude,"addStickyFlag");o(dde,"performRuntimeChecks");o(pde,"performWarningRuntimeChecks");o(mde,"cloneEmptyGroups");o(gde,"isCustomPattern");o(wYe,"isShortPattern");yde={test:o(function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function SYe(t){let e=ln(t),r=t,n=!0;for(;n;){r=_c(Qr(rt(r,a=>a.CATEGORIES)));let i=lf(r,e);e=e.concat(i),mr(i)?n=!1:r=i}return e}function CYe(t){Ae(t,e=>{KO(e)||(wde[bde]=e,e.tokenTypeIdx=bde++),Tde(e)&&!Bt(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Tde(e)||(e.CATEGORIES=[]),DYe(e)||(e.categoryMatches=[]),LYe(e)||(e.categoryMatchesMap={})})}function AYe(t){Ae(t,e=>{e.categoryMatches=[],Ae(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(wde[n].tokenTypeIdx)})})}function _Ye(t){Ae(t,e=>{kde([],e)})}function kde(t,e){Ae(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Ae(e.CATEGORIES,r=>{let n=t.concat(e);jn(n,r)||kde(n,r)})}function KO(t){return Ft(t,"tokenTypeIdx")}function Tde(t){return Ft(t,"CATEGORIES")}function DYe(t){return Ft(t,"categoryMatches")}function LYe(t){return Ft(t,"categoryMatchesMap")}function Ede(t){return Ft(t,"tokenTypeIdx")}var bde,wde,Vp=N(()=>{"use strict";Yt();o(Xu,"tokenStructuredMatcher");o(v1,"tokenStructuredMatcherNoCategories");bde=1,wde={};o(ju,"augmentTokenTypes");o(SYe,"expandCategories");o(CYe,"assignTokenDefaultProps");o(AYe,"assignCategoriesTokensProp");o(_Ye,"assignCategoriesMapProp");o(kde,"singleAssignCategoriesToksMap");o(KO,"hasShortKeyProperty");o(Tde,"hasCategoriesProperty");o(DYe,"hasExtendingTokensTypesProperty");o(LYe,"hasExtendingTokensTypesMapProperty");o(Ede,"isTokenType")});var x1,QO=N(()=>{"use strict";x1={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var Qn,rb,Zn,tb=N(()=>{"use strict";YO();Yt();d1();Vp();QO();ZE();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(Qn||(Qn={}));rb={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:x1,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(rb);Zn=class{static{o(this,"Lexer")}constructor(e,r=rb){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=Zx(a),h=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=pa({},rb,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===rb.lineTerminatorsPattern)this.config.lineTerminatorsPattern=yde;else if(this.config.lineTerminatorCharacters===rb.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Bt(e)?i={modes:{defaultMode:ln(e)},defaultMode:y1}:(a=!1,i=ln(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(dde(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(pde(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Ae(i.modes,(l,u)=>{i.modes[u]=cf(l,h=>xr(h))});let s=qr(i.modes);if(Ae(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(fde(l,s))}),mr(this.lexerDefinitionErrors)){ju(l);let h;this.TRACE_INIT("analyzeTokenTypes",()=>{h=hde(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=h.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=h.charCodeToPatternIdxToConfig,this.emptyGroups=pa({},this.emptyGroups,h.emptyGroups),this.hasCustom=h.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=h.canBeOptimized}})}),this.defaultMode=i.defaultMode,!mr(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=rt(this.lexerDefinitionErrors,h=>h.message).join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+u)}Ae(this.lexerDefinitionWarning,l=>{Qx(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(jO?(this.chopInput=Qi,this.match=this.matchWithTest):(this.updateLastIndex=si,this.match=this.matchWithExec),a&&(this.handleModes=si),this.trackStartLines===!1&&(this.computeNewColumn=Qi),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=si),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=Jr(this.canModeBeOptimized,(u,h,f)=>(h===!1&&u.push(f),u),[]);if(r.ensureOptimizations&&!mr(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{ide()}),this.TRACE_INIT("toFastProperties",()=>{Jx(this)})})}tokenize(e,r=this.defaultMode){if(!mr(this.lexerDefinitionErrors)){let i=rt(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,l,u,h,f,d,p,m,g,y,v,x,b,T=e,S=T.length,w=0,k=0,A=this.hasCustom?0:Math.floor(e.length/10),C=new Array(A),R=[],I=this.trackStartLines?1:void 0,L=this.trackStartLines?1:void 0,E=mde(this.emptyGroups),D=this.trackStartLines,_=this.config.lineTerminatorsPattern,O=0,M=[],P=[],B=[],F=[];Object.freeze(F);let G;function $(){return M}o($,"getPossiblePatternsSlow");function U(J){let ue=Yc(J),re=P[ue];return re===void 0?F:re}o(U,"getPossiblePatternsOptimized");let j=o(J=>{if(B.length===1&&J.tokenType.PUSH_MODE===void 0){let ue=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(J);R.push({offset:J.startOffset,line:J.startLine,column:J.startColumn,length:J.image.length,message:ue})}else{B.pop();let ue=ma(B);M=this.patternIdxToConfig[ue],P=this.charCodeToPatternIdxToConfig[ue],O=M.length;let re=this.canModeBeOptimized[ue]&&this.config.safeMode===!1;P&&re?G=U:G=$}},"pop_mode");function te(J){B.push(J),P=this.charCodeToPatternIdxToConfig[J],M=this.patternIdxToConfig[J],O=M.length,O=M.length;let ue=this.canModeBeOptimized[J]&&this.config.safeMode===!1;P&&ue?G=U:G=$}o(te,"push_mode"),te.call(this,r);let Y,oe=this.config.recoveryEnabled;for(;wu.length){u=s,h=f,Y=ae;break}}}break}}if(u!==null){if(d=u.length,p=Y.group,p!==void 0&&(m=Y.tokenTypeIdx,g=this.createTokenInstance(u,w,m,Y.tokenType,I,L,d),this.handlePayload(g,h),p===!1?k=this.addToken(C,k,g):E[p].push(g)),e=this.chopInput(e,d),w=w+d,L=this.computeNewColumn(L,d),D===!0&&Y.canLineTerminator===!0){let ee=0,Z,K;_.lastIndex=0;do Z=_.test(u),Z===!0&&(K=_.lastIndex-1,ee++);while(Z===!0);ee!==0&&(I=I+ee,L=d-K,this.updateTokenEndLineColumnLocation(g,p,K,ee,I,L,d))}this.handleModes(Y,j,te,g)}else{let ee=w,Z=I,K=L,ae=oe===!1;for(;ae===!1&&w{"use strict";Yt();tb();Vp();o(Ku,"tokenLabel");o(ZO,"hasTokenLabel");RYe="parent",Sde="categories",Cde="label",Ade="group",_de="push_mode",Dde="pop_mode",Lde="longer_alt",Rde="line_breaks",Nde="start_chars_hint";o(Pf,"createToken");o(NYe,"createTokenInternal");yo=Pf({name:"EOF",pattern:Zn.NA});ju([yo]);o(Qu,"createTokenInstance");o(nb,"tokenMatcher")});var Zu,Mde,Gl,b1=N(()=>{"use strict";Up();Yt();ps();Zu={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${ZO(t)?`--> ${Ku(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",l=` +but found: '`+ea(e).image+"'";if(n)return a+n+l;{let u=Jr(t,(p,m)=>p.concat(m),[]),h=rt(u,p=>`[${rt(p,m=>Ku(m)).join(", ")}]`),d=`one of these possible Token sequences: +${rt(h,(p,m)=>` ${m+1}. ${p}`).join(` +`)}`;return a+d+l}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` +but found: '`+ea(e).image+"'";if(r)return i+r+s;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: + <${rt(t,h=>`[${rt(h,f=>Ku(f)).join(",")}]`).join(" ,")}>`;return i+u+s}}};Object.freeze(Zu);Mde={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-"}},Gl={buildDuplicateFoundError(t,e){function r(f){return f instanceof Ar?f.terminalType.name:f instanceof fn?f.nonTerminalName:""}o(r,"getExtraProductionArgument");let n=t.name,i=ea(e),a=i.idx,s=Xs(i),l=r(i),u=a>0,h=`->${s}${u?a:""}<- ${l?`with argument: ->${l}<-`:""} + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return h=h.replace(/[ \t]+/g," "),h=h.replace(/\s\s+/g,` +`),h},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. +The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. +To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=rt(t.prefixPath,i=>Ku(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix +in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`},buildAlternationAmbiguityError(t){let e=rt(t.prefixPath,i=>Ku(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n},buildEmptyRepetitionError(t){let e=Xs(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. +This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. +Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: + inside <${t.topLevelRule.name}> Rule. + has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=rt(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. +rule: <${e}> can be invoked from itself (directly or indirectly) +without consuming any Tokens. The grammar path that causes this is: + ${n} + To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof fs?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function Ide(t,e){let r=new JO(t,e);return r.resolveRefs(),r.errors}var JO,Ode=N(()=>{"use strict";js();Yt();ps();o(Ide,"resolveGrammar");JO=class extends ds{static{o(this,"GastRefResolverVisitor")}constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Ae(kr(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:Gi.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function sS(t,e,r=[]){r=ln(r);let n=[],i=0;function a(l){return l.concat(yi(t,i+1))}o(a,"remainingPathWith");function s(l){let u=sS(a(l),e,r);return n.concat(u)}for(o(s,"getAlternativesForProd");r.length{mr(u.definition)===!1&&(n=s(u.definition))}),n;if(l instanceof Ar)r.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:yi(t,i)}),n}function oS(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",l=!1,u=e.length,h=u-n-1,f=[],d=[];for(d.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!mr(d);){let p=d.pop();if(p===s){l&&ma(d).idx<=h&&d.pop();continue}let m=p.def,g=p.idx,y=p.ruleStack,v=p.occurrenceStack;if(mr(m))continue;let x=m[0];if(x===i){let b={idx:g,def:yi(m),ruleStack:Bu(y),occurrenceStack:Bu(v)};d.push(b)}else if(x instanceof Ar)if(g=0;b--){let T=x.definition[b],S={idx:g,def:T.definition.concat(yi(m)),ruleStack:y,occurrenceStack:v};d.push(S),d.push(s)}else if(x instanceof Pn)d.push({idx:g,def:x.definition.concat(yi(m)),ruleStack:y,occurrenceStack:v});else if(x instanceof fs)d.push(MYe(x,g,y,v));else throw Error("non exhaustive match")}return f}function MYe(t,e,r,n){let i=ln(r);i.push(t.name);let a=ln(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var eP,nS,T1,iS,ib,aS,ab,sb=N(()=>{"use strict";Yt();GO();jE();ps();eP=class extends Yu{static{o(this,"AbstractNextPossibleTokensWalker")}constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=ln(this.path.ruleStack).reverse(),this.occurrenceStack=ln(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){mr(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},nS=class extends eP{static{o(this,"NextAfterTokenWalker")}constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new Pn({definition:i});this.possibleTokTypes=zp(a),this.found=!0}}},T1=class extends Yu{static{o(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},iS=class extends T1{static{o(this,"NextTerminalAfterManyWalker")}walkMany(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},ib=class extends T1{static{o(this,"NextTerminalAfterManySepWalker")}walkManySep(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},aS=class extends T1{static{o(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},ab=class extends T1{static{o(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=ea(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Ar&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};o(sS,"possiblePathsFrom");o(oS,"nextPossibleTokensAfter");o(MYe,"expandTopLevelRule")});function ob(t){if(t instanceof dn||t==="Option")return Jn.OPTION;if(t instanceof zr||t==="Repetition")return Jn.REPETITION;if(t instanceof Bn||t==="RepetitionMandatory")return Jn.REPETITION_MANDATORY;if(t instanceof Fn||t==="RepetitionMandatoryWithSeparator")return Jn.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof _n||t==="RepetitionWithSeparator")return Jn.REPETITION_WITH_SEPARATOR;if(t instanceof Dn||t==="Alternation")return Jn.ALTERNATION;throw Error("non exhaustive match")}function cS(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=ob(n);return a===Jn.ALTERNATION?w1(e,r,i):k1(e,r,a,i)}function Bde(t,e,r,n,i,a){let s=w1(t,e,r),l=Ude(s)?v1:Xu;return a(s,n,l,i)}function Fde(t,e,r,n,i,a){let s=k1(t,e,i,r),l=Ude(s)?v1:Xu;return a(s[0],l,n)}function $de(t,e,r,n){let i=t.length,a=Pa(t,s=>Pa(s,l=>l.length===1));if(e)return function(s){let l=rt(s,u=>u.GATE);for(let u=0;uQr(u)),l=Jr(s,(u,h,f)=>(Ae(h,d=>{Ft(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),Ae(d.categoryMatches,p=>{Ft(u,p)||(u[p]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=Qr(t);if(a.length===1&&mr(a[0].categoryMatches)){let l=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let s=Jr(a,(l,u,h)=>(l[u.tokenTypeIdx]=!0,Ae(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return s[l.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;asS([s],1)),n=Pde(r.length),i=rt(r,s=>{let l={};return Ae(s,u=>{let h=tP(u.partialPath);Ae(h,f=>{l[f]=!0})}),l}),a=r;for(let s=1;s<=e;s++){let l=a;a=Pde(l.length);for(let u=0;u{let x=tP(v.partialPath);Ae(x,b=>{i[u][b]=!0})})}}}}return n}function w1(t,e,r,n){let i=new lS(t,Jn.ALTERNATION,n);return e.accept(i),Gde(i.result,r)}function k1(t,e,r,n){let i=new lS(t,r);e.accept(i);let a=i.result,l=new rP(e,t,r).startWalking(),u=new Pn({definition:a}),h=new Pn({definition:l});return Gde([u,h],n)}function uS(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Ude(t){return Pa(t,e=>Pa(e,r=>Pa(r,n=>mr(n.categoryMatches))))}var Jn,rP,lS,E1=N(()=>{"use strict";Yt();sb();jE();Vp();ps();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(Jn||(Jn={}));o(ob,"getProdType");o(cS,"getLookaheadPaths");o(Bde,"buildLookaheadFuncForOr");o(Fde,"buildLookaheadFuncForOptionalProd");o($de,"buildAlternativesLookAheadFunc");o(zde,"buildSingleAlternativeLookaheadFunction");rP=class extends Yu{static{o(this,"RestDefinitionFinderWalker")}constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,Jn.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,Jn.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,Jn.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,Jn.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,Jn.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},lS=class extends ds{static{o(this,"InsideDefinitionFinderVisitor")}constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,Jn.OPTION)}visitRepetition(e){this.checkIsTarget(e,Jn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,Jn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,Jn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,Jn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,Jn.ALTERNATION)}};o(Pde,"initializeArrayOfArrays");o(tP,"pathToHashKeys");o(IYe,"isUniquePrefixHash");o(Gde,"lookAheadSequenceFromAlternatives");o(w1,"getLookaheadPathsForOr");o(k1,"getLookaheadPathsForOptionalProd");o(uS,"containsPath");o(Vde,"isStrictPrefixOfPath");o(Ude,"areTokenCategoriesNotUsed")});function Hde(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return rt(e,r=>Object.assign({type:Gi.CUSTOM_LOOKAHEAD_VALIDATION},r))}function qde(t,e,r,n){let i=ga(t,u=>OYe(u,r)),a=GYe(t,e,r),s=ga(t,u=>FYe(u,r)),l=ga(t,u=>BYe(u,t,n,r));return i.concat(a,s,l)}function OYe(t,e){let r=new nP;t.accept(r);let n=r.allProductions,i=DR(n,PYe),a=Vs(i,l=>l.length>1);return rt(kr(a),l=>{let u=ea(l),h=e.buildDuplicateFoundError(t,l),f=Xs(u),d={message:h,type:Gi.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:f,occurrence:u.idx},p=Wde(u);return p&&(d.parameter=p),d})}function PYe(t){return`${Xs(t)}_#_${t.idx}_#_${Wde(t)}`}function Wde(t){return t instanceof Ar?t.terminalType.name:t instanceof fn?t.nonTerminalName:""}function BYe(t,e,r,n){let i=[];if(Jr(e,(s,l)=>l.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:Gi.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Yde(t,e,r){let n=[],i;return jn(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:Gi.INVALID_RULE_OVERRIDE,ruleName:t})),n}function aP(t,e,r,n=[]){let i=[],a=hS(e.definition);if(mr(a))return[];{let s=t.name;jn(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:Gi.LEFT_RECURSION,ruleName:s});let u=lf(a,n.concat([t])),h=ga(u,f=>{let d=ln(n);return d.push(f),aP(t,f,r,d)});return i.concat(h)}}function hS(t){let e=[];if(mr(t))return e;let r=ea(t);if(r instanceof fn)e.push(r.referencedRule);else if(r instanceof Pn||r instanceof dn||r instanceof Bn||r instanceof Fn||r instanceof _n||r instanceof zr)e=e.concat(hS(r.definition));else if(r instanceof Dn)e=Qr(rt(r.definition,a=>hS(a.definition)));else if(!(r instanceof Ar))throw Error("non exhaustive match");let n=$p(r),i=t.length>1;if(n&&i){let a=yi(t);return e.concat(hS(a))}else return e}function Xde(t,e){let r=new lb;t.accept(r);let n=r.alternations;return ga(n,a=>{let s=Bu(a.definition);return ga(s,(l,u)=>{let h=oS([l],[],Xu,1);return mr(h)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:u}),type:Gi.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:u+1}]:[]})})}function jde(t,e,r){let n=new lb;t.accept(n);let i=n.alternations;return i=cf(i,s=>s.ignoreAmbiguities===!0),ga(i,s=>{let l=s.idx,u=s.maxLookahead||e,h=w1(l,t,u,s),f=$Ye(h,s,t,r),d=zYe(h,s,t,r);return f.concat(d)})}function FYe(t,e){let r=new lb;t.accept(r);let n=r.alternations;return ga(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:Gi.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function Kde(t,e,r){let n=[];return Ae(t,i=>{let a=new iP;i.accept(a);let s=a.allProductions;Ae(s,l=>{let u=ob(l),h=l.maxLookahead||e,f=l.idx,p=k1(f,i,u,h)[0];if(mr(Qr(p))){let m=r.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:m,type:Gi.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function $Ye(t,e,r,n){let i=[],a=Jr(t,(l,u,h)=>(e.definition[h].ignoreAmbiguities===!0||Ae(u,f=>{let d=[h];Ae(t,(p,m)=>{h!==m&&uS(p,f)&&e.definition[m].ignoreAmbiguities!==!0&&d.push(m)}),d.length>1&&!uS(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return rt(a,l=>{let u=rt(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:Gi.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:l.alts}})}function zYe(t,e,r,n){let i=Jr(t,(s,l,u)=>{let h=rt(l,f=>({idx:u,path:f}));return s.concat(h)},[]);return _c(ga(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let u=s.idx,h=s.path,f=Zr(i,p=>e.definition[p.idx].ignoreAmbiguities!==!0&&p.idx{let m=[p.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:m,prefixPath:p.path}),type:Gi.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:m}})}))}function GYe(t,e,r){let n=[],i=rt(e,a=>a.name);return Ae(t,a=>{let s=a.name;if(jn(i,s)){let l=r.buildNamespaceConflictError(a);n.push({message:l,type:Gi.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var nP,lb,iP,cb=N(()=>{"use strict";Yt();js();ps();E1();sb();Vp();o(Hde,"validateLookahead");o(qde,"validateGrammar");o(OYe,"validateDuplicateProductions");o(PYe,"identifyProductionForDuplicates");o(Wde,"getExtraProductionArgument");nP=class extends ds{static{o(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};o(BYe,"validateRuleDoesNotAlreadyExist");o(Yde,"validateRuleIsOverridden");o(aP,"validateNoLeftRecursion");o(hS,"getFirstNoneTerminal");lb=class extends ds{static{o(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};o(Xde,"validateEmptyOrAlternative");o(jde,"validateAmbiguousAlternationAlternatives");iP=class extends ds{static{o(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};o(FYe,"validateTooManyAlts");o(Kde,"validateSomeNonEmptyLookaheadPath");o($Ye,"checkAlternativesAmbiguities");o(zYe,"checkPrefixAlternativesAmbiguities");o(GYe,"checkTerminalAndNoneTerminalsNameSpace")});function Qde(t){let e=of(t,{errMsgProvider:Mde}),r={};return Ae(t.rules,n=>{r[n.name]=n}),Ide(r,e.errMsgProvider)}function Zde(t){return t=of(t,{errMsgProvider:Gl}),qde(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var Jde=N(()=>{"use strict";Yt();Ode();cb();b1();o(Qde,"resolveGrammar");o(Zde,"validateGrammar")});function Bf(t){return jn(ipe,t.name)}var epe,tpe,rpe,npe,ipe,S1,Hp,ub,hb,fb,C1=N(()=>{"use strict";Yt();epe="MismatchedTokenException",tpe="NoViableAltException",rpe="EarlyExitException",npe="NotAllInputParsedException",ipe=[epe,tpe,rpe,npe];Object.freeze(ipe);o(Bf,"isRecognitionException");S1=class extends Error{static{o(this,"RecognitionException")}constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Hp=class extends S1{static{o(this,"MismatchedTokenException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=epe}},ub=class extends S1{static{o(this,"NoViableAltException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=tpe}},hb=class extends S1{static{o(this,"NotAllInputParsedException")}constructor(e,r){super(e,r),this.name=npe}},fb=class extends S1{static{o(this,"EarlyExitException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=rpe}}});function VYe(t,e,r,n,i,a,s){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let p=this.getCurrRuleFullName(),m=this.getGAstProductions()[p];u=new a(m,i).startWalking(),this.firstAfterRepMap[l]=u}let h=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=yo,f=1),!(h===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(h,f,s)&&this.tryInRepetitionRecovery(t,e,r,h)}var sP,lP,oP,fS,cP=N(()=>{"use strict";Up();Yt();C1();VO();js();sP={},lP="InRuleRecoveryException",oP=class extends Error{static{o(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=lP}},fS=class{static{o(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=Ft(e,"recoveryEnabled")?e.recoveryEnabled:ms.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=VYe)}getTokenToInsert(e){let r=Qu(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),l=[],u=!1,h=this.LA(1),f=this.LA(1),d=o(()=>{let p=this.LA(0),m=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:h,previous:p,ruleName:this.getCurrRuleFullName()}),g=new Hp(m,h,this.LA(0));g.resyncedTokens=Bu(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,r);return}else this.tokenMatcher(f,a)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new oP("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||mr(r))return!1;let n=this.LA(1);return os(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return jn(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=os(e,a=>nb(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return sP;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return rt(e,(n,i)=>i===0?sP:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=rt(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return Qr(e)}getFollowSetFromFollowKey(e){if(e===sP)return[yo];let r=e.ruleName+e.idxInCallingRule+KE+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,yo)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return Bu(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,l){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=ln(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return rt(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};o(VYe,"attemptInRepetitionRecovery")});function dS(t,e,r){return r|e|t}var pS=N(()=>{"use strict";o(dS,"getKeyForAutomaticLookahead")});var Ju,uP=N(()=>{"use strict";Yt();b1();js();cb();E1();Ju=class{static{o(this,"LLkLookaheadStrategy")}constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:ms.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(mr(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return ga(e,r=>aP(r,r,Gl))}validateEmptyOrAlternatives(e){return ga(e,r=>Xde(r,Gl))}validateAmbiguousAlternationAlternatives(e,r){return ga(e,n=>jde(n,r,Gl))}validateSomeNonEmptyLookaheadPath(e,r){return Kde(e,r,Gl)}buildLookaheadForAlternation(e){return Bde(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,$de)}buildLookaheadForOptional(e){return Fde(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,ob(e.prodType),zde)}}});function UYe(t){mS.reset(),t.accept(mS);let e=mS.dslMethods;return mS.reset(),e}var gS,hP,mS,ape=N(()=>{"use strict";Yt();js();pS();ps();uP();gS=class{static{o(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=Ft(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:ms.dynamicTokensEnabled,this.maxLookahead=Ft(e,"maxLookahead")?e.maxLookahead:ms.maxLookahead,this.lookaheadStrategy=Ft(e,"lookaheadStrategy")?e.lookaheadStrategy:new Ju({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Ae(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=UYe(r);Ae(n,h=>{let f=h.idx===0?"":h.idx;this.TRACE_INIT(`${Xs(h)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:h.idx,rule:r,maxLookahead:h.maxLookahead||this.maxLookahead,hasPredicates:h.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),p=dS(this.fullRuleNameToShort[r.name],256,h.idx);this.setLaFuncCache(p,d)})}),Ae(i,h=>{this.computeLookaheadFunc(r,h.idx,768,"Repetition",h.maxLookahead,Xs(h))}),Ae(a,h=>{this.computeLookaheadFunc(r,h.idx,512,"Option",h.maxLookahead,Xs(h))}),Ae(s,h=>{this.computeLookaheadFunc(r,h.idx,1024,"RepetitionMandatory",h.maxLookahead,Xs(h))}),Ae(l,h=>{this.computeLookaheadFunc(r,h.idx,1536,"RepetitionMandatoryWithSeparator",h.maxLookahead,Xs(h))}),Ae(u,h=>{this.computeLookaheadFunc(r,h.idx,1280,"RepetitionWithSeparator",h.maxLookahead,Xs(h))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=dS(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return dS(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},hP=class extends ds{static{o(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},mS=new hP;o(UYe,"collectMethods")});function pP(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";o(pP,"setNodeLocationOnlyOffset");o(mP,"setNodeLocationFull");o(spe,"addTerminalToCst");o(ope,"addNoneTerminalToCst")});function gP(t,e){Object.defineProperty(t,HYe,{enumerable:!1,configurable:!0,writable:!1,value:e})}var HYe,cpe=N(()=>{"use strict";HYe="name";o(gP,"defineNameProp")});function qYe(t,e){let r=qr(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: + ${a.join(` + +`).replace(/\n/g,` + `)}`)}},"validateVisitor")};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function hpe(t,e,r){let n=o(function(){},"derivedConstructor");gP(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Ae(e,a=>{i[a]=qYe}),n.prototype=i,n.prototype.constructor=n,n}function WYe(t,e){return YYe(t,e)}function YYe(t,e){let r=Zr(e,i=>Si(t[i])===!1),n=rt(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:yP.MISSING_METHOD,methodName:i}));return _c(n)}var yP,fpe=N(()=>{"use strict";Yt();cpe();o(qYe,"defaultVisit");o(upe,"createBaseSemanticVisitorConstructor");o(hpe,"createBaseVisitorConstructorWithDefaults");(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(yP||(yP={}));o(WYe,"validateVisitor");o(YYe,"validateMissingCstMethods")});var bS,dpe=N(()=>{"use strict";lpe();Yt();fpe();js();bS=class{static{o(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=Ft(e,"nodeLocationTracking")?e.nodeLocationTracking:ms.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=si,this.cstFinallyStateUpdate=si,this.cstPostTerminal=si,this.cstPostNonTerminal=si,this.cstPostRule=si;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=mP,this.setNodeLocationFromNode=mP,this.cstPostRule=si,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=si,this.setNodeLocationFromNode=si,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=pP,this.setNodeLocationFromNode=pP,this.cstPostRule=si,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=si,this.setNodeLocationFromNode=si,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=si,this.setNodeLocationFromNode=si,this.cstPostRule=si,this.setInitialNodeLocation=si;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];spe(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];ope(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(xr(this.baseCstVisitorConstructor)){let e=upe(this.className,qr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(xr(this.baseCstVisitorWithDefaultsConstructor)){let e=hpe(this.className,qr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var TS,ppe=N(()=>{"use strict";js();TS=class{static{o(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):A1}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?A1:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var wS,mpe=N(()=>{"use strict";Yt();C1();js();b1();cb();ps();wS=class{static{o(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=_1){if(jn(this.definedRulesNames,e)){let s={message:Gl.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Gi.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=_1){let i=Yde(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(Bf(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return YE(kr(this.gastProductionsCache))}}});var kS,gpe=N(()=>{"use strict";Yt();pS();C1();E1();sb();js();cP();Up();Vp();kS=class{static{o(this,"RecognizerEngine")}initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=v1,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},Ft(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if(Bt(e)){if(mr(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if(Bt(e))this.tokensMap=Jr(e,(a,s)=>(a[s.name]=s,a),{});else if(Ft(e,"modes")&&Pa(Qr(kr(e.modes)),Ede)){let a=Qr(kr(e.modes)),s=qm(a);this.tokensMap=Jr(s,(l,u)=>(l[u.name]=u,l),{})}else if(Sn(e))this.tokensMap=ln(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=yo;let n=Ft(e,"modes")?Qr(kr(e.modes)):kr(e),i=Pa(n,a=>mr(a.categoryMatches));this.tokenMatcher=i?v1:Xu,ju(kr(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=Ft(n,"resyncEnabled")?n.resyncEnabled:_1.resyncEnabled,a=Ft(n,"recoveryValueFunc")?n.recoveryValueFunc:_1.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let l;return this.outputCst===!0?l=o(function(...f){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=o(function(...f){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(Bf(e)){let s=e;if(a){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(s.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,s.partialCstResult=u}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,Jn.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,aS)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,ab],l,1536,e,ab)}else throw this.raiseEarlyExitException(e,Jn.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let l=r.GATE;if(l!==void 0){let u=i;i=o(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,iS,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,ib],l,1280,e,ib)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Bt(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new hb(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw Bf(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Hp(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===lP?n:a}}else throw n}saveRecogState(){let e=this.errors,r=ln(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),yo)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var ES,ype=N(()=>{"use strict";C1();Yt();E1();js();ES=class{static{o(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=Ft(e,"errorMessageProvider")?e.errorMessageProvider:ms.errorMessageProvider}SAVE_ERROR(e){if(Bf(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:ln(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return ln(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],l=k1(e,a,r,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let h=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new fb(h,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=w1(e,i,this.maxLookahead),s=[];for(let h=1;h<=this.maxLookahead;h++)s.push(this.LA(h));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new ub(u,this.LA(1),l))}}});var SS,vpe=N(()=>{"use strict";sb();Yt();SS=class{static{o(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(xr(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return oS([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=ea(e.ruleStack),i=this.getGAstProductions()[r];return new nS(i,e).startWalking()}}});function pb(t,e,r,n=!1){AS(r);let i=ma(this.recordingProdStack),a=Si(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),Ft(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),_S}function KYe(t,e){AS(e);let r=ma(this.recordingProdStack),n=Bt(t)===!1,i=n===!1?t:t.DEF,a=new Dn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});Ft(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=z2(i,l=>Si(l.GATE));return a.hasPredicates=s,r.definition.push(a),Ae(i,l=>{let u=new Pn({definition:[]});a.definition.push(u),Ft(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:Ft(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),_S}function Tpe(t){return t===0?"":`${t}`}function AS(t){if(t<0||t>bpe){let e=new Error(`Invalid DSL Method idx value: <${t}> + Idx value must be a none negative value smaller than ${bpe+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var _S,xpe,bpe,wpe,kpe,jYe,CS,Epe=N(()=>{"use strict";Yt();ps();tb();Vp();Up();js();pS();_S={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(_S);xpe=!0,bpe=Math.pow(2,8)-1,wpe=Pf({name:"RECORDING_PHASE_TOKEN",pattern:Zn.NA});ju([wpe]);kpe=Qu(wpe,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(kpe);jYe={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},CS=class{static{o(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return A1}topLevelRuleRecord(e,r){try{let n=new fs({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return pb.call(this,dn,e,r)}atLeastOneInternalRecord(e,r){pb.call(this,Bn,r,e)}atLeastOneSepFirstInternalRecord(e,r){pb.call(this,Fn,r,e,xpe)}manyInternalRecord(e,r){pb.call(this,zr,r,e)}manySepFirstInternalRecord(e,r){pb.call(this,_n,r,e,xpe)}orInternalRecord(e,r){return KYe.call(this,e,r)}subruleInternalRecord(e,r,n){if(AS(r),!e||Ft(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=ma(this.recordingProdStack),a=e.ruleName,s=new fn({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?jYe:_S}consumeInternalRecord(e,r,n){if(AS(r),!KO(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=ma(this.recordingProdStack),a=new Ar({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),kpe}};o(pb,"recordProd");o(KYe,"recordOrProd");o(Tpe,"getIdxSuffix");o(AS,"assertMethodIdxIsValid")});var DS,Spe=N(()=>{"use strict";Yt();d1();js();DS=class{static{o(this,"PerformanceTracer")}initPerformanceTracer(e){if(Ft(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ms.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=Zx(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function Cpe(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var Ape=N(()=>{"use strict";o(Cpe,"applyMixins")});function LS(t=void 0){return function(){return t}}var A1,ms,_1,Gi,mb,gb,js=N(()=>{"use strict";Yt();d1();nde();Up();b1();Jde();cP();ape();dpe();ppe();mpe();gpe();ype();vpe();Epe();Spe();Ape();cb();A1=Qu(yo,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(A1);ms=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Zu,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),_1=Object.freeze({recoveryValueFunc:o(()=>{},"recoveryValueFunc"),resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(Gi||(Gi={}));o(LS,"EMPTY_ALT");mb=class t{static{o(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{Jx(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Ae(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=Qde({rules:kr(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(mr(n)&&this.skipValidations===!1){let i=Zde({rules:kr(this.gastProductionsCache),tokenTypes:kr(this.tokensMap),errMsgProvider:Gl,grammarName:r}),a=Hde({lookaheadStrategy:this.lookaheadStrategy,rules:kr(this.gastProductionsCache),tokenTypes:kr(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),mr(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=rde(kr(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:kr(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(kr(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!mr(this.definitionErrors))throw e=rt(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: + ${e.join(` +------------------------------- +`)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),Ft(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=Ft(r,"skipValidations")?r.skipValidations:ms.skipValidations}};mb.DEFER_DEFINITION_ERRORS_HANDLING=!1;Cpe(mb,[fS,gS,bS,TS,kS,wS,ES,SS,CS,DS]);gb=class extends mb{static{o(this,"EmbeddedActionsParser")}constructor(e,r=ms){let n=ln(r);n.outputCst=!1,super(e,n)}}});var _pe=N(()=>{"use strict";ps()});var Dpe=N(()=>{"use strict"});var Lpe=N(()=>{"use strict";_pe();Dpe()});var Rpe=N(()=>{"use strict";FO()});var Ff=N(()=>{"use strict";FO();js();tb();Up();E1();uP();b1();C1();QO();ps();ps();Lpe();Rpe()});function qp(t,e,r){return`${t.name}_${e}_${r}`}function Ope(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};nXe(e,t);let r=t.length;for(let n=0;nPpe(t,e,s));return N1(t,e,n,r,...i)}function cXe(t,e,r){let n=ia(t,e,r,{type:$f});zf(t,n);let i=N1(t,e,n,r,Wp(t,e,r));return uXe(t,e,r,i)}function Wp(t,e,r){let n=Zr(rt(r.definition,i=>Ppe(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:fXe(t,n)}function Bpe(t,e,r,n,i){let a=n.left,s=n.right,l=ia(t,e,r,{type:rXe});zf(t,l);let u=ia(t,e,r,{type:Ipe});return a.loopback=l,u.loopback=l,t.decisionMap[qp(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=l,Di(s,l),i===void 0?(Di(l,a),Di(l,u)):(Di(l,u),Di(l,i.left),Di(i.right,a)),{left:a,right:u}}function Fpe(t,e,r,n,i){let a=n.left,s=n.right,l=ia(t,e,r,{type:tXe});zf(t,l);let u=ia(t,e,r,{type:Ipe}),h=ia(t,e,r,{type:eXe});return l.loopback=h,u.loopback=h,Di(l,a),Di(l,u),Di(s,h),i!==void 0?(Di(h,u),Di(h,i.left),Di(i.right,a)):Di(h,l),t.decisionMap[qp(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=l,{left:l,right:u}}function uXe(t,e,r,n){let i=n.left,a=n.right;return Di(i,a),t.decisionMap[qp(e,"Option",r.idx)]=i,n}function zf(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function N1(t,e,r,n,...i){let a=ia(t,e,n,{type:JYe,start:r});r.end=a;for(let l of i)l!==void 0?(Di(r,l.left),Di(l.right,a)):Di(r,a);let s={left:r,right:a};return t.decisionMap[qp(e,hXe(n),n.idx)]=r,s}function hXe(t){if(t instanceof Dn)return"Alternation";if(t instanceof dn)return"Option";if(t instanceof zr)return"Repetition";if(t instanceof _n)return"RepetitionWithSeparator";if(t instanceof Bn)return"RepetitionMandatory";if(t instanceof Fn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function fXe(t,e){let r=e.length;for(let a=0;a{"use strict";Vm();ER();Ff();o(qp,"buildATNKey");$f=1,ZYe=2,Npe=4,Mpe=5,R1=7,JYe=8,eXe=9,tXe=10,rXe=11,Ipe=12,yb=class{static{o(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},D1=class extends yb{static{o(this,"AtomTransition")}constructor(e,r){super(e),this.tokenType=r}},vb=class extends yb{static{o(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},L1=class extends yb{static{o(this,"RuleTransition")}constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};o(Ope,"createATN");o(nXe,"createRuleStartAndStopATNStates");o(Ppe,"atom");o(iXe,"repetition");o(aXe,"repetitionSep");o(sXe,"repetitionMandatory");o(oXe,"repetitionMandatorySep");o(lXe,"alternation");o(cXe,"option");o(Wp,"block");o(Bpe,"plus");o(Fpe,"star");o(uXe,"optional");o(zf,"defineDecisionState");o(N1,"makeAlts");o(hXe,"getProdType");o(fXe,"makeBlock");o(xP,"tokenRef");o(dXe,"ruleRef");o(pXe,"buildRuleHandle");o(Di,"epsilon");o(ia,"newState");o(bP,"addTransition");o(mXe,"removeState")});function TP(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var xb,M1,zpe=N(()=>{"use strict";Vm();xb={},M1=class{static{o(this,"ATNConfigSet")}constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=TP(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return rt(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};o(TP,"getATNConfigKey")});function gXe(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function Vpe(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let l of s)if(r.has(l)){if(!i.has(l))return!1}else r.add(l),i.add(l)}}return!0}function yXe(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nKu(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${wXe(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n}function wXe(t){if(t instanceof fn)return"SUBRULE";if(t instanceof dn)return"OPTION";if(t instanceof Dn)return"OR";if(t instanceof Bn)return"AT_LEAST_ONE";if(t instanceof Fn)return"AT_LEAST_ONE_SEP";if(t instanceof _n)return"MANY_SEP";if(t instanceof zr)return"MANY";if(t instanceof Ar)return"CONSUME";throw Error("non exhaustive match")}function kXe(t,e,r){let n=ga(e.configs.elements,a=>a.state.transitions),i=Uae(n.filter(a=>a instanceof D1).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function EXe(t,e){return t.edges[e.tokenTypeIdx]}function SXe(t,e,r){let n=new M1,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===R1){i.push(s);continue}let l=s.state.transitions.length;for(let u=0;u0&&!LXe(a))for(let s of i)a.add(s);return a}function CXe(t,e){if(t instanceof D1&&nb(e,t.tokenType))return t.target}function AXe(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Hpe(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function Upe(t,e,r,n){return n=qpe(t,n),e.edges[r.tokenTypeIdx]=n,n}function qpe(t,e){if(e===xb)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function _Xe(t){let e=new M1,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};NS(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function OXe(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var RS,Gpe,bb,Wpe=N(()=>{"use strict";Ff();$pe();zpe();NR();CR();Hae();Vm();Lw();ak();uk();PR();o(gXe,"createDFACache");RS=class{static{o(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n))}initialize(e){this.atn=Ope(e.rules),this.dfas=yXe(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,l=this.logging,u=qp(n,"Alternation",r),f=this.atn.decisionMap[u].decision,d=rt(cS({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),p=>rt(p,m=>m[0]));if(Vpe(d,!1)&&!a){let p=Jr(d,(m,g,y)=>(Ae(g,v=>{v&&(m[v.tokenTypeIdx]=y,Ae(v.categoryMatches,x=>{m[x]=y}))}),m),{});return i?function(m){var g;let y=this.LA(1),v=p[y.tokenTypeIdx];if(m!==void 0&&v!==void 0){let x=(g=m[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let m=this.LA(1);return p[m.tokenTypeIdx]}}else return i?function(p){let m=new RS,g=p===void 0?0:p.length;for(let v=0;vrt(p,m=>m[0]));if(Vpe(d)&&d[0][0]&&!a){let p=d[0],m=Qr(p);if(m.length===1&&mr(m[0].categoryMatches)){let y=m[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=Jr(m,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,Ae(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let p=wP.call(this,s,f,Gpe,l);return typeof p=="object"?!1:p===0}}};o(Vpe,"isLL1Sequence");o(yXe,"initATNSimulator");o(wP,"adaptivePredict");o(vXe,"performLookahead");o(xXe,"computeLookaheadTarget");o(bXe,"reportLookaheadAmbiguity");o(TXe,"buildAmbiguityError");o(wXe,"getProductionDslName");o(kXe,"buildAdaptivePredictError");o(EXe,"getExistingTargetState");o(SXe,"computeReachSet");o(CXe,"getReachableTarget");o(AXe,"getUniqueAlt");o(Hpe,"newDFAState");o(Upe,"addDFAEdge");o(qpe,"addDFAState");o(_Xe,"computeStartState");o(NS,"closure");o(DXe,"getEpsilonTarget");o(LXe,"hasConfigInRuleStopState");o(RXe,"allConfigsInRuleStopStates");o(NXe,"hasConflictTerminatingPrediction");o(MXe,"getConflictingAltSets");o(IXe,"hasConflictingAltSet");o(OXe,"hasStateAssociatedWithOneAlt")});var Ype=N(()=>{"use strict";Wpe()});var Xpe,kP,jpe,MS,tn,Gr,IS,Kpe,EP,Qpe,Zpe,Jpe,e0e,SP,t0e,r0e,n0e,OS,I1,O1,CP,P1,i0e,AP,_P,DP,LP,RP,a0e,s0e,NP,o0e,MP,Tb,l0e,c0e,u0e,h0e,f0e,d0e,p0e,m0e,PS,g0e,y0e,v0e,x0e,b0e,T0e,w0e,k0e,E0e,S0e,C0e,BS,A0e,_0e,D0e,L0e,R0e,N0e,M0e,I0e,O0e,P0e,B0e,F0e,$0e,IP,OP,z0e,G0e,V0e,U0e,H0e,q0e,W0e,Y0e,X0e,PP,Ge,BP=N(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(Xpe||(Xpe={}));(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(kP||(kP={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(jpe||(jpe={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(MS||(MS={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=MS.MAX_VALUE),i===Number.MAX_VALUE&&(i=MS.MAX_VALUE),{line:n,character:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.uinteger(i.line)&&Ge.uinteger(i.character)}o(r,"is"),t.is=r})(tn||(tn={}));(function(t){function e(n,i,a,s){if(Ge.uinteger(n)&&Ge.uinteger(i)&&Ge.uinteger(a)&&Ge.uinteger(s))return{start:tn.create(n,i),end:tn.create(a,s)};if(tn.is(n)&&tn.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&tn.is(i.start)&&tn.is(i.end)}o(r,"is"),t.is=r})(Gr||(Gr={}));(function(t){function e(n,i){return{uri:n,range:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.range)&&(Ge.string(i.uri)||Ge.undefined(i.uri))}o(r,"is"),t.is=r})(IS||(IS={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.targetRange)&&Ge.string(i.targetUri)&&Gr.is(i.targetSelectionRange)&&(Gr.is(i.originSelectionRange)||Ge.undefined(i.originSelectionRange))}o(r,"is"),t.is=r})(Kpe||(Kpe={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.numberRange(i.red,0,1)&&Ge.numberRange(i.green,0,1)&&Ge.numberRange(i.blue,0,1)&&Ge.numberRange(i.alpha,0,1)}o(r,"is"),t.is=r})(EP||(EP={}));(function(t){function e(n,i){return{range:n,color:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.range)&&EP.is(i.color)}o(r,"is"),t.is=r})(Qpe||(Qpe={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.string(i.label)&&(Ge.undefined(i.textEdit)||O1.is(i))&&(Ge.undefined(i.additionalTextEdits)||Ge.typedArray(i.additionalTextEdits,O1.is))}o(r,"is"),t.is=r})(Zpe||(Zpe={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(Jpe||(Jpe={}));(function(t){function e(n,i,a,s,l,u){let h={startLine:n,endLine:i};return Ge.defined(a)&&(h.startCharacter=a),Ge.defined(s)&&(h.endCharacter=s),Ge.defined(l)&&(h.kind=l),Ge.defined(u)&&(h.collapsedText=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.uinteger(i.startLine)&&Ge.uinteger(i.startLine)&&(Ge.undefined(i.startCharacter)||Ge.uinteger(i.startCharacter))&&(Ge.undefined(i.endCharacter)||Ge.uinteger(i.endCharacter))&&(Ge.undefined(i.kind)||Ge.string(i.kind))}o(r,"is"),t.is=r})(e0e||(e0e={}));(function(t){function e(n,i){return{location:n,message:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&IS.is(i.location)&&Ge.string(i.message)}o(r,"is"),t.is=r})(SP||(SP={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(t0e||(t0e={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(r0e||(r0e={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(n)&&Ge.string(n.href)}o(e,"is"),t.is=e})(n0e||(n0e={}));(function(t){function e(n,i,a,s,l,u){let h={range:n,message:i};return Ge.defined(a)&&(h.severity=a),Ge.defined(s)&&(h.code=s),Ge.defined(l)&&(h.source=l),Ge.defined(u)&&(h.relatedInformation=u),h}o(e,"create"),t.create=e;function r(n){var i;let a=n;return Ge.defined(a)&&Gr.is(a.range)&&Ge.string(a.message)&&(Ge.number(a.severity)||Ge.undefined(a.severity))&&(Ge.integer(a.code)||Ge.string(a.code)||Ge.undefined(a.code))&&(Ge.undefined(a.codeDescription)||Ge.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&(Ge.string(a.source)||Ge.undefined(a.source))&&(Ge.undefined(a.relatedInformation)||Ge.typedArray(a.relatedInformation,SP.is))}o(r,"is"),t.is=r})(OS||(OS={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return Ge.defined(a)&&a.length>0&&(s.arguments=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.title)&&Ge.string(i.command)}o(r,"is"),t.is=r})(I1||(I1={}));(function(t){function e(a,s){return{range:a,newText:s}}o(e,"replace"),t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}o(r,"insert"),t.insert=r;function n(a){return{range:a,newText:""}}o(n,"del"),t.del=n;function i(a){let s=a;return Ge.objectLiteral(s)&&Ge.string(s.newText)&&Gr.is(s.range)}o(i,"is"),t.is=i})(O1||(O1={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Ge.string(i.label)&&(Ge.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(Ge.string(i.description)||i.description===void 0)}o(r,"is"),t.is=r})(CP||(CP={}));(function(t){function e(r){let n=r;return Ge.string(n)}o(e,"is"),t.is=e})(P1||(P1={}));(function(t){function e(a,s,l){return{range:a,newText:s,annotationId:l}}o(e,"replace"),t.replace=e;function r(a,s,l){return{range:{start:a,end:a},newText:s,annotationId:l}}o(r,"insert"),t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}o(n,"del"),t.del=n;function i(a){let s=a;return O1.is(s)&&(CP.is(s.annotationId)||P1.is(s.annotationId))}o(i,"is"),t.is=i})(i0e||(i0e={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&NP.is(i.textDocument)&&Array.isArray(i.edits)}o(r,"is"),t.is=r})(AP||(AP={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&Ge.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||Ge.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Ge.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||P1.is(i.annotationId))}o(r,"is"),t.is=r})(_P||(_P={}));(function(t){function e(n,i,a,s){let l={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),s!==void 0&&(l.annotationId=s),l}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&Ge.string(i.oldUri)&&Ge.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||Ge.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Ge.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||P1.is(i.annotationId))}o(r,"is"),t.is=r})(DP||(DP={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&Ge.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||Ge.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||Ge.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||P1.is(i.annotationId))}o(r,"is"),t.is=r})(LP||(LP={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>Ge.string(i.kind)?_P.is(i)||DP.is(i)||LP.is(i):AP.is(i)))}o(e,"is"),t.is=e})(RP||(RP={}));(function(t){function e(n){return{uri:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)}o(r,"is"),t.is=r})(a0e||(a0e={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)&&Ge.integer(i.version)}o(r,"is"),t.is=r})(s0e||(s0e={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)&&(i.version===null||Ge.integer(i.version))}o(r,"is"),t.is=r})(NP||(NP={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.string(i.uri)&&Ge.string(i.languageId)&&Ge.integer(i.version)&&Ge.string(i.text)}o(r,"is"),t.is=r})(o0e||(o0e={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}o(e,"is"),t.is=e})(MP||(MP={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(r)&&MP.is(n.kind)&&Ge.string(n.value)}o(e,"is"),t.is=e})(Tb||(Tb={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(l0e||(l0e={}));(function(t){t.PlainText=1,t.Snippet=2})(c0e||(c0e={}));(function(t){t.Deprecated=1})(u0e||(u0e={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ge.string(i.newText)&&Gr.is(i.insert)&&Gr.is(i.replace)}o(r,"is"),t.is=r})(h0e||(h0e={}));(function(t){t.asIs=1,t.adjustIndentation=2})(f0e||(f0e={}));(function(t){function e(r){let n=r;return n&&(Ge.string(n.detail)||n.detail===void 0)&&(Ge.string(n.description)||n.description===void 0)}o(e,"is"),t.is=e})(d0e||(d0e={}));(function(t){function e(r){return{label:r}}o(e,"create"),t.create=e})(p0e||(p0e={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}o(e,"create"),t.create=e})(m0e||(m0e={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}o(e,"fromPlainText"),t.fromPlainText=e;function r(n){let i=n;return Ge.string(i)||Ge.objectLiteral(i)&&Ge.string(i.language)&&Ge.string(i.value)}o(r,"is"),t.is=r})(PS||(PS={}));(function(t){function e(r){let n=r;return!!n&&Ge.objectLiteral(n)&&(Tb.is(n.contents)||PS.is(n.contents)||Ge.typedArray(n.contents,PS.is))&&(r.range===void 0||Gr.is(r.range))}o(e,"is"),t.is=e})(g0e||(g0e={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}o(e,"create"),t.create=e})(y0e||(y0e={}));(function(t){function e(r,n,...i){let a={label:r};return Ge.defined(n)&&(a.documentation=n),Ge.defined(i)?a.parameters=i:a.parameters=[],a}o(e,"create"),t.create=e})(v0e||(v0e={}));(function(t){t.Text=1,t.Read=2,t.Write=3})(x0e||(x0e={}));(function(t){function e(r,n){let i={range:r};return Ge.number(n)&&(i.kind=n),i}o(e,"create"),t.create=e})(b0e||(b0e={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(T0e||(T0e={}));(function(t){t.Deprecated=1})(w0e||(w0e={}));(function(t){function e(r,n,i,a,s){let l={name:r,kind:n,location:{uri:a,range:i}};return s&&(l.containerName=s),l}o(e,"create"),t.create=e})(k0e||(k0e={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}o(e,"create"),t.create=e})(E0e||(E0e={}));(function(t){function e(n,i,a,s,l,u){let h={name:n,detail:i,kind:a,range:s,selectionRange:l};return u!==void 0&&(h.children=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ge.string(i.name)&&Ge.number(i.kind)&&Gr.is(i.range)&&Gr.is(i.selectionRange)&&(i.detail===void 0||Ge.string(i.detail))&&(i.deprecated===void 0||Ge.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}o(r,"is"),t.is=r})(S0e||(S0e={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(C0e||(C0e={}));(function(t){t.Invoked=1,t.Automatic=2})(BS||(BS={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.typedArray(i.diagnostics,OS.is)&&(i.only===void 0||Ge.typedArray(i.only,Ge.string))&&(i.triggerKind===void 0||i.triggerKind===BS.Invoked||i.triggerKind===BS.Automatic)}o(r,"is"),t.is=r})(A0e||(A0e={}));(function(t){function e(n,i,a){let s={title:n},l=!0;return typeof i=="string"?(l=!1,s.kind=i):I1.is(i)?s.command=i:s.edit=i,l&&a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Ge.string(i.title)&&(i.diagnostics===void 0||Ge.typedArray(i.diagnostics,OS.is))&&(i.kind===void 0||Ge.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||I1.is(i.command))&&(i.isPreferred===void 0||Ge.boolean(i.isPreferred))&&(i.edit===void 0||RP.is(i.edit))}o(r,"is"),t.is=r})(_0e||(_0e={}));(function(t){function e(n,i){let a={range:n};return Ge.defined(i)&&(a.data=i),a}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Gr.is(i.range)&&(Ge.undefined(i.command)||I1.is(i.command))}o(r,"is"),t.is=r})(D0e||(D0e={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Ge.uinteger(i.tabSize)&&Ge.boolean(i.insertSpaces)}o(r,"is"),t.is=r})(L0e||(L0e={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Gr.is(i.range)&&(Ge.undefined(i.target)||Ge.string(i.target))}o(r,"is"),t.is=r})(R0e||(R0e={}));(function(t){function e(n,i){return{range:n,parent:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&Gr.is(i.range)&&(i.parent===void 0||t.is(i.parent))}o(r,"is"),t.is=r})(N0e||(N0e={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(M0e||(M0e={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(I0e||(I0e={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}o(e,"is"),t.is=e})(O0e||(O0e={}));(function(t){function e(n,i){return{range:n,text:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Gr.is(i.range)&&Ge.string(i.text)}o(r,"is"),t.is=r})(P0e||(P0e={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Gr.is(i.range)&&Ge.boolean(i.caseSensitiveLookup)&&(Ge.string(i.variableName)||i.variableName===void 0)}o(r,"is"),t.is=r})(B0e||(B0e={}));(function(t){function e(n,i){return{range:n,expression:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Gr.is(i.range)&&(Ge.string(i.expression)||i.expression===void 0)}o(r,"is"),t.is=r})(F0e||(F0e={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.defined(i)&&Gr.is(n.stoppedLocation)}o(r,"is"),t.is=r})($0e||($0e={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(IP||(IP={}));(function(t){function e(n){return{value:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&(i.tooltip===void 0||Ge.string(i.tooltip)||Tb.is(i.tooltip))&&(i.location===void 0||IS.is(i.location))&&(i.command===void 0||I1.is(i.command))}o(r,"is"),t.is=r})(OP||(OP={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Ge.objectLiteral(i)&&tn.is(i.position)&&(Ge.string(i.label)||Ge.typedArray(i.label,OP.is))&&(i.kind===void 0||IP.is(i.kind))&&i.textEdits===void 0||Ge.typedArray(i.textEdits,O1.is)&&(i.tooltip===void 0||Ge.string(i.tooltip)||Tb.is(i.tooltip))&&(i.paddingLeft===void 0||Ge.boolean(i.paddingLeft))&&(i.paddingRight===void 0||Ge.boolean(i.paddingRight))}o(r,"is"),t.is=r})(z0e||(z0e={}));(function(t){function e(r){return{kind:"snippet",value:r}}o(e,"createSnippet"),t.createSnippet=e})(G0e||(G0e={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}o(e,"create"),t.create=e})(V0e||(V0e={}));(function(t){function e(r){return{items:r}}o(e,"create"),t.create=e})(U0e||(U0e={}));(function(t){t.Invoked=0,t.Automatic=1})(H0e||(H0e={}));(function(t){function e(r,n){return{range:r,text:n}}o(e,"create"),t.create=e})(q0e||(q0e={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}o(e,"create"),t.create=e})(W0e||(W0e={}));(function(t){function e(r){let n=r;return Ge.objectLiteral(n)&&kP.is(n.uri)&&Ge.string(n.name)}o(e,"is"),t.is=e})(Y0e||(Y0e={}));(function(t){function e(a,s,l,u){return new PP(a,s,l,u)}o(e,"create"),t.create=e;function r(a){let s=a;return!!(Ge.defined(s)&&Ge.string(s.uri)&&(Ge.undefined(s.languageId)||Ge.string(s.languageId))&&Ge.uinteger(s.lineCount)&&Ge.func(s.getText)&&Ge.func(s.positionAt)&&Ge.func(s.offsetAt))}o(r,"is"),t.is=r;function n(a,s){let l=a.getText(),u=i(s,(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),h=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],p=a.offsetAt(d.range.start),m=a.offsetAt(d.range.end);if(m<=h)l=l.substring(0,p)+d.newText+l.substring(m,l.length);else throw new Error("Overlapping edit");h=p}return l}o(n,"applyEdits"),t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let l=a.length/2|0,u=a.slice(0,l),h=a.slice(l);i(u,s),i(h,s);let f=0,d=0,p=0;for(;f0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return tn.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return tn.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}o(n,"undefined"),t.undefined=n;function i(m){return m===!0||m===!1}o(i,"boolean"),t.boolean=i;function a(m){return e.call(m)==="[object String]"}o(a,"string"),t.string=a;function s(m){return e.call(m)==="[object Number]"}o(s,"number"),t.number=s;function l(m,g,y){return e.call(m)==="[object Number]"&&g<=m&&m<=y}o(l,"numberRange"),t.numberRange=l;function u(m){return e.call(m)==="[object Number]"&&-2147483648<=m&&m<=2147483647}o(u,"integer"),t.integer=u;function h(m){return e.call(m)==="[object Number]"&&0<=m&&m<=2147483647}o(h,"uinteger"),t.uinteger=h;function f(m){return e.call(m)==="[object Function]"}o(f,"func"),t.func=f;function d(m){return m!==null&&typeof m=="object"}o(d,"objectLiteral"),t.objectLiteral=d;function p(m,g){return Array.isArray(m)&&m.every(g)}o(p,"typedArray"),t.typedArray=p})(Ge||(Ge={}))});var wb,kb,Yp,Xp,FP,B1,FS=N(()=>{"use strict";BP();Bl();wb=class{static{o(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){var e;return(e=this.nodeStack[this.nodeStack.length-1])!==null&&e!==void 0?e:this.rootNode}buildRootNode(e){return this.rootNode=new B1(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new Xp;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new Yp(e.startOffset,e.image.length,xg(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let a of e){let s=new Yp(a.startOffset,a.image.length,xg(a),a.tokenType,!0);s.root=this.rootNode,r.push(s)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let a=n.container.content.indexOf(n);if(a>0){n.container.content.splice(a,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},kb=class{static{o(this,"AbstractCstNode")}get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,r;let n=typeof((e=this._astNode)===null||e===void 0?void 0:e.$type)=="string"?this._astNode:(r=this.container)===null||r===void 0?void 0:r.astNode;if(!n)throw new Error("This node has no associated AST element");return n}set astNode(e){this._astNode=e}get element(){return this.astNode}get text(){return this.root.fullText.substring(this.offset,this.end)}},Yp=class extends kb{static{o(this,"LeafCstNodeImpl")}get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,a=!1){super(),this._hidden=a,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},Xp=class extends kb{static{o(this,"CompositeCstNodeImpl")}constructor(){super(...arguments),this.content=new FP(this)}get children(){return this.content}get offset(){var e,r;return(r=(e=this.firstNonHiddenNode)===null||e===void 0?void 0:e.offset)!==null&&r!==void 0?r:0}get length(){return this.end-this.offset}get end(){var e,r;return(r=(e=this.lastNonHiddenNode)===null||e===void 0?void 0:e.end)!==null&&r!==void 0?r:0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},FP=class t extends Array{static{o(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},B1=class extends Xp{static{o(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function $P(t){return t.$type===$S}var $S,j0e,K0e,Eb,Sb,zS,F1,Cb,PXe,zP,Ab=N(()=>{"use strict";Ff();Ype();Hc();zl();hs();FS();$S=Symbol("Datatype");o($P,"isDataTypeNode");j0e="\u200B",K0e=o(t=>t.endsWith(j0e)?t:t+j0e,"withRuleSuffix"),Eb=class{static{o(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";this.wrapper=new zP(r,Object.assign(Object.assign({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},Sb=class extends Eb{static{o(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new wb,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i=this.wrapper.DEFINE_RULE(K0e(e.name),this.startImplementation(n,r).bind(this));return this.allRules.set(e.name,i),e.entry&&(this.mainRule=i),i}computeRuleType(e){if(!e.fragment){if(jx(e))return $S;{let r=c1(e);return r??e.name}}}parse(e,r={}){this.nodeBuilder.buildRootNode(e);let n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;let i=r.rule?this.allRules.get(r.rule):this.mainRule;if(!i)throw new Error(r.rule?`No rule found with name '${r.rule}'`:"No main rule available.");let a=i.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:a,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,r){return n=>{let i=!this.isRecording()&&e!==void 0;if(i){let s={$type:e};this.stack.push(s),e===$S&&(s.value="")}let a;try{a=r(n)}catch{a=void 0}return a===void 0&&i&&(a=this.construct()),a}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(a);let s=this.nodeBuilder.buildLeafNode(i,n),{assignment:l,isCrossRef:u}=this.getAssignment(n),h=this.current;if(l){let f=Zo(n)?i.image:this.converter.convert(i.image,s);this.assign(l.operator,l.feature,f,s,u)}else if($P(h)){let f=i.image;Zo(n)||(f=this.converter.convert(f,s).toString()),h.value+=f}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,a){let s;!this.isRecording()&&!n&&(s=this.nodeBuilder.buildCompositeNode(i));let l=this.wrapper.wrapSubrule(e,r,a);!this.isRecording()&&s&&s.length>0&&this.performSubruleAssignment(l,i,s)}performSubruleAssignment(e,r,n){let{assignment:i,isCrossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if($P(s))s.value+=e.toString();else if(typeof e=="object"&&e){let u=this.assignWithoutOverride(e,s);this.stack.pop(),this.stack.push(u)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let a={$type:e};this.stack.push(a),this.assign(r.operator,r.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.current;return zE(e),this.nodeBuilder.construct(e),this.stack.pop(),$P(e)?this.converter.convert(e.value,e.$cstNode):(gO(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){let r=Ip(e,Fl);this.assignmentMap.set(e,{assignment:r,isCrossRef:r?Mp(r.terminal):!1})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,l;switch(a&&typeof n=="string"?l=this.linker.buildReference(s,r,i,n):l=n,e){case"=":{s[r]=l;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(l)}}assignWithoutOverride(e,r){for(let[i,a]of Object.entries(r)){let s=e[i];s===void 0?e[i]=a:Array.isArray(s)&&Array.isArray(a)&&(a.push(...s),e[i]=a)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},zS=class{static{o(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return Zu.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return Zu.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return Zu.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return Zu.buildEarlyExitMessage(e)}},F1=class extends zS{static{o(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},Cb=class extends Eb{static{o(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(K0e(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,a){this.before(i),this.wrapper.wrapSubrule(e,r,a),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},PXe={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new F1},zP=class extends gb{static{o(this,"ChevrotainWrapper")}constructor(e,r){let n=r&&"maxLookahead"in r;super(e,Object.assign(Object.assign(Object.assign({},PXe),{lookaheadStrategy:n?new Ju({maxLookahead:r.maxLookahead}):new bb({logging:r.skipValidations?()=>{}:void 0})}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r){return this.RULE(e,r)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}}});function _b(t,e,r){return BXe({parser:e,tokens:r,ruleNames:new Map},t),e}function BXe(t,e){let r=Yx(e,!1),n=an(e.rules).filter(Ga).filter(i=>r.has(i));for(let i of n){let a=Object.assign(Object.assign({},t),{consume:1,optional:1,subrule:1,many:1,or:1});t.parser.rule(i,jp(a,i.definition))}}function jp(t,e,r=!1){let n;if(Zo(e))n=HXe(t,e);else if(qu(e))n=FXe(t,e);else if(Fl(e))n=jp(t,e.terminal);else if(Mp(e))n=Q0e(t,e);else if($l(e))n=$Xe(t,e);else if(BE(e))n=GXe(t,e);else if($E(e))n=VXe(t,e);else if(Of(e))n=UXe(t,e);else if(oO(e)){let i=t.consume++;n=o(()=>t.parser.consume(i,yo,e),"method")}else throw new Rp(e.$cstNode,`Unexpected element type: ${e.$type}`);return Z0e(t,r?void 0:GS(e),n,e.cardinality)}function FXe(t,e){let r=Kx(e);return()=>t.parser.action(r,e)}function $Xe(t,e){let r=e.rule.ref;if(Ga(r)){let n=t.subrule++,i=r.fragment,a=e.arguments.length>0?zXe(r,e.arguments):()=>({});return s=>t.parser.subrule(n,J0e(t,r),i,e,a(s))}else if(mo(r)){let n=t.consume++,i=GP(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Uc(r);else throw new Rp(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function zXe(t,e){let r=e.map(n=>eh(n.value));return n=>{let i={};for(let a=0;ae(n)||r(n)}else if(JI(t)){let e=eh(t.left),r=eh(t.right);return n=>e(n)&&r(n)}else if(tO(t)){let e=eh(t.value);return r=>!e(r)}else if(rO(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(ZI(t)){let e=!!t.true;return()=>e}Uc(t)}function GXe(t,e){if(e.elements.length===1)return jp(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:jp(t,i,!0)},s=GS(i);s&&(a.GATE=eh(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:o(()=>a.ALT(i),"ALT")},l=a.GATE;return l&&(s.GATE=()=>l(i)),s}))}}function VXe(t,e){if(e.elements.length===1)return jp(t,e.elements[0]);let r=[];for(let l of e.elements){let u={ALT:jp(t,l,!0)},h=GS(l);h&&(u.GATE=eh(h)),r.push(u)}let n=t.or++,i=o((l,u)=>{let h=u.getRuleStack().join("-");return`uGroup_${l}_${h}`},"idFunc"),a=o(l=>t.parser.alternatives(n,r.map((u,h)=>{let f={ALT:o(()=>!0,"ALT")},d=t.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let m=i(n,d);d.unorderedGroups.get(m)||d.unorderedGroups.set(m,[]);let g=d.unorderedGroups.get(m);typeof g?.[h]>"u"&&(g[h]=!0)}};let p=u.GATE;return p?f.GATE=()=>p(l):f.GATE=()=>{let m=d.unorderedGroups.get(i(n,d));return!m?.[h]},f})),"alternatives"),s=Z0e(t,GS(e),a,"*");return l=>{s(l),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function UXe(t,e){let r=e.elements.map(n=>jp(t,n));return n=>r.forEach(i=>i(n))}function GS(t){if(Of(t))return t.guardCondition}function Q0e(t,e,r=e.terminal){if(r)if($l(r)&&Ga(r.rule.ref)){let n=r.rule.ref,i=t.subrule++;return a=>t.parser.subrule(i,J0e(t,n),!1,e,a)}else if($l(r)&&mo(r.rule.ref)){let n=t.consume++,i=GP(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Zo(r)){let n=t.consume++,i=GP(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=qE(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+Kx(e.type.ref));return Q0e(t,e,i)}}function HXe(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function Z0e(t,e,r,n){let i=e&&eh(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:o(()=>r(s),"ALT"),GATE:o(()=>i(s),"GATE")},{ALT:LS(),GATE:o(()=>!i(s),"GATE")}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return l=>t.parser.alternatives(s,[{ALT:o(()=>t.parser.atLeastOne(a,{DEF:o(()=>r(l),"DEF")}),"ALT"),GATE:o(()=>i(l),"GATE")},{ALT:LS(),GATE:o(()=>!i(l),"GATE")}])}else return s=>t.parser.atLeastOne(a,{DEF:o(()=>r(s),"DEF")})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else Uc(n)}function J0e(t,e){let r=qXe(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function qXe(t,e){if(Ga(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Ga(n);)(Of(n)||BE(n)||$E(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function GP(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var VS=N(()=>{"use strict";Ff();Hc();NE();Ys();zl();o(_b,"createParser");o(BXe,"buildRules");o(jp,"buildElement");o(FXe,"buildAction");o($Xe,"buildRuleCall");o(zXe,"buildRuleCallPredicate");o(eh,"buildPredicate");o(GXe,"buildAlternatives");o(VXe,"buildUnorderedGroup");o(UXe,"buildGroup");o(GS,"getGuardCondition");o(Q0e,"buildCrossReference");o(HXe,"buildKeyword");o(Z0e,"wrap");o(J0e,"getRule");o(qXe,"getRuleName");o(GP,"getToken")});function VP(t){let e=t.Grammar,r=t.parser.Lexer,n=new Cb(t);return _b(e,n,r.definition),n.finalize(),n}var UP=N(()=>{"use strict";Ab();VS();o(VP,"createCompletionParser")});function HP(t){let e=eme(t);return e.finalize(),e}function eme(t){let e=t.Grammar,r=t.parser.Lexer,n=new Sb(t);return _b(e,n,r.definition)}var qP=N(()=>{"use strict";Ab();VS();o(HP,"createLangiumParser");o(eme,"prepareLangiumParser")});var th,US=N(()=>{"use strict";Ff();Hc();hs();zl();l1();Ys();th=class{static{o(this,"DefaultTokenBuilder")}constructor(){this.diagnostics=[]}buildTokens(e,r){let n=an(Yx(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return i.forEach(s=>{let l=s.PATTERN;typeof l=="object"&&l&&"test"in l&&o1(l)?a.unshift(s):a.push(s)}),a}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(mo).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=u1(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=o1(r)?Zn.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")||e.flags.includes("s")?!0:!!(e.source.includes("?<=")||e.source.includes("?(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Ga).flatMap(i=>qc(i).filter(Zo)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),a={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(a.LINE_BREAKS=!0),a}buildKeywordPattern(e,r){return r?new RegExp(kO(e.value)):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&EO("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var Kp,Xc,WP=N(()=>{"use strict";Hc();zl();Kp=class{static{o(this,"DefaultValueConverter")}convert(e,r){let n=r.grammarSource;if(Mp(n)&&(n=AO(n)),$l(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){var i;switch(e.name.toUpperCase()){case"INT":return Xc.convertInt(r);case"STRING":return Xc.convertString(r);case"ID":return Xc.convertID(r)}switch((i=IO(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return Xc.convertNumber(r);case"boolean":return Xc.convertBoolean(r);case"bigint":return Xc.convertBigint(r);case"date":return Xc.convertDate(r);default:return r}}};(function(t){function e(h){let f="";for(let d=1;d{"use strict";Object.defineProperty(jP,"__esModule",{value:!0});var YP;function XP(){if(YP===void 0)throw new Error("No runtime abstraction layer installed");return YP}o(XP,"RAL");(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");YP=r}o(e,"install"),t.install=e})(XP||(XP={}));jP.default=XP});var nme=Da(Ua=>{"use strict";Object.defineProperty(Ua,"__esModule",{value:!0});Ua.stringArray=Ua.array=Ua.func=Ua.error=Ua.number=Ua.string=Ua.boolean=void 0;function WXe(t){return t===!0||t===!1}o(WXe,"boolean");Ua.boolean=WXe;function tme(t){return typeof t=="string"||t instanceof String}o(tme,"string");Ua.string=tme;function YXe(t){return typeof t=="number"||t instanceof Number}o(YXe,"number");Ua.number=YXe;function XXe(t){return t instanceof Error}o(XXe,"error");Ua.error=XXe;function jXe(t){return typeof t=="function"}o(jXe,"func");Ua.func=jXe;function rme(t){return Array.isArray(t)}o(rme,"array");Ua.array=rme;function KXe(t){return rme(t)&&t.every(e=>tme(e))}o(KXe,"stringArray");Ua.stringArray=KXe});var ZP=Da($1=>{"use strict";Object.defineProperty($1,"__esModule",{value:!0});$1.Emitter=$1.Event=void 0;var QXe=KP(),ime;(function(t){let e={dispose(){}};t.None=function(){return e}})(ime||($1.Event=ime={}));var QP=class{static{o(this,"CallbackList")}add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:o(()=>this.remove(e,r),"dispose")})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new QP),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:o(()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};$1.Emitter=HS;HS._noop=function(){}});var ame=Da(z1=>{"use strict";Object.defineProperty(z1,"__esModule",{value:!0});z1.CancellationTokenSource=z1.CancellationToken=void 0;var ZXe=KP(),JXe=nme(),JP=ZP(),qS;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:JP.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:JP.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||JXe.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}o(e,"is"),t.is=e})(qS||(z1.CancellationToken=qS={}));var eje=Object.freeze(function(t,e){let r=(0,ZXe.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),WS=class{static{o(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?eje:(this._emitter||(this._emitter=new JP.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},eB=class{static{o(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new WS),this._token}cancel(){this._token?this._token.cancel():this._token=qS.Cancelled}dispose(){this._token?this._token instanceof WS&&this._token.dispose():this._token=qS.None}};z1.CancellationTokenSource=eB});var br={};var el=N(()=>{"use strict";Lr(br,ja(ame(),1))});function tB(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function XS(){return YS=performance.now(),new br.CancellationTokenSource}function ome(t){sme=t}function Kc(t){return t===jc}async function bi(t){if(t===br.CancellationToken.None)return;let e=performance.now();if(e-YS>=sme&&(YS=e,await tB(),YS=performance.now()),t.isCancellationRequested)throw jc}var YS,sme,jc,gs,tl=N(()=>{"use strict";el();o(tB,"delayNextTick");YS=0,sme=10;o(XS,"startCancelableOperation");o(ome,"setInterruptionPeriod");jc=Symbol("OperationCancelled");o(Kc,"isOperationCancelled");o(bi,"interruptAndCheck");gs=class{static{o(this,"Deferred")}constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function rB(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);rB(n,e),rB(i,e);let a=0,s=0,l=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function tje(t){let e=ume(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var jS,G1,hme=N(()=>{"use strict";jS=class t{static{o(this,"FullTextDocument")}constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=ume(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),h=this._lineOffsets,f=lme(n.text,!1,a);if(u-l===f.length)for(let p=0,m=f.length;pe?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&cme(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,l){return new jS(i,a,s,l)}o(e,"create"),t.create=e;function r(i,a,s){if(i instanceof jS)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}o(r,"update"),t.update=r;function n(i,a){let s=i.getText(),l=rB(a.map(tje),(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),u=0,h=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&h.push(s.substring(u,d)),f.newText.length&&h.push(f.newText),u=i.offsetAt(f.range.end)}return h.push(s.substr(u)),h.join("")}o(n,"applyEdits"),t.applyEdits=n})(G1||(G1={}));o(rB,"mergeSort");o(lme,"computeLineOffsets");o(cme,"isEOL");o(ume,"getWellformedRange");o(tje,"getWellformedEdit")});var fme,ys,V1,nB=N(()=>{"use strict";(()=>{"use strict";var t={470:i=>{function a(u){if(typeof u!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(u))}o(a,"e");function s(u,h){for(var f,d="",p=0,m=-1,g=0,y=0;y<=u.length;++y){if(y2){var v=d.lastIndexOf("/");if(v!==d.length-1){v===-1?(d="",p=0):p=(d=d.slice(0,v)).length-1-d.lastIndexOf("/"),m=y,g=0;continue}}else if(d.length===2||d.length===1){d="",p=0,m=y,g=0;continue}}h&&(d.length>0?d+="/..":d="..",p=2)}else d.length>0?d+="/"+u.slice(m+1,y):d=u.slice(m+1,y),p=y-m-1;m=y,g=0}else f===46&&g!==-1?++g:g=-1}return d}o(s,"r");var l={resolve:o(function(){for(var u,h="",f=!1,d=arguments.length-1;d>=-1&&!f;d--){var p;d>=0?p=arguments[d]:(u===void 0&&(u=process.cwd()),p=u),a(p),p.length!==0&&(h=p+"/"+h,f=p.charCodeAt(0)===47)}return h=s(h,!f),f?h.length>0?"/"+h:"/":h.length>0?h:"."},"resolve"),normalize:o(function(u){if(a(u),u.length===0)return".";var h=u.charCodeAt(0)===47,f=u.charCodeAt(u.length-1)===47;return(u=s(u,!h)).length!==0||h||(u="."),u.length>0&&f&&(u+="/"),h?"/"+u:u},"normalize"),isAbsolute:o(function(u){return a(u),u.length>0&&u.charCodeAt(0)===47},"isAbsolute"),join:o(function(){if(arguments.length===0)return".";for(var u,h=0;h0&&(u===void 0?u=f:u+="/"+f)}return u===void 0?".":l.normalize(u)},"join"),relative:o(function(u,h){if(a(u),a(h),u===h||(u=l.resolve(u))===(h=l.resolve(h)))return"";for(var f=1;fy){if(h.charCodeAt(m+x)===47)return h.slice(m+x+1);if(x===0)return h.slice(m+x)}else p>y&&(u.charCodeAt(f+x)===47?v=x:x===0&&(v=0));break}var b=u.charCodeAt(f+x);if(b!==h.charCodeAt(m+x))break;b===47&&(v=x)}var T="";for(x=f+v+1;x<=d;++x)x!==d&&u.charCodeAt(x)!==47||(T.length===0?T+="..":T+="/..");return T.length>0?T+h.slice(m+v):(m+=v,h.charCodeAt(m)===47&&++m,h.slice(m))},"relative"),_makeLong:o(function(u){return u},"_makeLong"),dirname:o(function(u){if(a(u),u.length===0)return".";for(var h=u.charCodeAt(0),f=h===47,d=-1,p=!0,m=u.length-1;m>=1;--m)if((h=u.charCodeAt(m))===47){if(!p){d=m;break}}else p=!1;return d===-1?f?"/":".":f&&d===1?"//":u.slice(0,d)},"dirname"),basename:o(function(u,h){if(h!==void 0&&typeof h!="string")throw new TypeError('"ext" argument must be a string');a(u);var f,d=0,p=-1,m=!0;if(h!==void 0&&h.length>0&&h.length<=u.length){if(h.length===u.length&&h===u)return"";var g=h.length-1,y=-1;for(f=u.length-1;f>=0;--f){var v=u.charCodeAt(f);if(v===47){if(!m){d=f+1;break}}else y===-1&&(m=!1,y=f+1),g>=0&&(v===h.charCodeAt(g)?--g==-1&&(p=f):(g=-1,p=y))}return d===p?p=y:p===-1&&(p=u.length),u.slice(d,p)}for(f=u.length-1;f>=0;--f)if(u.charCodeAt(f)===47){if(!m){d=f+1;break}}else p===-1&&(m=!1,p=f+1);return p===-1?"":u.slice(d,p)},"basename"),extname:o(function(u){a(u);for(var h=-1,f=0,d=-1,p=!0,m=0,g=u.length-1;g>=0;--g){var y=u.charCodeAt(g);if(y!==47)d===-1&&(p=!1,d=g+1),y===46?h===-1?h=g:m!==1&&(m=1):h!==-1&&(m=-1);else if(!p){f=g+1;break}}return h===-1||d===-1||m===0||m===1&&h===d-1&&h===f+1?"":u.slice(h,d)},"extname"),format:o(function(u){if(u===null||typeof u!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof u);return(function(h,f){var d=f.dir||f.root,p=f.base||(f.name||"")+(f.ext||"");return d?d===f.root?d+p:d+"/"+p:p})(0,u)},"format"),parse:o(function(u){a(u);var h={root:"",dir:"",base:"",ext:"",name:""};if(u.length===0)return h;var f,d=u.charCodeAt(0),p=d===47;p?(h.root="/",f=1):f=0;for(var m=-1,g=0,y=-1,v=!0,x=u.length-1,b=0;x>=f;--x)if((d=u.charCodeAt(x))!==47)y===-1&&(v=!1,y=x+1),d===46?m===-1?m=x:b!==1&&(b=1):m!==-1&&(b=-1);else if(!v){g=x+1;break}return m===-1||y===-1||b===0||b===1&&m===y-1&&m===g+1?y!==-1&&(h.base=h.name=g===0&&p?u.slice(1,y):u.slice(g,y)):(g===0&&p?(h.name=u.slice(1,m),h.base=u.slice(1,y)):(h.name=u.slice(g,m),h.base=u.slice(g,y)),h.ext=u.slice(m,y)),g>0?h.dir=u.slice(0,g-1):p&&(h.dir="/"),h},"parse"),sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function r(i){var a=e[i];if(a!==void 0)return a.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}o(r,"r"),r.d=(i,a)=>{for(var s in a)r.o(a,s)&&!r.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:a[s]})},r.o=(i,a)=>Object.prototype.hasOwnProperty.call(i,a),r.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;r.r(n),r.d(n,{URI:o(()=>p,"URI"),Utils:o(()=>I,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,l=/^\/\//;function u(L,E){if(!L.scheme&&E)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${L.authority}", path: "${L.path}", query: "${L.query}", fragment: "${L.fragment}"}`);if(L.scheme&&!a.test(L.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(L.path){if(L.authority){if(!s.test(L.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(L.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}o(u,"s");let h="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class p{static{o(this,"f")}static isUri(E){return E instanceof p||!!E&&typeof E.authority=="string"&&typeof E.fragment=="string"&&typeof E.path=="string"&&typeof E.query=="string"&&typeof E.scheme=="string"&&typeof E.fsPath=="string"&&typeof E.with=="function"&&typeof E.toString=="function"}scheme;authority;path;query;fragment;constructor(E,D,_,O,M,P=!1){typeof E=="object"?(this.scheme=E.scheme||h,this.authority=E.authority||h,this.path=E.path||h,this.query=E.query||h,this.fragment=E.fragment||h):(this.scheme=(function(B,F){return B||F?B:"file"})(E,P),this.authority=D||h,this.path=(function(B,F){switch(B){case"https":case"http":case"file":F?F[0]!==f&&(F=f+F):F=f}return F})(this.scheme,_||h),this.query=O||h,this.fragment=M||h,u(this,P))}get fsPath(){return b(this,!1)}with(E){if(!E)return this;let{scheme:D,authority:_,path:O,query:M,fragment:P}=E;return D===void 0?D=this.scheme:D===null&&(D=h),_===void 0?_=this.authority:_===null&&(_=h),O===void 0?O=this.path:O===null&&(O=h),M===void 0?M=this.query:M===null&&(M=h),P===void 0?P=this.fragment:P===null&&(P=h),D===this.scheme&&_===this.authority&&O===this.path&&M===this.query&&P===this.fragment?this:new g(D,_,O,M,P)}static parse(E,D=!1){let _=d.exec(E);return _?new g(_[2]||h,k(_[4]||h),k(_[5]||h),k(_[7]||h),k(_[9]||h),D):new g(h,h,h,h,h)}static file(E){let D=h;if(i&&(E=E.replace(/\\/g,f)),E[0]===f&&E[1]===f){let _=E.indexOf(f,2);_===-1?(D=E.substring(2),E=f):(D=E.substring(2,_),E=E.substring(_)||f)}return new g("file",D,E,h,h)}static from(E){let D=new g(E.scheme,E.authority,E.path,E.query,E.fragment);return u(D,!0),D}toString(E=!1){return T(this,E)}toJSON(){return this}static revive(E){if(E){if(E instanceof p)return E;{let D=new g(E);return D._formatted=E.external,D._fsPath=E._sep===m?E.fsPath:null,D}}return E}}let m=i?1:void 0;class g extends p{static{o(this,"l")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(E=!1){return E?T(this,!0):(this._formatted||(this._formatted=T(this,!1)),this._formatted)}toJSON(){let E={$mid:1};return this._fsPath&&(E.fsPath=this._fsPath,E._sep=m),this._formatted&&(E.external=this._formatted),this.path&&(E.path=this.path),this.scheme&&(E.scheme=this.scheme),this.authority&&(E.authority=this.authority),this.query&&(E.query=this.query),this.fragment&&(E.fragment=this.fragment),E}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(L,E,D){let _,O=-1;for(let M=0;M=97&&P<=122||P>=65&&P<=90||P>=48&&P<=57||P===45||P===46||P===95||P===126||E&&P===47||D&&P===91||D&&P===93||D&&P===58)O!==-1&&(_+=encodeURIComponent(L.substring(O,M)),O=-1),_!==void 0&&(_+=L.charAt(M));else{_===void 0&&(_=L.substr(0,M));let B=y[P];B!==void 0?(O!==-1&&(_+=encodeURIComponent(L.substring(O,M)),O=-1),_+=B):O===-1&&(O=M)}}return O!==-1&&(_+=encodeURIComponent(L.substring(O))),_!==void 0?_:L}o(v,"d");function x(L){let E;for(let D=0;D1&&L.scheme==="file"?`//${L.authority}${L.path}`:L.path.charCodeAt(0)===47&&(L.path.charCodeAt(1)>=65&&L.path.charCodeAt(1)<=90||L.path.charCodeAt(1)>=97&&L.path.charCodeAt(1)<=122)&&L.path.charCodeAt(2)===58?E?L.path.substr(1):L.path[1].toLowerCase()+L.path.substr(2):L.path,i&&(D=D.replace(/\//g,"\\")),D}o(b,"m");function T(L,E){let D=E?x:v,_="",{scheme:O,authority:M,path:P,query:B,fragment:F}=L;if(O&&(_+=O,_+=":"),(M||O==="file")&&(_+=f,_+=f),M){let G=M.indexOf("@");if(G!==-1){let $=M.substr(0,G);M=M.substr(G+1),G=$.lastIndexOf(":"),G===-1?_+=D($,!1,!1):(_+=D($.substr(0,G),!1,!1),_+=":",_+=D($.substr(G+1),!1,!0)),_+="@"}M=M.toLowerCase(),G=M.lastIndexOf(":"),G===-1?_+=D(M,!1,!0):(_+=D(M.substr(0,G),!1,!0),_+=M.substr(G))}if(P){if(P.length>=3&&P.charCodeAt(0)===47&&P.charCodeAt(2)===58){let G=P.charCodeAt(1);G>=65&&G<=90&&(P=`/${String.fromCharCode(G+32)}:${P.substr(3)}`)}else if(P.length>=2&&P.charCodeAt(1)===58){let G=P.charCodeAt(0);G>=65&&G<=90&&(P=`${String.fromCharCode(G+32)}:${P.substr(2)}`)}_+=D(P,!0,!1)}return B&&(_+="?",_+=D(B,!1,!1)),F&&(_+="#",_+=E?F:v(F,!1,!1)),_}o(T,"y");function S(L){try{return decodeURIComponent(L)}catch{return L.length>3?L.substr(0,3)+S(L.substr(3)):L}}o(S,"v");let w=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function k(L){return L.match(w)?L.replace(w,(E=>S(E))):L}o(k,"C");var A=r(470);let C=A.posix||A,R="/";var I;(function(L){L.joinPath=function(E,...D){return E.with({path:C.join(E.path,...D)})},L.resolvePath=function(E,...D){let _=E.path,O=!1;_[0]!==R&&(_=R+_,O=!0);let M=C.resolve(_,...D);return O&&M[0]===R&&!E.authority&&(M=M.substring(1)),E.with({path:M})},L.dirname=function(E){if(E.path.length===0||E.path===R)return E;let D=C.dirname(E.path);return D.length===1&&D.charCodeAt(0)===46&&(D=""),E.with({path:D})},L.basename=function(E){return C.basename(E.path)},L.extname=function(E){return C.extname(E.path)}})(I||(I={}))})(),fme=n})();({URI:ys,Utils:V1}=fme)});var vs,Qc=N(()=>{"use strict";nB();(function(t){t.basename=V1.basename,t.dirname=V1.dirname,t.extname=V1.extname,t.joinPath=V1.joinPath,t.resolvePath=V1.resolvePath;function e(i,a){return i?.toString()===a?.toString()}o(e,"equals"),t.equals=e;function r(i,a){let s=typeof i=="string"?i:i.path,l=typeof a=="string"?a:a.path,u=s.split("/").filter(m=>m.length>0),h=l.split("/").filter(m=>m.length>0),f=0;for(;f{"use strict";hme();U1();el();Ys();Qc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(Ln||(Ln={}));Db=class{static{o(this,"DefaultLangiumDocumentFactory")}constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=br.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??ys.parse(e.uri),br.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return br.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:Ln.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:Ln.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){var n,i;let a=(n=e.parseResult.value.$cstNode)===null||n===void 0?void 0:n.root.fullText,s=(i=this.textDocuments)===null||i===void 0?void 0:i.get(e.uri.toString()),l=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{let u=this.createTextDocumentGetter(e.uri,l);Object.defineProperty(e,"textDocument",{get:u})}return a!==l&&(e.parseResult=await this.parseAsync(e.uri,l,r),e.parseResult.value.$document=e),e.state=Ln.Parsed,e}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=G1.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},Lb=class{static{o(this,"DefaultLangiumDocuments")}constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return an(this.documentMap.values())}addDocument(e){let r=e.uri.toString();if(this.documentMap.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentMap.set(r,e)}getDocument(e){let r=e.toString();return this.documentMap.get(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=Ln.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0),n}deleteDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=Ln.Changed,this.documentMap.delete(r)),n}}});var iB,Rb,aB=N(()=>{"use strict";el();Pl();hs();tl();U1();iB=Symbol("ref_resolving"),Rb=class{static{o(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,r=br.CancellationToken.None){for(let n of Jo(e.parseResult.value))await bi(r),a1(n).forEach(i=>this.doLink(i,e))}doLink(e,r){var n;let i=e.reference;if(i._ref===void 0){i._ref=iB;try{let a=this.getCandidate(e);if(_p(a))i._ref=a;else if(i._nodeDescription=a,this.langiumDocuments().hasDocument(a.documentUri)){let s=this.loadAstNode(a);i._ref=s??this.createLinkingError(e,a)}else i._ref=void 0}catch(a){console.error(`An error occurred while resolving reference to '${i.$refText}':`,a);let s=(n=a.message)!==null&&n!==void 0?n:String(a);i._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${i.$refText}': ${s}`})}r.references.push(i)}}unlink(e){for(let r of e.references)delete r._ref,delete r._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,get ref(){var l;if(li(this._ref))return this._ref;if(qI(this._nodeDescription)){let u=a.loadAstNode(this._nodeDescription);this._ref=u??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=iB;let u=Gx(e).$document,h=a.getLinkedNode({reference:s,container:e,property:r});if(h.error&&u&&u.state{"use strict";zl();o(dme,"isNamed");Nb=class{static{o(this,"DefaultNameProvider")}getName(e){if(dme(e))return e.name}getNameNode(e){return Xx(e.$cstNode,"name")}}});var Mb,oB=N(()=>{"use strict";zl();Pl();hs();Bl();Ys();Qc();Mb=class{static{o(this,"DefaultReferences")}constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){let r=MO(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(Ta(i))return i.ref;if(Array.isArray(i)){for(let a of i)if(Ta(a)&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return a.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||YI(e,i)))return n}}}findDeclarationNode(e){let r=this.findDeclaration(e);if(r?.$cstNode){let n=this.nameProvider.getNameNode(r);return n??r.$cstNode}}findReferences(e,r){let n=[];if(r.includeDeclaration){let a=this.getReferenceToSelf(e);a&&n.push(a)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>vs.equals(a.sourceUri,r.documentUri))),n.push(...i),an(n)}getReferenceToSelf(e){let r=this.nameProvider.getNameNode(e);if(r){let n=Va(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:Lp(r),local:!0}}}}});var Vl,Qp,H1=N(()=>{"use strict";Ys();Vl=class{static{o(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return vg.sum(an(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var r;return(r=this.map.get(e))!==null&&r!==void 0?r:[]}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return an(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return an(this.map.keys())}values(){return an(this.map.values()).flat()}entriesGroupedByKey(){return an(this.map.entries())}},Qp=class{static{o(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var Ib,lB=N(()=>{"use strict";el();hs();H1();tl();Ib=class{static{o(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,r=br.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,r)}async computeExportsForNode(e,r,n=Vx,i=br.CancellationToken.None){let a=[];this.exportNode(e,a,r);for(let s of n(e))await bi(i),this.exportNode(s,a,r);return a}exportNode(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,r=br.CancellationToken.None){let n=e.parseResult.value,i=new Vl;for(let a of qc(n))await bi(r),this.processNode(a,e,i);return i}processNode(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var q1,Ob,rje,cB=N(()=>{"use strict";Ys();q1=class{static{o(this,"StreamScope")}constructor(e,r,n){var i;this.elements=e,this.outerScope=r,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(r)return r;if(this.outerScope)return this.outerScope.getElement(e)}},Ob=class{static{o(this,"MapScope")}constructor(e,r,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let a of e){let s=this.caseInsensitive?a.name.toLowerCase():a.name;this.elements.set(s,a)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=an(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},rje={getElement(){},getAllElements(){return Rx}}});var W1,Pb,Zp,KS,Y1,QS=N(()=>{"use strict";W1=class{static{o(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},Pb=class extends W1{static{o(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},Zp=class extends W1{static{o(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},KS=class extends Zp{static{o(this,"DocumentCache")}constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let a of i)this.clear(a)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let a=n.concat(i);for(let s of a)this.clear(s)}))}},Y1=class extends Pb{static{o(this,"WorkspaceCache")}constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var Bb,uB=N(()=>{"use strict";cB();hs();Ys();QS();Bb=class{static{o(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new Y1(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=Va(e.container).precomputedScopes;if(i){let s=e.container;do{let l=i.get(s);l.length>0&&r.push(an(l).filter(u=>this.reflection.isSubtype(u.type,n))),s=s.$container}while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new q1(an(e),r,n)}createScopeForNodes(e,r,n){let i=an(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new q1(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new Ob(this.indexManager.allElements(e)))}}});function hB(t){return typeof t.$comment=="string"}function pme(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var Fb,ZS=N(()=>{"use strict";nB();Pl();hs();zl();o(hB,"isAstNodeWithComment");o(pme,"isIntermediateReference");Fb=class{static{o(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,a=o((l,u)=>this.replacer(l,u,n),"defaultReplacer"),s=i?(l,u)=>i(l,u,a):a;try{return this.currentDocument=Va(e),JSON.stringify(e,s,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:l}){var u,h,f,d;if(!this.ignoreProperties.has(e))if(Ta(r)){let p=r.ref,m=n?r.$refText:void 0;if(p){let g=Va(p),y="";this.currentDocument&&this.currentDocument!==g&&(l?y=l(g.uri,r):y=g.uri.toString());let v=this.astNodeLocator.getAstNodePath(p);return{$ref:`${y}#${v}`,$refText:m}}else return{$error:(h=(u=r.error)===null||u===void 0?void 0:u.message)!==null&&h!==void 0?h:"Could not resolve reference",$refText:m}}else if(li(r)){let p;if(a&&(p=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},r)),(!e||r.$document)&&p?.$textRegion&&(p.$textRegion.documentURI=(f=this.currentDocument)===null||f===void 0?void 0:f.uri.toString())),i&&!e&&(p??(p=Object.assign({},r)),p.$sourceText=(d=r.$cstNode)===null||d===void 0?void 0:d.text),s){p??(p=Object.assign({},r));let m=this.commentProvider.getComment(r);m&&(p.$comment=m.replace(/\r/g,""))}return p??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=o(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=DO(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[u,h]of Object.entries(e))if(Array.isArray(h))for(let f=0;f{"use strict";Qc();$b=class{static{o(this,"DefaultServiceRegistry")}get map(){return this.fileExtensionMap}constructor(e){this.languageIdMap=new Map,this.fileExtensionMap=new Map,this.textDocuments=e?.workspace.TextDocuments}register(e){let r=e.LanguageMetaData;for(let n of r.fileExtensions)this.fileExtensionMap.has(n)&&console.warn(`The file extension ${n} is used by multiple languages. It is now assigned to '${r.languageId}'.`),this.fileExtensionMap.set(n,e);this.languageIdMap.set(r.languageId,e),this.languageIdMap.size===1?this.singleton=e:this.singleton=void 0}getServices(e){var r,n;if(this.singleton!==void 0)return this.singleton;if(this.languageIdMap.size===0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let i=(n=(r=this.textDocuments)===null||r===void 0?void 0:r.get(e))===null||n===void 0?void 0:n.languageId;if(i!==void 0){let l=this.languageIdMap.get(i);if(l)return l}let a=vs.extname(e),s=this.fileExtensionMap.get(a);if(!s)throw i?new Error(`The service registry contains no services for the extension '${a}' for language '${i}'.`):new Error(`The service registry contains no services for the extension '${a}'.`);return s}hasServices(e){try{return this.getServices(e),!0}catch{return!1}}get all(){return Array.from(this.languageIdMap.values())}}});function Jp(t){return{code:t}}var X1,zb,Gb=N(()=>{"use strict";vo();H1();tl();Ys();o(Jp,"diagnosticData");(function(t){t.all=["fast","slow","built-in"]})(X1||(X1={}));zb=class{static{o(this,"ValidationRegistry")}constructor(e){this.entries=new Vl,this.entriesBefore=[],this.entriesAfter=[],this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let l of s){let u={check:this.wrapValidationException(l,r),category:n};this.addEntry(i,u)}else if(typeof s=="function"){let l={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,l)}else Uc(s)}}wrapValidationException(e,r){return async(n,i,a)=>{await this.handleException(()=>e.call(r,n,i,a),"An error occurred during validation",i,n)}}async handleException(e,r,n,i){try{await e()}catch(a){if(Kc(a))throw a;console.error(`${r}:`,a),a instanceof Error&&a.stack&&console.error(a.stack);let s=a instanceof Error?a.message:String(a);n("error",`${r}: ${s}`,{node:i})}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=an(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return async(i,a,s,l)=>{await this.handleException(()=>e.call(n,i,a,s,l),r,a,i)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}}});function mme(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=Xx(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=RO(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function JS(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function gme(t){switch(t){case"error":return Jp(rl.LexingError);case"warning":return Jp(rl.LexingWarning);case"info":return Jp(rl.LexingInfo);case"hint":return Jp(rl.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var Vb,rl,dB=N(()=>{"use strict";el();zl();hs();Bl();tl();Gb();Vb=class{static{o(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,r={},n=br.CancellationToken.None){let i=e.parseResult,a=[];if(await bi(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===rl.LexingError})||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===rl.ParsingError}))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===rl.LinkingError}))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(Kc(s))throw s;console.error("An error occurred during validation:",s)}return await bi(n),a}processLexingErrors(e,r,n){var i,a,s;let l=[...e.lexerErrors,...(a=(i=e.lexerReport)===null||i===void 0?void 0:i.diagnostics)!==null&&a!==void 0?a:[]];for(let u of l){let h=(s=u.severity)!==null&&s!==void 0?s:"error",f={severity:JS(h),range:{start:{line:u.line-1,character:u.column-1},end:{line:u.line-1,character:u.column+u.length-1}},message:u.message,data:gme(h),source:this.getSource()};r.push(f)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let l={line:0,character:0};a={start:l,end:l}}else{let l={line:s.endLine-1,character:s.endColumn};a={start:l,end:l}}}}else a=xg(i.token);if(a){let s={severity:JS("error"),range:a,message:i.message,data:Jp(rl.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.container,property:a.property,index:a.index,data:{code:rl.LinkingError,containerType:a.container.$type,property:a.property,refText:a.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=br.CancellationToken.None){let i=[],a=o((s,l,u)=>{i.push(this.toDiagnostic(s,l,u))},"acceptor");return await this.validateAstBefore(e,r,a,n),await this.validateAstNodes(e,r,a,n),await this.validateAstAfter(e,r,a,n),i}async validateAstBefore(e,r,n,i=br.CancellationToken.None){var a;let s=this.validationRegistry.checksBefore;for(let l of s)await bi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}async validateAstNodes(e,r,n,i=br.CancellationToken.None){await Promise.all(Jo(e).map(async a=>{await bi(i);let s=this.validationRegistry.getChecks(a.$type,r.categories);for(let l of s)await l(a,n,i)}))}async validateAstAfter(e,r,n,i=br.CancellationToken.None){var a;let s=this.validationRegistry.checksAfter;for(let l of s)await bi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}toDiagnostic(e,r,n){return{message:r,range:mme(n),severity:JS(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};o(mme,"getDiagnosticRange");o(JS,"toDiagnosticSeverity");o(gme,"toDiagnosticData");(function(t){t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(rl||(rl={}))});var Ub,Hb,pB=N(()=>{"use strict";el();Pl();hs();Bl();tl();Qc();Ub=class{static{o(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??Va(e);r??(r=this.nameProvider.getName(e));let a=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${a} has no name.`);let s,l=o(()=>{var u;return s??(s=Lp((u=this.nameProvider.getNameNode(e))!==null&&u!==void 0?u:e.$cstNode))},"nameSegmentGetter");return{node:e,name:r,get nameSegment(){return l()},selectionSegment:Lp(e.$cstNode),type:e.$type,documentUri:i.uri,path:a}}},Hb=class{static{o(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=br.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of Jo(i))await bi(r),a1(a).filter(s=>!_p(s)).forEach(s=>{let l=this.createDescription(s);l&&n.push(l)});return n}createDescription(e){let r=e.reference.$nodeDescription,n=e.reference.$refNode;if(!r||!n)return;let i=Va(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:r.documentUri,targetPath:r.path,segment:Lp(n),local:vs.equals(r.documentUri,i)}}}});var qb,mB=N(()=>{"use strict";qb=class{static{o(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let l=a.substring(0,s),u=parseInt(a.substring(s+1)),h=i[l];return h?.[u]}return i[a]},e)}}});var ei={};var e6=N(()=>{"use strict";Lr(ei,ja(ZP(),1))});var Wb,gB=N(()=>{"use strict";e6();tl();Wb=class{static{o(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new gs,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new ei.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var r,n;this.workspaceConfig=(n=(r=e.capabilities.workspace)===null||r===void 0?void 0:r.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(r=>{let n=e.settings[r];this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}});var Gf,yB=N(()=>{"use strict";(function(t){function e(r){return{dispose:o(async()=>await r(),"dispose")}}o(e,"create"),t.create=e})(Gf||(Gf={}))});var Yb,vB=N(()=>{"use strict";el();yB();H1();tl();Ys();Gb();U1();Yb=class{static{o(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Vl,this.documentPhaseListeners=new Vl,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=Ln.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=br.CancellationToken.None){var i,a;for(let s of e){let l=s.uri.toString();if(s.state===Ln.Validated){if(typeof r.validation=="boolean"&&r.validation)s.state=Ln.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(l);else if(typeof r.validation=="object"){let u=this.buildState.get(l),h=(i=u?.result)===null||i===void 0?void 0:i.validationChecks;if(h){let d=((a=r.validation.categories)!==null&&a!==void 0?a:X1.all).filter(p=>!h.includes(p));d.length>0&&(this.buildState.set(l,{completed:!1,options:{validation:Object.assign(Object.assign({},r.validation),{categories:d})},result:u.result}),s.state=Ln.IndexedReferences)}}}else this.buildState.delete(l)}this.currentState=Ln.Changed,await this.emitUpdate(e.map(s=>s.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=br.CancellationToken.None){this.currentState=Ln.Changed;for(let s of r)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(let s of e){if(!this.langiumDocuments.invalidateDocument(s)){let u=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);u.state=Ln.Changed,this.langiumDocuments.addDocument(u)}this.buildState.delete(s.toString())}let i=an(e).concat(r).map(s=>s.toString()).toSet();this.langiumDocuments.all.filter(s=>!i.has(s.uri.toString())&&this.shouldRelink(s,i)).forEach(s=>{this.serviceRegistry.getServices(s.uri).references.Linker.unlink(s),s.state=Math.min(s.state,Ln.ComputedScopes),s.diagnostics=void 0}),await this.emitUpdate(e,r),await bi(n);let a=this.sortDocuments(this.langiumDocuments.all.filter(s=>{var l;return s.staten(e,r)))}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),Gf.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,Ln.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),await this.runCancelable(e,Ln.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),await this.runCancelable(e,Ln.ComputedScopes,n,async a=>{let s=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.precomputedScopes=await s.computeLocalScopes(a,n)}),await this.runCancelable(e,Ln.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),await this.runCancelable(e,Ln.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let i=e.filter(a=>this.shouldValidate(a));await this.runCancelable(i,Ln.Validated,n,a=>this.validate(a,n));for(let a of e){let s=this.buildState.get(a.uri.toString());s&&(s.completed=!0)}}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){let a=e.filter(l=>l.statel.state===r);await this.notifyBuildPhase(s,r,n),this.currentState=r}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),Gf.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),Gf.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;if(r&&"path"in r?i=r:n=r,n??(n=br.CancellationToken.None),i){let a=this.langiumDocuments.getDocument(i);if(a&&a.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(jc):new Promise((a,s)=>{let l=this.onBuildPhase(e,()=>{if(l.dispose(),u.dispose(),i){let h=this.langiumDocuments.getDocument(i);a(h?.uri)}else a(void 0)}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),s(jc)})})}async notifyDocumentPhase(e,r,n){let a=this.documentPhaseListeners.get(r).slice();for(let s of a)try{await s(e,n)}catch(l){if(!Kc(l))throw l}}async notifyBuildPhase(e,r,n){if(e.length===0)return;let a=this.buildPhaseListeners.get(r).slice();for(let s of a)await bi(n),await s(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){var n,i;let a=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,l=typeof s=="object"?s:void 0,u=await a.validateDocument(e,l,r);e.diagnostics?e.diagnostics.push(...u):e.diagnostics=u;let h=this.buildState.get(e.uri.toString());if(h){(n=h.result)!==null&&n!==void 0||(h.result={});let f=(i=l?.categories)!==null&&i!==void 0?i:X1.all;h.result.validationChecks?h.result.validationChecks.push(...f):h.result.validationChecks=[...f]}}getBuildOptions(e){var r,n;return(n=(r=this.buildState.get(e.uri.toString()))===null||r===void 0?void 0:r.options)!==null&&n!==void 0?n:{}}}});var Xb,xB=N(()=>{"use strict";hs();QS();el();Ys();Qc();Xb=class{static{o(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new Zp,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=Va(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{vs.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),an(i)}allElements(e,r){let n=an(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){var n;return r?this.symbolByTypeIndex.get(e,r,()=>{var a;return((a=this.symbolIndex.get(e))!==null&&a!==void 0?a:[]).filter(l=>this.astReflection.isSubtype(l.type,r))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r),this.referenceIndex.delete(r)}async updateContent(e,r=br.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=br.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var jb,bB=N(()=>{"use strict";el();tl();Qc();jb=class{static{o(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new gs,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){var r;this.folders=(r=e.workspaceFolders)!==null&&r!==void 0?r:void 0}initialized(e){return this.mutex.write(r=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],r)})}async initializeWorkspace(e,r=br.CancellationToken.None){let n=await this.performStartup(e);await bi(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=this.serviceRegistry.all.flatMap(a=>a.LanguageMetaData.fileExtensions),n=[],i=o(a=>{n.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)},"collector");return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(a=>[a,this.getRootFolder(a)]).map(async a=>this.traverseFolder(...a,r,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return ys.parse(e.uri)}async traverseFolder(e,r,n,i){let a=await this.fileSystemProvider.readDirectory(r);await Promise.all(a.map(async s=>{if(this.includeEntry(e,s,n)){if(s.isDirectory)await this.traverseFolder(e,s.uri,n,i);else if(s.isFile){let l=await this.langiumDocuments.getOrCreateDocument(s.uri);i(l)}}}))}includeEntry(e,r,n){let i=vs.basename(r.uri);if(i.startsWith("."))return!1;if(r.isDirectory)return i!=="node_modules"&&i!=="out";if(r.isFile){let a=vs.extname(r.uri);return n.includes(a)}return!1}}});function r6(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function wB(t){return t&&"modes"in t&&"defaultMode"in t}function TB(t){return!r6(t)&&!wB(t)}var Kb,t6,e0,n6=N(()=>{"use strict";Ff();Kb=class{static{o(this,"DefaultLexerErrorMessageProvider")}buildUnexpectedCharactersMessage(e,r,n,i,a){return x1.buildUnexpectedCharactersMessage(e,r,n,i,a)}buildUnableToPopLexerModeMessage(e){return x1.buildUnableToPopLexerModeMessage(e)}},t6={mode:"full"},e0=class{static{o(this,"DefaultLexer")}constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=TB(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new Zn(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=t6){var n,i,a;let s=this.chevrotainLexer.tokenize(e);return{tokens:s.tokens,errors:s.errors,hidden:(n=s.groups.hidden)!==null&&n!==void 0?n:[],report:(a=(i=this.tokenBuilder).flushLexingReport)===null||a===void 0?void 0:a.call(i,e)}}toTokenTypeDictionary(e){if(TB(e))return e;let r=wB(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};o(r6,"isTokenTypeArray");o(wB,"isIMultiModeLexerDefinition");o(TB,"isTokenTypeDictionary")});function SB(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=tn.create(0,0));let a=xme(t),s=AB(n),l=ije({lines:a,position:i,options:s});return cje({index:0,tokens:l,position:i})}function CB(t,e){let r=AB(e),n=xme(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,l=r.end;return!!s?.exec(i)&&!!l?.exec(a)}function xme(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(TO)}function ije(t){var e,r,n;let i=[],a=t.position.line,s=t.position.character;for(let l=0;l=f.length){if(i.length>0){let m=tn.create(a,s);i.push({type:"break",content:"",range:Gr.create(m,m)})}}else{yme.lastIndex=d;let m=yme.exec(f);if(m){let g=m[0],y=m[1],v=tn.create(a,s+d),x=tn.create(a,s+d+g.length);i.push({type:"tag",content:y,range:Gr.create(v,x)}),d+=g.length,d=EB(f,d)}if(d0&&i[i.length-1].type==="break"?i.slice(0,-1):i}function aje(t,e,r,n){let i=[];if(t.length===0){let a=tn.create(r,n),s=tn.create(r,n+e.length);i.push({type:"text",content:e,range:Gr.create(a,s)})}else{let a=0;for(let l of t){let u=l.index,h=e.substring(a,u);h.length>0&&i.push({type:"text",content:e.substring(a,u),range:Gr.create(tn.create(r,a+n),tn.create(r,u+n))});let f=h.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:Gr.create(tn.create(r,a+f+n),tn.create(r,a+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let p=l[3];i.push({type:"text",content:p,range:Gr.create(tn.create(r,a+f+n),tn.create(r,a+f+p.length+n))})}else i.push({type:"text",content:"",range:Gr.create(tn.create(r,a+f+n),tn.create(r,a+f+n))});a=u+l[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:Gr.create(tn.create(r,a+n),tn.create(r,a+n+s.length))})}return i}function EB(t,e){let r=t.substring(e).match(sje);return r?e+r.index:t.length}function lje(t){let e=t.match(oje);if(e&&typeof e.index=="number")return e.index}function cje(t){var e,r,n,i;let a=tn.create(t.position.line,t.position.character);if(t.tokens.length===0)return new i6([],Gr.create(a,a));let s=[];for(;t.index0){let u=EB(e,a);s=e.substring(u),e=e.substring(0,a)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(s=`\`${s}\``),(i=(n=r.renderLink)===null||n===void 0?void 0:n.call(r,e,s))!==null&&i!==void 0?i:pje(e,s)}}function pje(t,e){try{return ys.parse(t,!0),`[${e}](${t})`}catch{return t}}function vme(t){return t.endsWith(` +`)?` +`:` + +`}var yme,nje,sje,oje,i6,Qb,Zb,a6,_B=N(()=>{"use strict";BP();l1();Qc();o(SB,"parseJSDoc");o(CB,"isJSDoc");o(xme,"getLines");yme=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,nje=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;o(ije,"tokenize");o(aje,"buildInlineTokens");sje=/\S/,oje=/\s*$/;o(EB,"skipWhitespace");o(lje,"lastCharacter");o(cje,"parseJSDocComment");o(uje,"parseJSDocElement");o(hje,"appendEmptyLine");o(bme,"parseJSDocText");o(fje,"parseJSDocInline");o(Tme,"parseJSDocTag");o(wme,"parseJSDocLine");o(AB,"normalizeOptions");o(kB,"normalizeOption");i6=class{static{o(this,"JSDocCommentImpl")}constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=vme(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=vme(r)+i}return r.trim()}},Qb=class{static{o(this,"JSDocTagImpl")}constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} +${r}`),this.inline?`{${e}}`:e}toMarkdown(e){var r,n;return(n=(r=e?.renderTag)===null||r===void 0?void 0:r.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=dje(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} +${r}`),this.inline?`{${i}}`:i}};o(dje,"renderInlineTag");o(pje,"renderLinkDefault");Zb=class{static{o(this,"JSDocTextImpl")}constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` +`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` +`)}return r}},a6=class{static{o(this,"JSDocLineImpl")}constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};o(vme,"fillNewlines")});var Jb,DB=N(()=>{"use strict";hs();_B();Jb=class{static{o(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&CB(r))return SB(r).toMarkdown({renderLink:o((i,a)=>this.documentationLinkRenderer(e,i,a),"renderLink"),renderTag:o(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,r,n){var i;let a=(i=this.findNameInPrecomputedScopes(e,r))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,r);if(a&&a.nameSegment){let s=a.nameSegment.range.start.line+1,l=a.nameSegment.range.start.character+1,u=a.documentUri.with({fragment:`L${s},${l}`});return`[${n}](${u.toString()})`}else return}documentationTagRenderer(e,r){}findNameInPrecomputedScopes(e,r){let i=Va(e).precomputedScopes;if(!i)return;let a=e;do{let l=i.get(a).find(u=>u.name===r);if(l)return l;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var e4,LB=N(()=>{"use strict";ZS();Bl();e4=class{static{o(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var r;return hB(e)?e.$comment:(r=jI(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||r===void 0?void 0:r.text}}});var t4,RB,NB,MB=N(()=>{"use strict";tl();e6();t4=class{static{o(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},RB=class{static{o(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new gs,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new gs;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(jc)}),this.queue.push(r),r.promise}},NB=class{static{o(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new ei.Emitter,this.deferred=new gs,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(jc),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new gs,this.sendMessage(e),this.deferred.promise}}});var r4,IB=N(()=>{"use strict";el();tl();r4=class{static{o(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new br.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=XS();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=br.CancellationToken.None){let i=new gs,a={action:r,deferred:i,cancellationToken:n};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Kc(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var n4,OB=N(()=>{"use strict";FS();Hc();Pl();hs();H1();Bl();n4=class{static{o(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new Qp,this.tokenTypeIdMap=new Qp,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>Object.assign(Object.assign({},r),{message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of Jo(e))r.set(i,{});if(e.$cstNode)for(let i of Dp(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)li(l)?s.push(this.dehydrateAstNode(l,r)):Ta(l)?s.push(this.dehydrateReference(l,r)):s.push(l)}else li(a)?n[i]=this.dehydrateAstNode(a,r):Ta(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return Lx(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),Ol(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):If(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of Jo(e))r.set(a,{});let i;if(e.$cstNode)for(let a of Dp(e.$cstNode)){let s;"fullText"in a?(s=new B1(a.fullText),i=s):"content"in a?s=new Xp:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)li(l)?s.push(this.setParent(this.hydrateAstNode(l,r),n)):Ta(l)?s.push(this.hydrateReference(l,n,i,r)):s.push(l)}else li(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):Ta(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),Ol(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,l=e.endLine,u=e.endColumn,h=e.hidden;return new Yp(n,i,{start:{line:a,character:s},end:{line:l,character:u}},r,h)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of Jo(this.grammar))Fx(r)&&this.grammarElementIdMap.set(r,e++)}}});function wa(t){return{documentation:{CommentProvider:o(e=>new e4(e),"CommentProvider"),DocumentationProvider:o(e=>new Jb(e),"DocumentationProvider")},parser:{AsyncParser:o(e=>new t4(e),"AsyncParser"),GrammarConfig:o(e=>PO(e),"GrammarConfig"),LangiumParser:o(e=>HP(e),"LangiumParser"),CompletionParser:o(e=>VP(e),"CompletionParser"),ValueConverter:o(()=>new Kp,"ValueConverter"),TokenBuilder:o(()=>new th,"TokenBuilder"),Lexer:o(e=>new e0(e),"Lexer"),ParserErrorMessageProvider:o(()=>new F1,"ParserErrorMessageProvider"),LexerErrorMessageProvider:o(()=>new Kb,"LexerErrorMessageProvider")},workspace:{AstNodeLocator:o(()=>new qb,"AstNodeLocator"),AstNodeDescriptionProvider:o(e=>new Ub(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:o(e=>new Hb(e),"ReferenceDescriptionProvider")},references:{Linker:o(e=>new Rb(e),"Linker"),NameProvider:o(()=>new Nb,"NameProvider"),ScopeProvider:o(e=>new Bb(e),"ScopeProvider"),ScopeComputation:o(e=>new Ib(e),"ScopeComputation"),References:o(e=>new Mb(e),"References")},serializer:{Hydrator:o(e=>new n4(e),"Hydrator"),JsonSerializer:o(e=>new Fb(e),"JsonSerializer")},validation:{DocumentValidator:o(e=>new Vb(e),"DocumentValidator"),ValidationRegistry:o(e=>new zb(e),"ValidationRegistry")},shared:o(()=>t.shared,"shared")}}function ka(t){return{ServiceRegistry:o(e=>new $b(e),"ServiceRegistry"),workspace:{LangiumDocuments:o(e=>new Lb(e),"LangiumDocuments"),LangiumDocumentFactory:o(e=>new Db(e),"LangiumDocumentFactory"),DocumentBuilder:o(e=>new Yb(e),"DocumentBuilder"),IndexManager:o(e=>new Xb(e),"IndexManager"),WorkspaceManager:o(e=>new jb(e),"WorkspaceManager"),FileSystemProvider:o(e=>t.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:o(()=>new r4,"WorkspaceLock"),ConfigurationProvider:o(e=>new Wb(e),"ConfigurationProvider")}}}var PB=N(()=>{"use strict";BO();UP();qP();US();WP();aB();sB();oB();lB();uB();ZS();fB();dB();Gb();pB();mB();gB();vB();U1();xB();bB();n6();DB();LB();Ab();MB();IB();OB();o(wa,"createDefaultCoreModule");o(ka,"createDefaultSharedCoreModule")});function Hn(t,e,r,n,i,a,s,l,u){let h=[t,e,r,n,i,a,s,l,u].reduce(s6,{});return Ame(h)}function Cme(t){if(t&&t[Sme])for(let e of Object.values(t))Cme(e);return t}function Ame(t,e){let r=new Proxy({},{deleteProperty:o(()=>!1,"deleteProperty"),set:o(()=>{throw new Error("Cannot set property on injected service container")},"set"),get:o((n,i)=>i===Sme?!0:Eme(n,i,t,e||r),"get"),getOwnPropertyDescriptor:o((n,i)=>(Eme(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:o((n,i)=>i in t,"has"),ownKeys:o(()=>[...Object.getOwnPropertyNames(t)],"ownKeys")});return r}function Eme(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:t[e]});if(t[e]===kme)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=kme;try{t[e]=typeof i=="function"?i(n):Ame(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function s6(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!==void 0){let i=t[r];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?t[r]=s6(i,n):t[r]=n}}return t}var BB,Sme,kme,FB=N(()=>{"use strict";(function(t){t.merge=(e,r)=>s6(s6({},e),r)})(BB||(BB={}));o(Hn,"inject");Sme=Symbol("isProxy");o(Cme,"eagerLoad");o(Ame,"_inject");kme=Symbol();o(Eme,"_resolve");o(s6,"_merge")});var _me=N(()=>{"use strict"});var Dme=N(()=>{"use strict";LB();DB();_B()});var Lme=N(()=>{"use strict"});var Rme=N(()=>{"use strict";BO();Lme()});var $B,t0,o6,zB,Nme=N(()=>{"use strict";Ff();US();n6();$B={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]};(function(t){t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation"})(t0||(t0={}));o6=class extends th{static{o(this,"IndentationAwareTokenBuilder")}constructor(e=$B){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=Object.assign(Object.assign({},$B),e),this.indentTokenType=Pf({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=Pf({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!r6(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:a,whitespaceTokenName:s,ignoreIndentationDelimiters:l}=this.options,u,h,f,d=[];for(let p of n){for(let[m,g]of l)p.name===m?p.PUSH_MODE=t0.IGNORE_INDENTATION:p.name===g&&(p.POP_MODE=!0);p.name===a?u=p:p.name===i?h=p:p.name===s?f=p:d.push(p)}if(!u||!h||!f)throw new Error("Some indentation/whitespace tokens not found!");return l.length>0?{modes:{[t0.REGULAR]:[u,h,...d,f],[t0.IGNORE_INDENTATION]:[...d,f]},defaultMode:t0.REGULAR}:[u,h,f,...d]}flushLexingReport(e){let r=super.flushLexingReport(e);return Object.assign(Object.assign({},r),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,r){return r===0||`\r +`.includes(e[r-1])}matchWhitespace(e,r,n,i){var a;this.whitespaceRegExp.lastIndex=r;let s=this.whitespaceRegExp.exec(e);return{currIndentLevel:(a=s?.[0].length)!==null&&a!==void 0?a:0,prevIndentLevel:this.indentationStack.at(-1),match:s}}createIndentationTokenInstance(e,r,n,i){let a=this.getLineNumber(r,i);return Qu(e,n,i,i+n.length,a,a,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:a,prevIndentLevel:s,match:l}=this.matchWhitespace(e,r,n,i);return a<=s?null:(this.indentationStack.push(a),l)}dedentMatcher(e,r,n,i){var a,s,l,u;if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:h,prevIndentLevel:f,match:d}=this.matchWhitespace(e,r,n,i);if(h>=f)return null;let p=this.indentationStack.lastIndexOf(h);if(p===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${h} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:(s=(a=d?.[0])===null||a===void 0?void 0:a.length)!==null&&s!==void 0?s:0,line:this.getLineNumber(e,r),column:1}),null;let m=this.indentationStack.length-p-1,g=(u=(l=e.substring(0,r).match(/[\r\n]+$/))===null||l===void 0?void 0:l[0].length)!==null&&u!==void 0?u:1;for(let y=0;y1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},zB=class extends e0{static{o(this,"IndentationAwareLexer")}constructor(e){if(super(e),e.parser.TokenBuilder instanceof o6)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=t6){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:a,dedentTokenType:s}=this.indentationTokenBuilder,l=a.tokenTypeIdx,u=s.tokenTypeIdx,h=[],f=n.tokens.length-1;for(let d=0;d=0&&h.push(n.tokens[f]),n.tokens=h,n}}});var Mme=N(()=>{"use strict"});var Ime=N(()=>{"use strict";MB();UP();FS();Nme();qP();Ab();n6();VS();Mme();US();WP()});var Ome=N(()=>{"use strict";aB();sB();oB();cB();lB();uB()});var Pme=N(()=>{"use strict";OB();ZS()});var l6,Ea,GB=N(()=>{"use strict";l6=class{static{o(this,"EmptyFileSystemProvider")}readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},Ea={fileSystemProvider:o(()=>new l6,"fileSystemProvider")}});function yje(){let t=Hn(ka(Ea),gje),e=Hn(wa({shared:t}),mje);return t.ServiceRegistry.register(e),e}function Zc(t){var e;let r=yje(),n=r.serializer.JsonSerializer.deserialize(t);return r.shared.workspace.LangiumDocumentFactory.fromModel(n,ys.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}var mje,gje,Bme=N(()=>{"use strict";PB();FB();Hc();GB();Qc();mje={Grammar:o(()=>{},"Grammar"),LanguageMetaData:o(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},gje={AstReflection:o(()=>new i1,"AstReflection")};o(yje,"createMinimalGrammarServices");o(Zc,"loadGrammarFromJson")});var Xr={};dr(Xr,{AstUtils:()=>GE,BiMap:()=>Qp,Cancellation:()=>br,ContextCache:()=>Zp,CstUtils:()=>RE,DONE_RESULT:()=>za,Deferred:()=>gs,Disposable:()=>Gf,DisposableCache:()=>W1,DocumentCache:()=>KS,EMPTY_STREAM:()=>Rx,ErrorWithLocation:()=>Rp,GrammarUtils:()=>WE,MultiMap:()=>Vl,OperationCancelled:()=>jc,Reduction:()=>vg,RegExpUtils:()=>HE,SimpleCache:()=>Pb,StreamImpl:()=>po,TreeStreamImpl:()=>Gc,URI:()=>ys,UriUtils:()=>vs,WorkspaceCache:()=>Y1,assertUnreachable:()=>Uc,delayNextTick:()=>tB,interruptAndCheck:()=>bi,isOperationCancelled:()=>Kc,loadGrammarFromJson:()=>Zc,setInterruptionPeriod:()=>ome,startCancelableOperation:()=>XS,stream:()=>an});var Fme=N(()=>{"use strict";QS();e6();Lr(Xr,ei);H1();yB();NE();Bme();tl();Ys();Qc();hs();el();Bl();zl();l1()});var $me=N(()=>{"use strict";dB();Gb()});var zme=N(()=>{"use strict";pB();mB();gB();vB();U1();GB();xB();IB();bB()});var Sa={};dr(Sa,{AbstractAstReflection:()=>Ap,AbstractCstNode:()=>kb,AbstractLangiumParser:()=>Eb,AbstractParserErrorMessageProvider:()=>zS,AbstractThreadedAsyncParser:()=>RB,AstUtils:()=>GE,BiMap:()=>Qp,Cancellation:()=>br,CompositeCstNodeImpl:()=>Xp,ContextCache:()=>Zp,CstNodeBuilder:()=>wb,CstUtils:()=>RE,DEFAULT_TOKENIZE_OPTIONS:()=>t6,DONE_RESULT:()=>za,DatatypeSymbol:()=>$S,DefaultAstNodeDescriptionProvider:()=>Ub,DefaultAstNodeLocator:()=>qb,DefaultAsyncParser:()=>t4,DefaultCommentProvider:()=>e4,DefaultConfigurationProvider:()=>Wb,DefaultDocumentBuilder:()=>Yb,DefaultDocumentValidator:()=>Vb,DefaultHydrator:()=>n4,DefaultIndexManager:()=>Xb,DefaultJsonSerializer:()=>Fb,DefaultLangiumDocumentFactory:()=>Db,DefaultLangiumDocuments:()=>Lb,DefaultLexer:()=>e0,DefaultLexerErrorMessageProvider:()=>Kb,DefaultLinker:()=>Rb,DefaultNameProvider:()=>Nb,DefaultReferenceDescriptionProvider:()=>Hb,DefaultReferences:()=>Mb,DefaultScopeComputation:()=>Ib,DefaultScopeProvider:()=>Bb,DefaultServiceRegistry:()=>$b,DefaultTokenBuilder:()=>th,DefaultValueConverter:()=>Kp,DefaultWorkspaceLock:()=>r4,DefaultWorkspaceManager:()=>jb,Deferred:()=>gs,Disposable:()=>Gf,DisposableCache:()=>W1,DocumentCache:()=>KS,DocumentState:()=>Ln,DocumentValidator:()=>rl,EMPTY_SCOPE:()=>rje,EMPTY_STREAM:()=>Rx,EmptyFileSystem:()=>Ea,EmptyFileSystemProvider:()=>l6,ErrorWithLocation:()=>Rp,GrammarAST:()=>zx,GrammarUtils:()=>WE,IndentationAwareLexer:()=>zB,IndentationAwareTokenBuilder:()=>o6,JSDocDocumentationProvider:()=>Jb,LangiumCompletionParser:()=>Cb,LangiumParser:()=>Sb,LangiumParserErrorMessageProvider:()=>F1,LeafCstNodeImpl:()=>Yp,LexingMode:()=>t0,MapScope:()=>Ob,Module:()=>BB,MultiMap:()=>Vl,OperationCancelled:()=>jc,ParserWorker:()=>NB,Reduction:()=>vg,RegExpUtils:()=>HE,RootCstNodeImpl:()=>B1,SimpleCache:()=>Pb,StreamImpl:()=>po,StreamScope:()=>q1,TextDocument:()=>G1,TreeStreamImpl:()=>Gc,URI:()=>ys,UriUtils:()=>vs,ValidationCategory:()=>X1,ValidationRegistry:()=>zb,ValueConverter:()=>Xc,WorkspaceCache:()=>Y1,assertUnreachable:()=>Uc,createCompletionParser:()=>VP,createDefaultCoreModule:()=>wa,createDefaultSharedCoreModule:()=>ka,createGrammarConfig:()=>PO,createLangiumParser:()=>HP,createParser:()=>_b,delayNextTick:()=>tB,diagnosticData:()=>Jp,eagerLoad:()=>Cme,getDiagnosticRange:()=>mme,indentationBuilderDefaultOptions:()=>$B,inject:()=>Hn,interruptAndCheck:()=>bi,isAstNode:()=>li,isAstNodeDescription:()=>qI,isAstNodeWithComment:()=>hB,isCompositeCstNode:()=>Ol,isIMultiModeLexerDefinition:()=>wB,isJSDoc:()=>CB,isLeafCstNode:()=>If,isLinkingError:()=>_p,isNamed:()=>dme,isOperationCancelled:()=>Kc,isReference:()=>Ta,isRootCstNode:()=>Lx,isTokenTypeArray:()=>r6,isTokenTypeDictionary:()=>TB,loadGrammarFromJson:()=>Zc,parseJSDoc:()=>SB,prepareLangiumParser:()=>eme,setInterruptionPeriod:()=>ome,startCancelableOperation:()=>XS,stream:()=>an,toDiagnosticData:()=>gme,toDiagnosticSeverity:()=>JS});var vo=N(()=>{"use strict";PB();FB();fB();_me();Pl();Dme();Rme();Ime();Ome();Pme();Fme();Lr(Sa,Xr);$me();zme();Hc()});function Xme(t){return Ul.isInstance(t,i4)}function jme(t){return Ul.isInstance(t,j1)}function Kme(t){return Ul.isInstance(t,K1)}function Qme(t){return Ul.isInstance(t,Q1)}function Zme(t){return Ul.isInstance(t,a4)}function Jme(t){return Ul.isInstance(t,Z1)}function ege(t){return Ul.isInstance(t,s4)}function tge(t){return Ul.isInstance(t,o4)}function rge(t){return Ul.isInstance(t,l4)}function nge(t){return Ul.isInstance(t,c4)}function ige(t){return Ul.isInstance(t,u4)}var vje,Tt,QB,i4,c6,j1,u6,h6,VB,K1,UB,HB,qB,Q1,WB,a4,f6,YB,Z1,XB,s4,o4,l4,c4,g6,jB,u4,KB,d6,p6,m6,age,Ul,Gme,xje,Vme,bje,Ume,Tje,Hme,wje,qme,kje,Wme,Eje,Yme,Sje,Cje,Aje,_je,Dje,Lje,Rje,Nje,xs,ZB,JB,eF,tF,rF,nF,iF,Mje,Ije,Oje,Pje,Vf,rh,Ha,Bje,qa=N(()=>{"use strict";vo();vo();vo();vo();vje=Object.defineProperty,Tt=o((t,e)=>vje(t,"name",{value:e,configurable:!0}),"__name"),QB="Statement",i4="Architecture";o(Xme,"isArchitecture");Tt(Xme,"isArchitecture");c6="Axis",j1="Branch";o(jme,"isBranch");Tt(jme,"isBranch");u6="Checkout",h6="CherryPicking",VB="ClassDefStatement",K1="Commit";o(Kme,"isCommit");Tt(Kme,"isCommit");UB="Curve",HB="Edge",qB="Entry",Q1="GitGraph";o(Qme,"isGitGraph");Tt(Qme,"isGitGraph");WB="Group",a4="Info";o(Zme,"isInfo");Tt(Zme,"isInfo");f6="Item",YB="Junction",Z1="Merge";o(Jme,"isMerge");Tt(Jme,"isMerge");XB="Option",s4="Packet";o(ege,"isPacket");Tt(ege,"isPacket");o4="PacketBlock";o(tge,"isPacketBlock");Tt(tge,"isPacketBlock");l4="Pie";o(rge,"isPie");Tt(rge,"isPie");c4="PieSection";o(nge,"isPieSection");Tt(nge,"isPieSection");g6="Radar",jB="Service",u4="Treemap";o(ige,"isTreemap");Tt(ige,"isTreemap");KB="TreemapRow",d6="Direction",p6="Leaf",m6="Section",age=class extends Ap{static{o(this,"MermaidAstReflection")}static{Tt(this,"MermaidAstReflection")}getAllTypes(){return[i4,c6,j1,u6,h6,VB,K1,UB,d6,HB,qB,Q1,WB,a4,f6,YB,p6,Z1,XB,s4,o4,l4,c4,g6,m6,jB,QB,u4,KB]}computeIsSubtype(t,e){switch(t){case j1:case u6:case h6:case K1:case Z1:return this.isSubtype(QB,e);case d6:return this.isSubtype(Q1,e);case p6:case m6:return this.isSubtype(f6,e);default:return!1}}getReferenceType(t){let e=`${t.container.$type}:${t.property}`;switch(e){case"Entry:axis":return c6;default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(t){switch(t){case i4:return{name:i4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case c6:return{name:c6,properties:[{name:"label"},{name:"name"}]};case j1:return{name:j1,properties:[{name:"name"},{name:"order"}]};case u6:return{name:u6,properties:[{name:"branch"}]};case h6:return{name:h6,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case VB:return{name:VB,properties:[{name:"className"},{name:"styleText"}]};case K1:return{name:K1,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case UB:return{name:UB,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case HB:return{name:HB,properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case qB:return{name:qB,properties:[{name:"axis"},{name:"value"}]};case Q1:return{name:Q1,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case WB:return{name:WB,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case a4:return{name:a4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case f6:return{name:f6,properties:[{name:"classSelector"},{name:"name"}]};case YB:return{name:YB,properties:[{name:"id"},{name:"in"}]};case Z1:return{name:Z1,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case XB:return{name:XB,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case s4:return{name:s4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case o4:return{name:o4,properties:[{name:"bits"},{name:"end"},{name:"label"},{name:"start"}]};case l4:return{name:l4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case c4:return{name:c4,properties:[{name:"label"},{name:"value"}]};case g6:return{name:g6,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case jB:return{name:jB,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case u4:return{name:u4,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"},{name:"TreemapRows",defaultValue:[]}]};case KB:return{name:KB,properties:[{name:"indent"},{name:"item"}]};case d6:return{name:d6,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};case p6:return{name:p6,properties:[{name:"classSelector"},{name:"name"},{name:"value"}]};case m6:return{name:m6,properties:[{name:"classSelector"},{name:"name"}]};default:return{name:t,properties:[]}}}},Ul=new age,xje=Tt(()=>Gme??(Gme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"InfoGrammar"),bje=Tt(()=>Vme??(Vme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),Tje=Tt(()=>Ume??(Ume=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"FLOAT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/-?(0|[1-9][0-9]*)(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER_PIE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@2"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@3"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@11"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@12"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PieGrammar"),wje=Tt(()=>Hme??(Hme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"ArchitectureGrammar"),kje=Tt(()=>qme??(qme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),Eje=Tt(()=>Wme??(Wme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Radar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"types":[],"usedGrammars":[]}`)),"RadarGrammar"),Sje=Tt(()=>Yme??(Yme=Zc(`{"$type":"Grammar","isDeclared":true,"name":"Treemap","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","}},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@14"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammar"),Cje={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Aje={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},_je={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Dje={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Lje={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Rje={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Nje={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},xs={AstReflection:Tt(()=>new age,"AstReflection")},ZB={Grammar:Tt(()=>xje(),"Grammar"),LanguageMetaData:Tt(()=>Cje,"LanguageMetaData"),parser:{}},JB={Grammar:Tt(()=>bje(),"Grammar"),LanguageMetaData:Tt(()=>Aje,"LanguageMetaData"),parser:{}},eF={Grammar:Tt(()=>Tje(),"Grammar"),LanguageMetaData:Tt(()=>_je,"LanguageMetaData"),parser:{}},tF={Grammar:Tt(()=>wje(),"Grammar"),LanguageMetaData:Tt(()=>Dje,"LanguageMetaData"),parser:{}},rF={Grammar:Tt(()=>kje(),"Grammar"),LanguageMetaData:Tt(()=>Lje,"LanguageMetaData"),parser:{}},nF={Grammar:Tt(()=>Eje(),"Grammar"),LanguageMetaData:Tt(()=>Rje,"LanguageMetaData"),parser:{}},iF={Grammar:Tt(()=>Sje(),"Grammar"),LanguageMetaData:Tt(()=>Nje,"LanguageMetaData"),parser:{}},Mje=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,Ije=/accTitle[\t ]*:([^\n\r]*)/,Oje=/title([\t ][^\n\r]*|)/,Pje={ACC_DESCR:Mje,ACC_TITLE:Ije,TITLE:Oje},Vf=class extends Kp{static{o(this,"AbstractMermaidValueConverter")}static{Tt(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=Pje[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` +`)}}},rh=class extends Vf{static{o(this,"CommonValueConverter")}static{Tt(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},Ha=class extends th{static{o(this,"AbstractMermaidTokenBuilder")}static{Tt(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},Bje=class extends Ha{static{o(this,"CommonTokenBuilder")}static{Tt(this,"CommonTokenBuilder")}}});function v6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),rF,y6);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var Fje,y6,aF=N(()=>{"use strict";qa();vo();Fje=class extends Ha{static{o(this,"GitGraphTokenBuilder")}static{Tt(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},y6={parser:{TokenBuilder:Tt(()=>new Fje,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(v6,"createGitGraphServices");Tt(v6,"createGitGraphServices")});function b6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),ZB,x6);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var $je,x6,sF=N(()=>{"use strict";qa();vo();$je=class extends Ha{static{o(this,"InfoTokenBuilder")}static{Tt(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},x6={parser:{TokenBuilder:Tt(()=>new $je,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(b6,"createInfoServices");Tt(b6,"createInfoServices")});function w6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),JB,T6);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var zje,T6,oF=N(()=>{"use strict";qa();vo();zje=class extends Ha{static{o(this,"PacketTokenBuilder")}static{Tt(this,"PacketTokenBuilder")}constructor(){super(["packet"])}},T6={parser:{TokenBuilder:Tt(()=>new zje,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(w6,"createPacketServices");Tt(w6,"createPacketServices")});function E6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),eF,k6);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var Gje,Vje,k6,lF=N(()=>{"use strict";qa();vo();Gje=class extends Ha{static{o(this,"PieTokenBuilder")}static{Tt(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},Vje=class extends Vf{static{o(this,"PieValueConverter")}static{Tt(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},k6={parser:{TokenBuilder:Tt(()=>new Gje,"TokenBuilder"),ValueConverter:Tt(()=>new Vje,"ValueConverter")}};o(E6,"createPieServices");Tt(E6,"createPieServices")});function C6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),tF,S6);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var Uje,Hje,S6,cF=N(()=>{"use strict";qa();vo();Uje=class extends Ha{static{o(this,"ArchitectureTokenBuilder")}static{Tt(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},Hje=class extends Vf{static{o(this,"ArchitectureValueConverter")}static{Tt(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},S6={parser:{TokenBuilder:Tt(()=>new Uje,"TokenBuilder"),ValueConverter:Tt(()=>new Hje,"ValueConverter")}};o(C6,"createArchitectureServices");Tt(C6,"createArchitectureServices")});function _6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),nF,A6);return e.ServiceRegistry.register(r),{shared:e,Radar:r}}var qje,A6,uF=N(()=>{"use strict";qa();vo();qje=class extends Ha{static{o(this,"RadarTokenBuilder")}static{Tt(this,"RadarTokenBuilder")}constructor(){super(["radar-beta"])}},A6={parser:{TokenBuilder:Tt(()=>new qje,"TokenBuilder"),ValueConverter:Tt(()=>new rh,"ValueConverter")}};o(_6,"createRadarServices");Tt(_6,"createRadarServices")});function sge(t){let e=t.validation.TreemapValidator,r=t.validation.ValidationRegistry;if(r){let n={Treemap:e.checkSingleRoot.bind(e)};r.register(n,e)}}function L6(t=Ea){let e=Hn(ka(t),xs),r=Hn(wa({shared:e}),iF,D6);return e.ServiceRegistry.register(r),sge(r),{shared:e,Treemap:r}}var Wje,Yje,Xje,jje,D6,hF=N(()=>{"use strict";qa();vo();Wje=class extends Ha{static{o(this,"TreemapTokenBuilder")}static{Tt(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},Yje=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,Xje=class extends Vf{static{o(this,"TreemapValueConverter")}static{Tt(this,"TreemapValueConverter")}runCustomConverter(t,e,r){if(t.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(t.name==="SEPARATOR")return e.substring(1,e.length-1);if(t.name==="STRING2")return e.substring(1,e.length-1);if(t.name==="INDENTATION")return e.length;if(t.name==="ClassDef"){if(typeof e!="string")return e;let n=Yje.exec(e);if(n)return{$type:"ClassDefStatement",className:n[1],styleText:n[2]||void 0}}}};o(sge,"registerValidationChecks");Tt(sge,"registerValidationChecks");jje=class{static{o(this,"TreemapValidator")}static{Tt(this,"TreemapValidator")}checkSingleRoot(t,e){let r;for(let n of t.TreemapRows)n.item&&(r===void 0&&n.indent===void 0?r=0:n.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}):r!==void 0&&r>=parseInt(n.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}))}},D6={parser:{TokenBuilder:Tt(()=>new Wje,"TokenBuilder"),ValueConverter:Tt(()=>new Xje,"ValueConverter")},validation:{TreemapValidator:Tt(()=>new jje,"TreemapValidator")}};o(L6,"createTreemapServices");Tt(L6,"createTreemapServices")});var oge={};dr(oge,{InfoModule:()=>x6,createInfoServices:()=>b6});var lge=N(()=>{"use strict";sF();qa()});var cge={};dr(cge,{PacketModule:()=>T6,createPacketServices:()=>w6});var uge=N(()=>{"use strict";oF();qa()});var hge={};dr(hge,{PieModule:()=>k6,createPieServices:()=>E6});var fge=N(()=>{"use strict";lF();qa()});var dge={};dr(dge,{ArchitectureModule:()=>S6,createArchitectureServices:()=>C6});var pge=N(()=>{"use strict";cF();qa()});var mge={};dr(mge,{GitGraphModule:()=>y6,createGitGraphServices:()=>v6});var gge=N(()=>{"use strict";aF();qa()});var yge={};dr(yge,{RadarModule:()=>A6,createRadarServices:()=>_6});var vge=N(()=>{"use strict";uF();qa()});var xge={};dr(xge,{TreemapModule:()=>D6,createTreemapServices:()=>L6});var bge=N(()=>{"use strict";hF();qa()});async function bs(t,e){let r=Kje[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);nh[t]||await r();let i=nh[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new Qje(i);return i.value}var nh,Kje,Qje,Uf=N(()=>{"use strict";aF();sF();oF();lF();cF();uF();hF();qa();nh={},Kje={info:Tt(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(lge(),oge)),e=t().Info.parser.LangiumParser;nh.info=e},"info"),packet:Tt(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(uge(),cge)),e=t().Packet.parser.LangiumParser;nh.packet=e},"packet"),pie:Tt(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(fge(),hge)),e=t().Pie.parser.LangiumParser;nh.pie=e},"pie"),architecture:Tt(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(pge(),dge)),e=t().Architecture.parser.LangiumParser;nh.architecture=e},"architecture"),gitGraph:Tt(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(gge(),mge)),e=t().GitGraph.parser.LangiumParser;nh.gitGraph=e},"gitGraph"),radar:Tt(async()=>{let{createRadarServices:t}=await Promise.resolve().then(()=>(vge(),yge)),e=t().Radar.parser.LangiumParser;nh.radar=e},"radar"),treemap:Tt(async()=>{let{createTreemapServices:t}=await Promise.resolve().then(()=>(bge(),xge)),e=t().Treemap.parser.LangiumParser;nh.treemap=e},"treemap")};o(bs,"parse");Tt(bs,"parse");Qje=class extends Error{static{o(this,"MermaidParseError")}constructor(t){let e=t.lexerErrors.map(n=>n.message).join(` +`),r=t.parserErrors.map(n=>n.message).join(` +`);super(`Parsing failed: ${e} ${r}`),this.result=t}static{Tt(this,"MermaidParseError")}}});function nl(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var r0=N(()=>{"use strict";o(nl,"populateCommonDb")});var rn,R6=N(()=>{"use strict";rn={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4}});var J1,fF=N(()=>{"use strict";J1=class{constructor(e){this.init=e;this.records=this.init()}static{o(this,"ImperativeState")}reset(){this.records=this.init()}}});function dF(){return VL({length:7})}function Jje(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function Tge(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function kge(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in Dt.records.branches)Dt.records.branches.get(i)===e.id&&n.push(i);if(X.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=Dt.records.commits.get(e.parents[0]);Tge(t,e,i),e.parents[1]&&t.push(Dt.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=Dt.records.commits.get(e.parents[0]);Tge(t,e,i)}}t=Jje(t,i=>i.id),kge(t)}var Zje,n0,Dt,eKe,tKe,rKe,nKe,iKe,aKe,sKe,wge,oKe,lKe,cKe,uKe,hKe,Ege,fKe,dKe,pKe,N6,pF=N(()=>{"use strict";pt();tr();qn();gr();ci();R6();fF();La();Zje=ur.gitGraph,n0=o(()=>Vn({...Zje,...Qt().gitGraph}),"getConfig"),Dt=new J1(()=>{let t=n0(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});o(dF,"getID");o(Jje,"uniqBy");eKe=o(function(t){Dt.records.direction=t},"setDirection"),tKe=o(function(t){X.debug("options str",t),t=t?.trim(),t=t||"{}";try{Dt.records.options=JSON.parse(t)}catch(e){X.error("error while parsing gitGraph options",e.message)}},"setOptions"),rKe=o(function(){return Dt.records.options},"getOptions"),nKe=o(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;X.info("commit",e,r,n,i),X.debug("Entering commit:",e,r,n,i);let a=n0();r=tt.sanitizeText(r,a),e=tt.sanitizeText(e,a),i=i?.map(l=>tt.sanitizeText(l,a));let s={id:r||Dt.records.seq+"-"+dF(),message:e,seq:Dt.records.seq++,type:n??rn.NORMAL,tags:i??[],parents:Dt.records.head==null?[]:[Dt.records.head.id],branch:Dt.records.currBranch};Dt.records.head=s,X.info("main branch",a.mainBranchName),Dt.records.commits.has(s.id)&&X.warn(`Commit ID ${s.id} already exists`),Dt.records.commits.set(s.id,s),Dt.records.branches.set(Dt.records.currBranch,s.id),X.debug("in pushCommit "+s.id)},"commit"),iKe=o(function(t){let e=t.name,r=t.order;if(e=tt.sanitizeText(e,n0()),Dt.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);Dt.records.branches.set(e,Dt.records.head!=null?Dt.records.head.id:null),Dt.records.branchConfig.set(e,{name:e,order:r}),wge(e),X.debug("in createBranch")},"branch"),aKe=o(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=n0();e=tt.sanitizeText(e,a),r&&(r=tt.sanitizeText(r,a));let s=Dt.records.branches.get(Dt.records.currBranch),l=Dt.records.branches.get(e),u=s?Dt.records.commits.get(s):void 0,h=l?Dt.records.commits.get(l):void 0;if(u&&h&&u.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(Dt.records.currBranch===e){let p=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(u===void 0||!u){let p=new Error(`Incorrect usage of "merge". Current branch (${Dt.records.currBranch})has no commits`);throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},p}if(!Dt.records.branches.has(e)){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},p}if(h===void 0||!h){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},p}if(u===h){let p=new Error('Incorrect usage of "merge". Both branches have same head');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(r&&Dt.records.commits.has(r)){let p=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom id");throw p.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},p}let f=l||"",d={id:r||`${Dt.records.seq}-${dF()}`,message:`merged branch ${e} into ${Dt.records.currBranch}`,seq:Dt.records.seq++,parents:Dt.records.head==null?[]:[Dt.records.head.id,f],branch:Dt.records.currBranch,type:rn.MERGE,customType:n,customId:!!r,tags:i??[]};Dt.records.head=d,Dt.records.commits.set(d.id,d),Dt.records.branches.set(Dt.records.currBranch,d.id),X.debug(Dt.records.branches),X.debug("in mergeBranch")},"merge"),sKe=o(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;X.debug("Entering cherryPick:",e,r,n);let a=n0();if(e=tt.sanitizeText(e,a),r=tt.sanitizeText(r,a),n=n?.map(u=>tt.sanitizeText(u,a)),i=tt.sanitizeText(i,a),!e||!Dt.records.commits.has(e)){let u=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw u.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},u}let s=Dt.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let l=s.branch;if(s.type===rn.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!Dt.records.commits.has(r)){if(l===Dt.records.currBranch){let d=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let u=Dt.records.branches.get(Dt.records.currBranch);if(u===void 0||!u){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Dt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let h=Dt.records.commits.get(u);if(h===void 0||!h){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${Dt.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let f={id:Dt.records.seq+"-"+dF(),message:`cherry-picked ${s?.message} into ${Dt.records.currBranch}`,seq:Dt.records.seq++,parents:Dt.records.head==null?[]:[Dt.records.head.id,s.id],branch:Dt.records.currBranch,type:rn.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===rn.MERGE?`|parent:${i}`:""}`]};Dt.records.head=f,Dt.records.commits.set(f.id,f),Dt.records.branches.set(Dt.records.currBranch,f.id),X.debug(Dt.records.branches),X.debug("in cherryPick")}},"cherryPick"),wge=o(function(t){if(t=tt.sanitizeText(t,n0()),Dt.records.branches.has(t)){Dt.records.currBranch=t;let e=Dt.records.branches.get(Dt.records.currBranch);e===void 0||!e?Dt.records.head=null:Dt.records.head=Dt.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");o(Tge,"upsert");o(kge,"prettyPrintCommitHistory");oKe=o(function(){X.debug(Dt.records.commits);let t=Ege()[0];kge([t])},"prettyPrint"),lKe=o(function(){Dt.reset(),Sr()},"clear"),cKe=o(function(){return[...Dt.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),uKe=o(function(){return Dt.records.branches},"getBranches"),hKe=o(function(){return Dt.records.commits},"getCommits"),Ege=o(function(){let t=[...Dt.records.commits.values()];return t.forEach(function(e){X.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),fKe=o(function(){return Dt.records.currBranch},"getCurrentBranch"),dKe=o(function(){return Dt.records.direction},"getDirection"),pKe=o(function(){return Dt.records.head},"getHead"),N6={commitType:rn,getConfig:n0,setDirection:eKe,setOptions:tKe,getOptions:rKe,commit:nKe,branch:iKe,merge:aKe,cherryPick:sKe,checkout:wge,prettyPrint:oKe,clear:lKe,getBranchesAsObjArray:cKe,getBranches:uKe,getCommits:hKe,getCommitsArray:Ege,getCurrentBranch:fKe,getDirection:dKe,getHead:pKe,setAccTitle:Rr,getAccTitle:Mr,getAccDescription:Or,setAccDescription:Ir,setDiagramTitle:$r,getDiagramTitle:Pr}});var mKe,gKe,yKe,vKe,xKe,bKe,TKe,Sge,Cge=N(()=>{"use strict";Uf();pt();r0();pF();R6();mKe=o((t,e)=>{nl(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)gKe(r,e)},"populate"),gKe=o((t,e)=>{let n={Commit:o(i=>e.commit(yKe(i)),"Commit"),Branch:o(i=>e.branch(vKe(i)),"Branch"),Merge:o(i=>e.merge(xKe(i)),"Merge"),Checkout:o(i=>e.checkout(bKe(i)),"Checkout"),CherryPicking:o(i=>e.cherryPick(TKe(i)),"CherryPicking")}[t.$type];n?n(t):X.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),yKe=o(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?rn[t.type]:rn.NORMAL,tags:t.tags??void 0}),"parseCommit"),vKe=o(t=>({name:t.name,order:t.order??0}),"parseBranch"),xKe=o(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?rn[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),bKe=o(t=>t.branch,"parseCheckout"),TKe=o(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),Sge={parse:o(async t=>{let e=await bs("gitGraph",t);X.debug(e),mKe(e,N6)},"parse")}});var wKe,il,qf,Wf,Jc,ih,i0,Ks,Qs,M6,h4,I6,Hf,Vr,kKe,_ge,Dge,EKe,SKe,CKe,AKe,_Ke,DKe,LKe,RKe,NKe,MKe,IKe,OKe,Age,PKe,f4,BKe,FKe,$Ke,zKe,GKe,Lge,Rge=N(()=>{"use strict";yr();Xt();pt();tr();R6();wKe=ge(),il=wKe?.gitGraph,qf=10,Wf=40,Jc=4,ih=2,i0=8,Ks=new Map,Qs=new Map,M6=30,h4=new Map,I6=[],Hf=0,Vr="LR",kKe=o(()=>{Ks.clear(),Qs.clear(),h4.clear(),Hf=0,I6=[],Vr="LR"},"clear"),_ge=o(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),Dge=o(t=>{let e,r,n;return Vr==="BT"?(r=o((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=o((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=Vr==="TB"||Vr=="BT"?Qs.get(i)?.y:Qs.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),EKe=o(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Qs.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),SKe=o((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let l=e.get(s);if(!l)throw new Error(`Commit not found for key ${s}`);l.parents.length?(n=AKe(l),i=Math.max(n,i)):a.push(l),_Ke(l,n)}),n=i,a.forEach(s=>{DKe(s,n,r)}),t.forEach(s=>{let l=e.get(s);if(l?.parents.length){let u=EKe(l.parents);n=Qs.get(u).y-Wf,n<=i&&(i=n);let h=Ks.get(l.branch).pos,f=n-qf;Qs.set(l.id,{x:h,y:f})}})},"setParallelBTPos"),CKe=o(t=>{let e=Dge(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Qs.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),AKe=o(t=>CKe(t)+Wf,"calculateCommitPosition"),_Ke=o((t,e)=>{let r=Ks.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+qf;return Qs.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),DKe=o((t,e,r)=>{let n=Ks.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Qs.set(t.id,{x:a,y:i})},"setRootPosition"),LKe=o((t,e,r,n,i,a)=>{if(a===rn.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%i0} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%i0} ${n}-inner`);else if(a===rn.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===rn.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%i0}`),a===rn.MERGE){let l=t.append("circle");l.attr("cx",r.x),l.attr("cy",r.y),l.attr("r",6),l.attr("class",`commit ${n} ${e.id} commit${i%i0}`)}a===rn.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%i0}`)}},"drawCommitBullet"),RKe=o((t,e,r,n)=>{if(e.type!==rn.CHERRY_PICK&&(e.customId&&e.type===rn.MERGE||e.type!==rn.MERGE)&&il?.showCommitLabel){let i=t.append("g"),a=i.insert("rect").attr("class","commit-label-bkg"),s=i.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),l=s.node()?.getBBox();if(l&&(a.attr("x",r.posWithOffset-l.width/2-ih).attr("y",r.y+13.5).attr("width",l.width+2*ih).attr("height",l.height+2*ih),Vr==="TB"||Vr==="BT"?(a.attr("x",r.x-(l.width+4*Jc+5)).attr("y",r.y-12),s.attr("x",r.x-(l.width+4*Jc)).attr("y",r.y+l.height-12)):s.attr("x",r.posWithOffset-l.width/2),il.rotateCommitLabel))if(Vr==="TB"||Vr==="BT")s.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),a.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let u=-7.5-(l.width+10)/25*9.5,h=10+l.width/25*8.5;i.attr("transform","translate("+u+", "+h+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),NKe=o((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,l=[];for(let u of e.tags.reverse()){let h=t.insert("polygon"),f=t.append("circle"),d=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(u),p=d.node()?.getBBox();if(!p)throw new Error("Tag bbox not found");a=Math.max(a,p.width),s=Math.max(s,p.height),d.attr("x",r.posWithOffset-p.width/2),l.push({tag:d,hole:f,rect:h,yOffset:i}),i+=20}for(let{tag:u,hole:h,rect:f,yOffset:d}of l){let p=s/2,m=r.y-19.2-d;if(f.attr("class","tag-label-bkg").attr("points",` + ${n-a/2-Jc/2},${m+ih} + ${n-a/2-Jc/2},${m-ih} + ${r.posWithOffset-a/2-Jc},${m-p-ih} + ${r.posWithOffset+a/2+Jc},${m-p-ih} + ${r.posWithOffset+a/2+Jc},${m+p+ih} + ${r.posWithOffset-a/2-Jc},${m+p+ih}`),h.attr("cy",m).attr("cx",n-a/2+Jc/2).attr("r",1.5).attr("class","tag-hole"),Vr==="TB"||Vr==="BT"){let g=n+d;f.attr("class","tag-label-bkg").attr("points",` + ${r.x},${g+2} + ${r.x},${g-2} + ${r.x+qf},${g-p-2} + ${r.x+qf+a+4},${g-p-2} + ${r.x+qf+a+4},${g+p+2} + ${r.x+qf},${g+p+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),h.attr("cx",r.x+Jc/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),MKe=o(t=>{switch(t.customType??t.type){case rn.NORMAL:return"commit-normal";case rn.REVERSE:return"commit-reverse";case rn.HIGHLIGHT:return"commit-highlight";case rn.MERGE:return"commit-merge";case rn.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),IKe=o((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=Dge(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+Wf:e==="BT"?(n.get(t.id)??i).y-Wf:s.x+Wf}}else return e==="TB"?M6:e==="BT"?(n.get(t.id)??i).y-Wf:0;return 0},"calculatePosition"),OKe=o((t,e,r)=>{let n=Vr==="BT"&&r?e:e+qf,i=Vr==="TB"||Vr==="BT"?n:Ks.get(t.branch)?.pos,a=Vr==="TB"||Vr==="BT"?Ks.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),Age=o((t,e,r)=>{if(!il)throw new Error("GitGraph config not found");let n=t.append("g").attr("class","commit-bullets"),i=t.append("g").attr("class","commit-labels"),a=Vr==="TB"||Vr==="BT"?M6:0,s=[...e.keys()],l=il?.parallelCommits??!1,u=o((f,d)=>{let p=e.get(f)?.seq,m=e.get(d)?.seq;return p!==void 0&&m!==void 0?p-m:0},"sortKeys"),h=s.sort(u);Vr==="BT"&&(l&&SKe(h,e,a),h=h.reverse()),h.forEach(f=>{let d=e.get(f);if(!d)throw new Error(`Commit not found for key ${f}`);l&&(a=IKe(d,Vr,a,Qs));let p=OKe(d,a,l);if(r){let m=MKe(d),g=d.customType??d.type,y=Ks.get(d.branch)?.index??0;LKe(n,d,p,m,y,g),RKe(i,d,p,a),NKe(i,d,p,a)}Vr==="TB"||Vr==="BT"?Qs.set(d.id,{x:p.x,y:p.posWithOffset}):Qs.set(d.id,{x:p.posWithOffset,y:p.y}),a=Vr==="BT"&&l?a+Wf:a+Wf+qf,a>Hf&&(Hf=a)})},"drawCommits"),PKe=o((t,e,r,n,i)=>{let s=(Vr==="TB"||Vr==="BT"?r.xh.branch===s,"isOnBranchToGetCurve"),u=o(h=>h.seq>t.seq&&h.sequ(h)&&l(h))},"shouldRerouteArrow"),f4=o((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(I6.every(s=>Math.abs(s-n)>=10))return I6.push(n),n;let a=Math.abs(t-e);return f4(t,e-a/5,r+1)},"findLane"),BKe=o((t,e,r,n)=>{let i=Qs.get(e.id),a=Qs.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=PKe(e,r,i,a,n),l="",u="",h=0,f=0,d=Ks.get(r.branch)?.index;r.type===rn.MERGE&&e.id!==r.parents[0]&&(d=Ks.get(e.branch)?.index);let p;if(s){l="A 10 10, 0, 0, 0,",u="A 10 10, 0, 0, 1,",h=10,f=10;let m=i.ya.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===rn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y-h} ${u} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${l} ${a.x} ${i.y+f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):Vr==="BT"?(i.xa.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===rn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${l} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===rn.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${u} ${i.x+f} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(p===void 0)throw new Error("Line definition not found");t.append("path").attr("d",p).attr("class","arrow arrow"+d%i0)},"drawArrow"),FKe=o((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{BKe(r,e.get(a),i,e)})})},"drawArrows"),$Ke=o((t,e)=>{let r=t.append("g");e.forEach((n,i)=>{let a=i%i0,s=Ks.get(n.name)?.pos;if(s===void 0)throw new Error(`Position not found for branch ${n.name}`);let l=r.append("line");l.attr("x1",0),l.attr("y1",s),l.attr("x2",Hf),l.attr("y2",s),l.attr("class","branch branch"+a),Vr==="TB"?(l.attr("y1",M6),l.attr("x1",s),l.attr("y2",Hf),l.attr("x2",s)):Vr==="BT"&&(l.attr("y1",Hf),l.attr("x1",s),l.attr("y2",M6),l.attr("x2",s)),I6.push(s);let u=n.name,h=_ge(u),f=r.insert("rect"),p=r.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+a);p.node().appendChild(h);let m=h.getBBox();f.attr("class","branchLabelBkg label"+a).attr("rx",4).attr("ry",4).attr("x",-m.width-4-(il?.rotateCommitLabel===!0?30:0)).attr("y",-m.height/2+8).attr("width",m.width+18).attr("height",m.height+4),p.attr("transform","translate("+(-m.width-14-(il?.rotateCommitLabel===!0?30:0))+", "+(s-m.height/2-1)+")"),Vr==="TB"?(f.attr("x",s-m.width/2-10).attr("y",0),p.attr("transform","translate("+(s-m.width/2-5)+", 0)")):Vr==="BT"?(f.attr("x",s-m.width/2-10).attr("y",Hf),p.attr("transform","translate("+(s-m.width/2-5)+", "+Hf+")")):f.attr("transform","translate(-19, "+(s-m.height/2)+")")})},"drawBranches"),zKe=o(function(t,e,r,n,i){return Ks.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(Vr==="TB"||Vr==="BT"?n.width/2:0),e},"setBranchPosition"),GKe=o(function(t,e,r,n){if(kKe(),X.debug("in gitgraph renderer",t+` +`,"id:",e,r),!il)throw new Error("GitGraph config not found");let i=il.rotateCommitLabel??!1,a=n.db;h4=a.getCommits();let s=a.getBranchesAsObjArray();Vr=a.getDirection();let l=qe(`[id="${e}"]`),u=0;s.forEach((h,f)=>{let d=_ge(h.name),p=l.append("g"),m=p.insert("g").attr("class","branchLabel"),g=m.insert("g").attr("class","label branch-label");g.node()?.appendChild(d);let y=d.getBBox();u=zKe(h.name,u,f,y,i),g.remove(),m.remove(),p.remove()}),Age(l,h4,!1),il.showBranches&&$Ke(l,s),FKe(l,h4),Age(l,h4,!0),qt.insertTitle(l,"gitTitleText",il.titleTopMargin??0,a.getDiagramTitle()),FA(void 0,l,il.diagramPadding,il.useMaxWidth)},"draw"),Lge={draw:GKe}});var VKe,Nge,Mge=N(()=>{"use strict";VKe=o(t=>` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0,1,2,3,4,5,6,7].map(e=>` + .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } + .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } + .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } + .label${e} { fill: ${t["git"+e]}; } + .arrow${e} { stroke: ${t["git"+e]}; } + `).join(` +`)} + + .branch { + stroke-width: 1; + stroke: ${t.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} + .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} + .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } + .tag-hole { fill: ${t.textColor}; } + + .commit-merge { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + .commit-reverse { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } +`,"getStyles"),Nge=VKe});var Ige={};dr(Ige,{diagram:()=>UKe});var UKe,Oge=N(()=>{"use strict";Cge();pF();Rge();Mge();UKe={parser:Sge,db:N6,renderer:Lge,styles:Nge}});var mF,Fge,$ge=N(()=>{"use strict";mF=(function(){var t=o(function(D,_,O,M){for(O=O||{},M=D.length;M--;O[D[M]]=_);return O},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],l=[1,31],u=[1,32],h=[1,33],f=[1,34],d=[1,9],p=[1,10],m=[1,11],g=[1,12],y=[1,13],v=[1,14],x=[1,15],b=[1,16],T=[1,19],S=[1,20],w=[1,21],k=[1,22],A=[1,23],C=[1,25],R=[1,35],I={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:o(function(_,O,M,P,B,F,G){var $=F.length-1;switch(B){case 1:return F[$-1];case 2:this.$=[];break;case 3:F[$-1].push(F[$]),this.$=F[$-1];break;case 4:case 5:this.$=F[$];break;case 6:case 7:this.$=[];break;case 8:P.setWeekday("monday");break;case 9:P.setWeekday("tuesday");break;case 10:P.setWeekday("wednesday");break;case 11:P.setWeekday("thursday");break;case 12:P.setWeekday("friday");break;case 13:P.setWeekday("saturday");break;case 14:P.setWeekday("sunday");break;case 15:P.setWeekend("friday");break;case 16:P.setWeekend("saturday");break;case 17:P.setDateFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 18:P.enableInclusiveEndDates(),this.$=F[$].substr(18);break;case 19:P.TopAxis(),this.$=F[$].substr(8);break;case 20:P.setAxisFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 21:P.setTickInterval(F[$].substr(13)),this.$=F[$].substr(13);break;case 22:P.setExcludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 23:P.setIncludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 24:P.setTodayMarker(F[$].substr(12)),this.$=F[$].substr(12);break;case 27:P.setDiagramTitle(F[$].substr(6)),this.$=F[$].substr(6);break;case 28:this.$=F[$].trim(),P.setAccTitle(this.$);break;case 29:case 30:this.$=F[$].trim(),P.setAccDescription(this.$);break;case 31:P.addSection(F[$].substr(8)),this.$=F[$].substr(8);break;case 33:P.addTask(F[$-1],F[$]),this.$="task";break;case 34:this.$=F[$-1],P.setClickEvent(F[$-1],F[$],null);break;case 35:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],F[$]);break;case 36:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],null),P.setLink(F[$-2],F[$]);break;case 37:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-2],F[$-1]),P.setLink(F[$-3],F[$]);break;case 38:this.$=F[$-2],P.setClickEvent(F[$-2],F[$],null),P.setLink(F[$-2],F[$-1]);break;case 39:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-1],F[$]),P.setLink(F[$-3],F[$-2]);break;case 40:this.$=F[$-1],P.setLink(F[$-1],F[$]);break;case 41:case 47:this.$=F[$-1]+" "+F[$];break;case 42:case 43:case 45:this.$=F[$-2]+" "+F[$-1]+" "+F[$];break;case 44:case 46:this.$=F[$-3]+" "+F[$-2]+" "+F[$-1]+" "+F[$];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:S,33:w,35:k,36:A,37:24,38:C,40:R},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:S,33:w,35:k,36:A,37:24,38:C,40:R},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:o(function(_,O){if(O.recoverable)this.trace(_);else{var M=new Error(_);throw M.hash=O,M}},"parseError"),parse:o(function(_){var O=this,M=[0],P=[],B=[null],F=[],G=this.table,$="",U=0,j=0,te=0,Y=2,oe=1,J=F.slice.call(arguments,1),ue=Object.create(this.lexer),re={yy:{}};for(var ee in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ee)&&(re.yy[ee]=this.yy[ee]);ue.setInput(_,re.yy),re.yy.lexer=ue,re.yy.parser=this,typeof ue.yylloc>"u"&&(ue.yylloc={});var Z=ue.yylloc;F.push(Z);var K=ue.options&&ue.options.ranges;typeof re.yy.parseError=="function"?this.parseError=re.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ae(Ce){M.length=M.length-2*Ce,B.length=B.length-Ce,F.length=F.length-Ce}o(ae,"popStack");function Q(){var Ce;return Ce=P.pop()||ue.lex()||oe,typeof Ce!="number"&&(Ce instanceof Array&&(P=Ce,Ce=P.pop()),Ce=O.symbols_[Ce]||Ce),Ce}o(Q,"lex");for(var de,ne,Te,q,Ve,pe,Be={},Ye,He,Le,Ie;;){if(Te=M[M.length-1],this.defaultActions[Te]?q=this.defaultActions[Te]:((de===null||typeof de>"u")&&(de=Q()),q=G[Te]&&G[Te][de]),typeof q>"u"||!q.length||!q[0]){var Ne="";Ie=[];for(Ye in G[Te])this.terminals_[Ye]&&Ye>Y&&Ie.push("'"+this.terminals_[Ye]+"'");ue.showPosition?Ne="Parse error on line "+(U+1)+`: +`+ue.showPosition()+` +Expecting `+Ie.join(", ")+", got '"+(this.terminals_[de]||de)+"'":Ne="Parse error on line "+(U+1)+": Unexpected "+(de==oe?"end of input":"'"+(this.terminals_[de]||de)+"'"),this.parseError(Ne,{text:ue.match,token:this.terminals_[de]||de,line:ue.yylineno,loc:Z,expected:Ie})}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Te+", token: "+de);switch(q[0]){case 1:M.push(de),B.push(ue.yytext),F.push(ue.yylloc),M.push(q[1]),de=null,ne?(de=ne,ne=null):(j=ue.yyleng,$=ue.yytext,U=ue.yylineno,Z=ue.yylloc,te>0&&te--);break;case 2:if(He=this.productions_[q[1]][1],Be.$=B[B.length-He],Be._$={first_line:F[F.length-(He||1)].first_line,last_line:F[F.length-1].last_line,first_column:F[F.length-(He||1)].first_column,last_column:F[F.length-1].last_column},K&&(Be._$.range=[F[F.length-(He||1)].range[0],F[F.length-1].range[1]]),pe=this.performAction.apply(Be,[$,j,U,re.yy,q[1],B,F].concat(J)),typeof pe<"u")return pe;He&&(M=M.slice(0,-1*He*2),B=B.slice(0,-1*He),F=F.slice(0,-1*He)),M.push(this.productions_[q[1]][0]),B.push(Be.$),F.push(Be._$),Le=G[M[M.length-2]][M[M.length-1]],M.push(Le);break;case 3:return!0}}return!0},"parse")},L=(function(){var D={EOF:1,parseError:o(function(O,M){if(this.yy.parser)this.yy.parser.parseError(O,M);else throw new Error(O)},"parseError"),setInput:o(function(_,O){return this.yy=O||this.yy||{},this._input=_,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var _=this._input[0];this.yytext+=_,this.yyleng++,this.offset++,this.match+=_,this.matched+=_;var O=_.match(/(?:\r\n?|\n).*/g);return O?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),_},"input"),unput:o(function(_){var O=_.length,M=_.split(/(?:\r\n?|\n)/g);this._input=_+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-O),this.offset-=O;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),M.length-1&&(this.yylineno-=M.length-1);var B=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:M?(M.length===P.length?this.yylloc.first_column:0)+P[P.length-M.length].length-M[0].length:this.yylloc.first_column-O},this.options.ranges&&(this.yylloc.range=[B[0],B[0]+this.yyleng-O]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(_){this.unput(this.match.slice(_))},"less"),pastInput:o(function(){var _=this.matched.substr(0,this.matched.length-this.match.length);return(_.length>20?"...":"")+_.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var _=this.match;return _.length<20&&(_+=this._input.substr(0,20-_.length)),(_.substr(0,20)+(_.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var _=this.pastInput(),O=new Array(_.length+1).join("-");return _+this.upcomingInput()+` +`+O+"^"},"showPosition"),test_match:o(function(_,O){var M,P,B;if(this.options.backtrack_lexer&&(B={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(B.yylloc.range=this.yylloc.range.slice(0))),P=_[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+_[0].length},this.yytext+=_[0],this.match+=_[0],this.matches=_,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(_[0].length),this.matched+=_[0],M=this.performAction.call(this,this.yy,this,O,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),M)return M;if(this._backtrack){for(var F in B)this[F]=B[F];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var _,O,M,P;this._more||(this.yytext="",this.match="");for(var B=this._currentRules(),F=0;FO[0].length)){if(O=M,P=F,this.options.backtrack_lexer){if(_=this.test_match(M,B[F]),_!==!1)return _;if(this._backtrack){O=!1;continue}else return!1}else if(!this.options.flex)break}return O?(_=this.test_match(O,B[P]),_!==!1?_:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var O=this.next();return O||this.lex()},"lex"),begin:o(function(O){this.conditionStack.push(O)},"begin"),popState:o(function(){var O=this.conditionStack.length-1;return O>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(O){return O=this.conditionStack.length-1-Math.abs(O||0),O>=0?this.conditionStack[O]:"INITIAL"},"topState"),pushState:o(function(O){this.begin(O)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(O,M,P,B){var F=B;switch(P){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return D})();I.lexer=L;function E(){this.yy={}}return o(E,"Parser"),E.prototype=I,I.Parser=E,new E})();mF.parser=mF;Fge=mF});var zge=Da((gF,yF)=>{"use strict";(function(t,e){typeof gF=="object"&&typeof yF<"u"?yF.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(gF,(function(){"use strict";var t="day";return function(e,r,n){var i=o(function(l){return l.add(4-l.isoWeekday(),t)},"a"),a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(l){if(!this.$utils().u(l))return this.add(7*(l-this.isoWeek()),t);var u,h,f,d,p=i(this),m=(u=this.isoWeekYear(),h=this.$u,f=(h?n.utc:n)().year(u).startOf("year"),d=4-f.isoWeekday(),f.isoWeekday()>4&&(d+=7),f.add(d,t));return p.diff(m,"week")+1},a.isoWeekday=function(l){return this.$utils().u(l)?this.day()||7:this.day(this.day()%7?l:l-7)};var s=a.startOf;a.startOf=function(l,u){var h=this.$utils(),f=!!h.u(u)||u;return h.p(l)==="isoweek"?f?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(l,u)}}}))});var Gge=Da((vF,xF)=>{"use strict";(function(t,e){typeof vF=="object"&&typeof xF<"u"?xF.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(vF,(function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},l=o(function(g){return(g=+g)+(g>68?1900:2e3)},"a"),u=o(function(g){return function(y){this[g]=+y}},"f"),h=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=(function(y){if(!y||y==="Z")return 0;var v=y.match(/([+-]|\d\d)/g),x=60*v[1]+(+v[2]||0);return x===0?0:v[0]==="+"?-x:x})(g)}],f=o(function(g){var y=s[g];return y&&(y.indexOf?y:y.s.concat(y.f))},"u"),d=o(function(g,y){var v,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,y))>-1){v=b>12;break}}else v=g===(y?"pm":"PM");return v},"d"),p={A:[a,function(g){this.afternoon=d(g,!1)}],a:[a,function(g){this.afternoon=d(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,u("seconds")],ss:[i,u("seconds")],m:[i,u("minutes")],mm:[i,u("minutes")],H:[i,u("hours")],h:[i,u("hours")],HH:[i,u("hours")],hh:[i,u("hours")],D:[i,u("day")],DD:[n,u("day")],Do:[a,function(g){var y=s.ordinal,v=g.match(/\d+/);if(this.day=v[0],y)for(var x=1;x<=31;x+=1)y(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,u("week")],ww:[n,u("week")],M:[i,u("month")],MM:[n,u("month")],MMM:[a,function(g){var y=f("months"),v=(f("monthsShort")||y.map((function(x){return x.slice(0,3)}))).indexOf(g)+1;if(v<1)throw new Error;this.month=v%12||v}],MMMM:[a,function(g){var y=f("months").indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,u("year")],YY:[n,function(g){this.year=l(g)}],YYYY:[/\d{4}/,u("year")],Z:h,ZZ:h};function m(g){var y,v;y=g,v=s&&s.formats;for(var x=(g=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(C,R,I){var L=I&&I.toUpperCase();return R||v[I]||t[I]||v[L].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(E,D,_){return D||_.slice(1)}))}))).match(e),b=x.length,T=0;T-1)return new Date((M==="X"?1e3:1)*O);var F=m(M)(O),G=F.year,$=F.month,U=F.day,j=F.hours,te=F.minutes,Y=F.seconds,oe=F.milliseconds,J=F.zone,ue=F.week,re=new Date,ee=U||(G||$?1:re.getDate()),Z=G||re.getFullYear(),K=0;G&&!$||(K=$>0?$-1:re.getMonth());var ae,Q=j||0,de=te||0,ne=Y||0,Te=oe||0;return J?new Date(Date.UTC(Z,K,ee,Q,de,ne,Te+60*J.offset*1e3)):P?new Date(Date.UTC(Z,K,ee,Q,de,ne,Te)):(ae=new Date(Z,K,ee,Q,de,ne,Te),ue&&(ae=B(ae).week(ue).toDate()),ae)}catch{return new Date("")}})(S,A,w,v),this.init(),L&&L!==!0&&(this.$L=this.locale(L).$L),I&&S!=this.format(A)&&(this.$d=new Date("")),s={}}else if(A instanceof Array)for(var E=A.length,D=1;D<=E;D+=1){k[1]=A[D-1];var _=v.apply(this,k);if(_.isValid()){this.$d=_.$d,this.$L=_.$L,this.init();break}D===E&&(this.$d=new Date(""))}else b.call(this,T)}}}))});var Vge=Da((bF,TF)=>{"use strict";(function(t,e){typeof bF=="object"&&typeof TF<"u"?TF.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})(bF,(function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var l=this.$utils(),u=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(h){switch(h){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return l.s(a.week(),h==="w"?1:2,"0");case"W":case"WW":return l.s(a.isoWeek(),h==="W"?1:2,"0");case"k":case"kk":return l.s(String(a.$H===0?24:a.$H),h==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return h}}));return n.bind(this)(u)}}}))});function i1e(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var qge,xo,Wge,Yge,Xge,Uge,eu,SF,CF,AF,d4,p4,_F,DF,B6,ty,LF,jge,RF,m4,NF,MF,F6,wF,YKe,XKe,jKe,KKe,QKe,ZKe,JKe,eQe,tQe,rQe,nQe,iQe,aQe,sQe,oQe,lQe,cQe,uQe,hQe,fQe,dQe,pQe,mQe,Kge,gQe,yQe,vQe,Qge,xQe,kF,Zge,Jge,O6,ey,bQe,TQe,EF,P6,Vi,e1e,wQe,a0,kQe,Hge,EQe,t1e,SQe,r1e,CQe,AQe,n1e,a1e=N(()=>{"use strict";qge=ja(tm(),1),xo=ja(X4(),1),Wge=ja(zge(),1),Yge=ja(Gge(),1),Xge=ja(Vge(),1);pt();Xt();tr();ci();xo.default.extend(Wge.default);xo.default.extend(Yge.default);xo.default.extend(Xge.default);Uge={friday:5,saturday:6},eu="",SF="",AF="",d4=[],p4=[],_F=new Map,DF=[],B6=[],ty="",LF="",jge=["active","done","crit","milestone","vert"],RF=[],m4=!1,NF=!1,MF="sunday",F6="saturday",wF=0,YKe=o(function(){DF=[],B6=[],ty="",RF=[],O6=0,EF=void 0,P6=void 0,Vi=[],eu="",SF="",LF="",CF=void 0,AF="",d4=[],p4=[],m4=!1,NF=!1,wF=0,_F=new Map,Sr(),MF="sunday",F6="saturday"},"clear"),XKe=o(function(t){SF=t},"setAxisFormat"),jKe=o(function(){return SF},"getAxisFormat"),KKe=o(function(t){CF=t},"setTickInterval"),QKe=o(function(){return CF},"getTickInterval"),ZKe=o(function(t){AF=t},"setTodayMarker"),JKe=o(function(){return AF},"getTodayMarker"),eQe=o(function(t){eu=t},"setDateFormat"),tQe=o(function(){m4=!0},"enableInclusiveEndDates"),rQe=o(function(){return m4},"endDatesAreInclusive"),nQe=o(function(){NF=!0},"enableTopAxis"),iQe=o(function(){return NF},"topAxisEnabled"),aQe=o(function(t){LF=t},"setDisplayMode"),sQe=o(function(){return LF},"getDisplayMode"),oQe=o(function(){return eu},"getDateFormat"),lQe=o(function(t){d4=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),cQe=o(function(){return d4},"getIncludes"),uQe=o(function(t){p4=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),hQe=o(function(){return p4},"getExcludes"),fQe=o(function(){return _F},"getLinks"),dQe=o(function(t){ty=t,DF.push(t)},"addSection"),pQe=o(function(){return DF},"getSections"),mQe=o(function(){let t=Hge(),e=10,r=0;for(;!t&&r[\d\w- ]+)/.exec(r);if(i!==null){let s=null;for(let u of i.groups.ids.split(" ")){let h=a0(u);h!==void 0&&(!s||h.endTime>s.endTime)&&(s=h)}if(s)return s.endTime;let l=new Date;return l.setHours(0,0,0,0),l}let a=(0,xo.default)(r,e.trim(),!0);if(a.isValid())return a.toDate();{X.debug("Invalid date:"+r),X.debug("With date format:"+e.trim());let s=new Date(r);if(s===void 0||isNaN(s.getTime())||s.getFullYear()<-1e4||s.getFullYear()>1e4)throw new Error("Invalid date:"+r);return s}},"getStartDate"),Zge=o(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),Jge=o(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let f=null;for(let p of a.groups.ids.split(" ")){let m=a0(p);m!==void 0&&(!f||m.startTime{window.open(r,"_self")}),_F.set(n,r))}),t1e(t,"clickable")},"setLink"),t1e=o(function(t,e){t.split(",").forEach(function(r){let n=a0(r);n!==void 0&&n.classes.push(e)})},"setClass"),SQe=o(function(t,e,r){if(ge().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{qt.runFunc(e,...n)})},"setClickFun"),r1e=o(function(t,e){RF.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),CQe=o(function(t,e,r){t.split(",").forEach(function(n){SQe(n,e,r)}),t1e(t,"clickable")},"setClickEvent"),AQe=o(function(t){RF.forEach(function(e){e(t)})},"bindFunctions"),n1e={getConfig:o(()=>ge().gantt,"getConfig"),clear:YKe,setDateFormat:eQe,getDateFormat:oQe,enableInclusiveEndDates:tQe,endDatesAreInclusive:rQe,enableTopAxis:nQe,topAxisEnabled:iQe,setAxisFormat:XKe,getAxisFormat:jKe,setTickInterval:KKe,getTickInterval:QKe,setTodayMarker:ZKe,getTodayMarker:JKe,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,setDisplayMode:aQe,getDisplayMode:sQe,setAccDescription:Ir,getAccDescription:Or,addSection:dQe,getSections:pQe,getTasks:mQe,addTask:wQe,findTaskById:a0,addTaskOrg:kQe,setIncludes:lQe,getIncludes:cQe,setExcludes:uQe,getExcludes:hQe,setClickEvent:CQe,setLink:EQe,getLinks:fQe,bindFunctions:AQe,parseDuration:Zge,isInvalidDate:Kge,setWeekday:gQe,getWeekday:yQe,setWeekend:vQe};o(i1e,"getTaskTags")});var $6,_Qe,s1e,DQe,ah,LQe,o1e,l1e=N(()=>{"use strict";$6=ja(X4(),1);pt();yr();gr();Xt();Ei();_Qe=o(function(){X.debug("Something is calling, setConf, remove the call")},"setConf"),s1e={monday:Ih,tuesday:P5,wednesday:B5,thursday:fc,friday:F5,saturday:$5,sunday:wl},DQe=o((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),LQe=o(function(t,e,r,n){let i=ge().gantt,a=ge().securityLevel,s;a==="sandbox"&&(s=qe("#i"+e));let l=a==="sandbox"?qe(s.nodes()[0].contentDocument.body):qe("body"),u=a==="sandbox"?s.nodes()[0].contentDocument:document,h=u.getElementById(e);ah=h.parentElement.offsetWidth,ah===void 0&&(ah=1200),i.useWidth!==void 0&&(ah=i.useWidth);let f=n.db.getTasks(),d=[];for(let C of f)d.push(C.type);d=A(d);let p={},m=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let C={};for(let I of f)C[I.section]===void 0?C[I.section]=[I]:C[I.section].push(I);let R=0;for(let I of Object.keys(C)){let L=DQe(C[I],R)+1;R+=L,m+=L*(i.barHeight+i.barGap),p[I]=L}}else{m+=f.length*(i.barHeight+i.barGap);for(let C of d)p[C]=f.filter(R=>R.type===C).length}h.setAttribute("viewBox","0 0 "+ah+" "+m);let g=l.select(`[id="${e}"]`),y=V5().domain([Y3(f,function(C){return C.startTime}),W3(f,function(C){return C.endTime})]).rangeRound([0,ah-i.leftPadding-i.rightPadding]);function v(C,R){let I=C.startTime,L=R.startTime,E=0;return I>L?E=1:IG.vert===$.vert?0:G.vert?1:-1);let M=[...new Set(C.map(G=>G.order))].map(G=>C.find($=>$.order===G));g.append("g").selectAll("rect").data(M).enter().append("rect").attr("x",0).attr("y",function(G,$){return $=G.order,$*R+I-2}).attr("width",function(){return _-i.rightPadding/2}).attr("height",R).attr("class",function(G){for(let[$,U]of d.entries())if(G.type===U)return"section section"+$%i.numberSectionStyles;return"section section0"}).enter();let P=g.append("g").selectAll("rect").data(C).enter(),B=n.db.getLinks();if(P.append("rect").attr("id",function(G){return G.id}).attr("rx",3).attr("ry",3).attr("x",function(G){return G.milestone?y(G.startTime)+L+.5*(y(G.endTime)-y(G.startTime))-.5*E:y(G.startTime)+L}).attr("y",function(G,$){return $=G.order,G.vert?i.gridLineStartPadding:$*R+I}).attr("width",function(G){return G.milestone?E:G.vert?.08*E:y(G.renderEndTime||G.endTime)-y(G.startTime)}).attr("height",function(G){return G.vert?f.length*(i.barHeight+i.barGap)+i.barHeight*2:E}).attr("transform-origin",function(G,$){return $=G.order,(y(G.startTime)+L+.5*(y(G.endTime)-y(G.startTime))).toString()+"px "+($*R+I+.5*E).toString()+"px"}).attr("class",function(G){let $="task",U="";G.classes.length>0&&(U=G.classes.join(" "));let j=0;for(let[Y,oe]of d.entries())G.type===oe&&(j=Y%i.numberSectionStyles);let te="";return G.active?G.crit?te+=" activeCrit":te=" active":G.done?G.crit?te=" doneCrit":te=" done":G.crit&&(te+=" crit"),te.length===0&&(te=" task"),G.milestone&&(te=" milestone "+te),G.vert&&(te=" vert "+te),te+=j,te+=" "+U,$+te}),P.append("text").attr("id",function(G){return G.id+"-text"}).text(function(G){return G.task}).attr("font-size",i.fontSize).attr("x",function(G){let $=y(G.startTime),U=y(G.renderEndTime||G.endTime);if(G.milestone&&($+=.5*(y(G.endTime)-y(G.startTime))-.5*E,U=$+E),G.vert)return y(G.startTime)+L;let j=this.getBBox().width;return j>U-$?U+j+1.5*i.leftPadding>_?$+L-5:U+L+5:(U-$)/2+$+L}).attr("y",function(G,$){return G.vert?i.gridLineStartPadding+f.length*(i.barHeight+i.barGap)+60:($=G.order,$*R+i.barHeight/2+(i.fontSize/2-2)+I)}).attr("text-height",E).attr("class",function(G){let $=y(G.startTime),U=y(G.endTime);G.milestone&&(U=$+E);let j=this.getBBox().width,te="";G.classes.length>0&&(te=G.classes.join(" "));let Y=0;for(let[J,ue]of d.entries())G.type===ue&&(Y=J%i.numberSectionStyles);let oe="";return G.active&&(G.crit?oe="activeCritText"+Y:oe="activeText"+Y),G.done?G.crit?oe=oe+" doneCritText"+Y:oe=oe+" doneText"+Y:G.crit&&(oe=oe+" critText"+Y),G.milestone&&(oe+=" milestoneText"),G.vert&&(oe+=" vertText"),j>U-$?U+j+1.5*i.leftPadding>_?te+" taskTextOutsideLeft taskTextOutside"+Y+" "+oe:te+" taskTextOutsideRight taskTextOutside"+Y+" "+oe+" width-"+j:te+" taskText taskText"+Y+" "+oe+" width-"+j}),ge().securityLevel==="sandbox"){let G;G=qe("#i"+e);let $=G.nodes()[0].contentDocument;P.filter(function(U){return B.has(U.id)}).each(function(U){var j=$.querySelector("#"+U.id),te=$.querySelector("#"+U.id+"-text");let Y=j.parentNode;var oe=$.createElement("a");oe.setAttribute("xlink:href",B.get(U.id)),oe.setAttribute("target","_top"),Y.appendChild(oe),oe.appendChild(j),oe.appendChild(te)})}}o(b,"drawRects");function T(C,R,I,L,E,D,_,O){if(_.length===0&&O.length===0)return;let M,P;for(let{startTime:j,endTime:te}of D)(M===void 0||jP)&&(P=te);if(!M||!P)return;if((0,$6.default)(P).diff((0,$6.default)(M),"year")>5){X.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let B=n.db.getDateFormat(),F=[],G=null,$=(0,$6.default)(M);for(;$.valueOf()<=P;)n.db.isInvalidDate($,B,_,O)?G?G.end=$:G={start:$,end:$}:G&&(F.push(G),G=null),$=$.add(1,"d");g.append("g").selectAll("rect").data(F).enter().append("rect").attr("id",j=>"exclude-"+j.start.format("YYYY-MM-DD")).attr("x",j=>y(j.start.startOf("day"))+I).attr("y",i.gridLineStartPadding).attr("width",j=>y(j.end.endOf("day"))-y(j.start.startOf("day"))).attr("height",E-R-i.gridLineStartPadding).attr("transform-origin",function(j,te){return(y(j.start)+I+.5*(y(j.end)-y(j.start))).toString()+"px "+(te*C+.5*E).toString()+"px"}).attr("class","exclude-range")}o(T,"drawExcludeDays");function S(C,R,I,L){let E=n.db.getDateFormat(),D=n.db.getAxisFormat(),_;D?_=D:E==="D"?_="%d":_=i.axisFormat??"%Y-%m-%d";let O=QA(y).tickSize(-L+R+i.gridLineStartPadding).tickFormat(Pd(_)),P=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(P!==null){let B=P[1],F=P[2],G=n.db.getWeekday()||i.weekday;switch(F){case"millisecond":O.ticks(uc.every(B));break;case"second":O.ticks(io.every(B));break;case"minute":O.ticks(ku.every(B));break;case"hour":O.ticks(Eu.every(B));break;case"day":O.ticks(Ro.every(B));break;case"week":O.ticks(s1e[G].every(B));break;case"month":O.ticks(Su.every(B));break}}if(g.append("g").attr("class","grid").attr("transform","translate("+C+", "+(L-50)+")").call(O).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let B=KA(y).tickSize(-L+R+i.gridLineStartPadding).tickFormat(Pd(_));if(P!==null){let F=P[1],G=P[2],$=n.db.getWeekday()||i.weekday;switch(G){case"millisecond":B.ticks(uc.every(F));break;case"second":B.ticks(io.every(F));break;case"minute":B.ticks(ku.every(F));break;case"hour":B.ticks(Eu.every(F));break;case"day":B.ticks(Ro.every(F));break;case"week":B.ticks(s1e[$].every(F));break;case"month":B.ticks(Su.every(F));break}}g.append("g").attr("class","grid").attr("transform","translate("+C+", "+R+")").call(B).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}o(S,"makeGrid");function w(C,R){let I=0,L=Object.keys(p).map(E=>[E,p[E]]);g.append("g").selectAll("text").data(L).enter().append(function(E){let D=E[0].split(tt.lineBreakRegex),_=-(D.length-1)/2,O=u.createElementNS("http://www.w3.org/2000/svg","text");O.setAttribute("dy",_+"em");for(let[M,P]of D.entries()){let B=u.createElementNS("http://www.w3.org/2000/svg","tspan");B.setAttribute("alignment-baseline","central"),B.setAttribute("x","10"),M>0&&B.setAttribute("dy","1em"),B.textContent=P,O.appendChild(B)}return O}).attr("x",10).attr("y",function(E,D){if(D>0)for(let _=0;_{"use strict";RQe=o(t=>` + .mermaid-main-font { + font-family: ${t.fontFamily}; + } + + .exclude-range { + fill: ${t.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${t.sectionBkgColor}; + } + + .section2 { + fill: ${t.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${t.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${t.titleColor}; + } + + .sectionTitle1 { + fill: ${t.titleColor}; + } + + .sectionTitle2 { + fill: ${t.titleColor}; + } + + .sectionTitle3 { + fill: ${t.titleColor}; + } + + .sectionTitle { + text-anchor: start; + font-family: ${t.fontFamily}; + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${t.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + } + + .grid .tick text { + font-family: ${t.fontFamily}; + fill: ${t.textColor}; + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${t.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideRight { + fill: ${t.taskTextDarkColor}; + text-anchor: start; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideLeft { + fill: ${t.taskTextDarkColor}; + text-anchor: end; + } + + + /* Special case clickable */ + + .task.clickable { + cursor: pointer; + } + + .taskText.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${t.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${t.taskBkgColor}; + stroke: ${t.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${t.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${t.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${t.activeTaskBkgColor}; + stroke: ${t.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${t.doneTaskBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${t.critBorderColor}; + fill: ${t.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .vert { + stroke: ${t.vertLineColor}; + } + + .vertText { + font-size: 15px; + text-anchor: middle; + fill: ${t.vertLineColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.titleColor||t.textColor}; + font-family: ${t.fontFamily}; + } +`,"getStyles"),c1e=RQe});var h1e={};dr(h1e,{diagram:()=>NQe});var NQe,f1e=N(()=>{"use strict";$ge();a1e();l1e();u1e();NQe={parser:Fge,db:n1e,renderer:o1e,styles:c1e}});var m1e,g1e=N(()=>{"use strict";Uf();pt();m1e={parse:o(async t=>{let e=await bs("info",t);X.debug(e)},"parse")}});var g4,IF=N(()=>{g4={name:"mermaid",version:"11.12.0",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",type:"module",module:"./dist/mermaid.core.mjs",types:"./dist/mermaid.d.ts",exports:{".":{types:"./dist/mermaid.d.ts",import:"./dist/mermaid.core.mjs",default:"./dist/mermaid.core.mjs"},"./*":"./*"},keywords:["diagram","markdown","flowchart","sequence diagram","gantt","class diagram","git graph","mindmap","packet diagram","c4 diagram","er diagram","pie chart","pie diagram","quadrant chart","requirement diagram","graph"],scripts:{clean:"rimraf dist",dev:"pnpm -w dev","docs:code":"typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup","docs:build":"rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts","docs:verify":"pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify","docs:pre:vitepress":"pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts","docs:build:vitepress":"pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing","docs:dev":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:dev:docker":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev:docker" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:serve":"pnpm docs:build:vitepress && vitepress serve src/vitepress","docs:spellcheck":'cspell "src/docs/**/*.md"',"docs:release-version":"tsx scripts/update-release-version.mts","docs:verify-version":"tsx scripts/update-release-version.mts --verify","types:build-config":"tsx scripts/create-types-from-json-schema.mts","types:verify-config":"tsx scripts/create-types-from-json-schema.mts --verify",checkCircle:"npx madge --circular ./src",prepublishOnly:"pnpm docs:verify-version"},repository:{type:"git",url:"https://github.com/mermaid-js/mermaid"},author:"Knut Sveidqvist",license:"MIT",standard:{ignore:["**/parser/*.js","dist/**/*.js","cypress/**/*.js"],globals:["page"]},dependencies:{"@braintree/sanitize-url":"^7.1.1","@iconify/utils":"^3.0.1","@mermaid-js/parser":"workspace:^","@types/d3":"^7.4.3",cytoscape:"^3.29.3","cytoscape-cose-bilkent":"^4.1.0","cytoscape-fcose":"^2.2.0",d3:"^7.9.0","d3-sankey":"^0.12.3","dagre-d3-es":"7.0.11",dayjs:"^1.11.18",dompurify:"^3.2.5",katex:"^0.16.22",khroma:"^2.1.0","lodash-es":"^4.17.21",marked:"^16.2.1",roughjs:"^4.6.6",stylis:"^4.3.6","ts-dedent":"^2.2.0",uuid:"^11.1.0"},devDependencies:{"@adobe/jsonschema2md":"^8.0.5","@iconify/types":"^2.0.0","@types/cytoscape":"^3.21.9","@types/cytoscape-fcose":"^2.2.4","@types/d3-sankey":"^0.12.4","@types/d3-scale":"^4.0.9","@types/d3-scale-chromatic":"^3.1.0","@types/d3-selection":"^3.0.11","@types/d3-shape":"^3.1.7","@types/jsdom":"^21.1.7","@types/katex":"^0.16.7","@types/lodash-es":"^4.17.12","@types/micromatch":"^4.0.9","@types/stylis":"^4.2.7","@types/uuid":"^10.0.0",ajv:"^8.17.1",canvas:"^3.1.2",chokidar:"3.6.0",concurrently:"^9.1.2","csstree-validator":"^4.0.1",globby:"^14.1.0",jison:"^0.4.18","js-base64":"^3.7.8",jsdom:"^26.1.0","json-schema-to-typescript":"^15.0.4",micromatch:"^4.0.8","path-browserify":"^1.0.1",prettier:"^3.5.3",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1",rimraf:"^6.0.1","start-server-and-test":"^2.0.13","type-fest":"^4.35.0",typedoc:"^0.28.12","typedoc-plugin-markdown":"^4.8.1",typescript:"~5.7.3","unist-util-flatmap":"^1.0.0","unist-util-visit":"^5.0.0",vitepress:"^1.6.4","vitepress-plugin-search":"1.0.4-alpha.22"},files:["dist/","README.md"],publishConfig:{access:"public"}}});var BQe,FQe,y1e,v1e=N(()=>{"use strict";IF();BQe={version:g4.version+""},FQe=o(()=>BQe.version,"getVersion"),y1e={getVersion:FQe}});var aa,tu=N(()=>{"use strict";yr();Xt();aa=o(t=>{let{securityLevel:e}=ge(),r=qe("body");if(e==="sandbox"){let a=qe(`#i${t}`).node()?.contentDocument??document;r=qe(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var $Qe,x1e,b1e=N(()=>{"use strict";pt();tu();Ei();$Qe=o((t,e,r)=>{X.debug(`rendering info diagram +`+t);let n=aa(e);mn(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),x1e={draw:$Qe}});var T1e={};dr(T1e,{diagram:()=>zQe});var zQe,w1e=N(()=>{"use strict";g1e();v1e();b1e();zQe={parser:m1e,db:y1e,renderer:x1e}});var S1e,OF,z6,PF,UQe,HQe,qQe,WQe,YQe,XQe,jQe,G6,BF=N(()=>{"use strict";pt();ci();La();S1e=ur.pie,OF={sections:new Map,showData:!1,config:S1e},z6=OF.sections,PF=OF.showData,UQe=structuredClone(S1e),HQe=o(()=>structuredClone(UQe),"getConfig"),qQe=o(()=>{z6=new Map,PF=OF.showData,Sr()},"clear"),WQe=o(({label:t,value:e})=>{if(e<0)throw new Error(`"${t}" has invalid value: ${e}. Negative values are not allowed in pie charts. All slice values must be >= 0.`);z6.has(t)||(z6.set(t,e),X.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),YQe=o(()=>z6,"getSections"),XQe=o(t=>{PF=t},"setShowData"),jQe=o(()=>PF,"getShowData"),G6={getConfig:HQe,clear:qQe,setDiagramTitle:$r,getDiagramTitle:Pr,setAccTitle:Rr,getAccTitle:Mr,setAccDescription:Ir,getAccDescription:Or,addSection:WQe,getSections:YQe,setShowData:XQe,getShowData:jQe}});var KQe,C1e,A1e=N(()=>{"use strict";Uf();pt();r0();BF();KQe=o((t,e)=>{nl(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),C1e={parse:o(async t=>{let e=await bs("pie",t);X.debug(e),KQe(e,G6)},"parse")}});var QQe,_1e,D1e=N(()=>{"use strict";QQe=o(t=>` + .pieCircle{ + stroke: ${t.pieStrokeColor}; + stroke-width : ${t.pieStrokeWidth}; + opacity : ${t.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${t.pieOuterStrokeColor}; + stroke-width: ${t.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${t.pieTitleTextSize}; + fill: ${t.pieTitleTextColor}; + font-family: ${t.fontFamily}; + } + .slice { + font-family: ${t.fontFamily}; + fill: ${t.pieSectionTextColor}; + font-size:${t.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${t.pieLegendTextColor}; + font-family: ${t.fontFamily}; + font-size: ${t.pieLegendTextSize}; + } +`,"getStyles"),_1e=QQe});var ZQe,JQe,L1e,R1e=N(()=>{"use strict";yr();Xt();pt();tu();Ei();tr();ZQe=o(t=>{let e=[...t.values()].reduce((i,a)=>i+a,0),r=[...t.entries()].map(([i,a])=>({label:i,value:a})).filter(i=>i.value/e*100>=1).sort((i,a)=>a.value-i.value);return X5().value(i=>i.value)(r)},"createPieArcs"),JQe=o((t,e,r,n)=>{X.debug(`rendering pie chart +`+t);let i=n.db,a=ge(),s=Vn(i.getConfig(),a.pie),l=40,u=18,h=4,f=450,d=f,p=aa(e),m=p.append("g");m.attr("transform","translate("+d/2+","+f/2+")");let{themeVariables:g}=a,[y]=vc(g.pieOuterStrokeWidth);y??=2;let v=s.textPosition,x=Math.min(d,f)/2-l,b=Sl().innerRadius(0).outerRadius(x),T=Sl().innerRadius(x*v).outerRadius(x*v);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+y/2).attr("class","pieOuterCircle");let S=i.getSections(),w=ZQe(S),k=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],A=0;S.forEach(_=>{A+=_});let C=w.filter(_=>(_.data.value/A*100).toFixed(0)!=="0"),R=no(k);m.selectAll("mySlices").data(C).enter().append("path").attr("d",b).attr("fill",_=>R(_.data.label)).attr("class","pieCircle"),m.selectAll("mySlices").data(C).enter().append("text").text(_=>(_.data.value/A*100).toFixed(0)+"%").attr("transform",_=>"translate("+T.centroid(_)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(f-50)/2).attr("class","pieTitleText");let I=[...S.entries()].map(([_,O])=>({label:_,value:O})),L=m.selectAll(".legend").data(I).enter().append("g").attr("class","legend").attr("transform",(_,O)=>{let M=u+h,P=M*I.length/2,B=12*u,F=O*M-P;return"translate("+B+","+F+")"});L.append("rect").attr("width",u).attr("height",u).style("fill",_=>R(_.label)).style("stroke",_=>R(_.label)),L.append("text").attr("x",u+h).attr("y",u-h).text(_=>i.getShowData()?`${_.label} [${_.value}]`:_.label);let E=Math.max(...L.selectAll("text").nodes().map(_=>_?.getBoundingClientRect().width??0)),D=d+l+u+h+E;p.attr("viewBox",`0 0 ${D} ${f}`),mn(p,f,D,s.useMaxWidth)},"draw"),L1e={draw:JQe}});var N1e={};dr(N1e,{diagram:()=>eZe});var eZe,M1e=N(()=>{"use strict";A1e();BF();D1e();R1e();eZe={parser:C1e,db:G6,renderer:L1e,styles:_1e}});var FF,O1e,P1e=N(()=>{"use strict";FF=(function(){var t=o(function(he,z,se,le){for(se=se||{},le=he.length;le--;se[he[le]]=z);return se},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],u=[55,56,57],h=[2,36],f=[1,37],d=[1,36],p=[1,38],m=[1,35],g=[1,43],y=[1,41],v=[1,14],x=[1,23],b=[1,18],T=[1,19],S=[1,20],w=[1,21],k=[1,22],A=[1,24],C=[1,25],R=[1,26],I=[1,27],L=[1,28],E=[1,29],D=[1,32],_=[1,33],O=[1,34],M=[1,39],P=[1,40],B=[1,42],F=[1,44],G=[1,62],$=[1,61],U=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],j=[1,65],te=[1,66],Y=[1,67],oe=[1,68],J=[1,69],ue=[1,70],re=[1,71],ee=[1,72],Z=[1,73],K=[1,74],ae=[1,75],Q=[1,76],de=[4,5,6,7,8,9,10,11,12,13,14,15,18],ne=[1,90],Te=[1,91],q=[1,92],Ve=[1,99],pe=[1,93],Be=[1,96],Ye=[1,94],He=[1,95],Le=[1,97],Ie=[1,98],Ne=[1,102],Ce=[10,55,56,57],Fe=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],fe={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(z,se,le,ke,ve,ye,Re){var _e=ye.length-1;switch(ve){case 23:this.$=ye[_e];break;case 24:this.$=ye[_e-1]+""+ye[_e];break;case 26:this.$=ye[_e-1]+ye[_e];break;case 27:this.$=[ye[_e].trim()];break;case 28:ye[_e-2].push(ye[_e].trim()),this.$=ye[_e-2];break;case 29:this.$=ye[_e-4],ke.addClass(ye[_e-2],ye[_e]);break;case 37:this.$=[];break;case 42:this.$=ye[_e].trim(),ke.setDiagramTitle(this.$);break;case 43:this.$=ye[_e].trim(),ke.setAccTitle(this.$);break;case 44:case 45:this.$=ye[_e].trim(),ke.setAccDescription(this.$);break;case 46:ke.addSection(ye[_e].substr(8)),this.$=ye[_e].substr(8);break;case 47:ke.addPoint(ye[_e-3],"",ye[_e-1],ye[_e],[]);break;case 48:ke.addPoint(ye[_e-4],ye[_e-3],ye[_e-1],ye[_e],[]);break;case 49:ke.addPoint(ye[_e-4],"",ye[_e-2],ye[_e-1],ye[_e]);break;case 50:ke.addPoint(ye[_e-5],ye[_e-4],ye[_e-2],ye[_e-1],ye[_e]);break;case 51:ke.setXAxisLeftText(ye[_e-2]),ke.setXAxisRightText(ye[_e]);break;case 52:ye[_e-1].text+=" \u27F6 ",ke.setXAxisLeftText(ye[_e-1]);break;case 53:ke.setXAxisLeftText(ye[_e]);break;case 54:ke.setYAxisBottomText(ye[_e-2]),ke.setYAxisTopText(ye[_e]);break;case 55:ye[_e-1].text+=" \u27F6 ",ke.setYAxisBottomText(ye[_e-1]);break;case 56:ke.setYAxisBottomText(ye[_e]);break;case 57:ke.setQuadrant1Text(ye[_e]);break;case 58:ke.setQuadrant2Text(ye[_e]);break;case 59:ke.setQuadrant3Text(ye[_e]);break;case 60:ke.setQuadrant4Text(ye[_e]);break;case 64:this.$={text:ye[_e],type:"text"};break;case 65:this.$={text:ye[_e-1].text+""+ye[_e],type:ye[_e-1].type};break;case 66:this.$={text:ye[_e],type:"text"};break;case 67:this.$={text:ye[_e],type:"markdown"};break;case 68:this.$=ye[_e];break;case 69:this.$=ye[_e-1]+""+ye[_e];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(u,h,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:S,41:w,42:k,48:A,50:C,51:R,52:I,53:L,54:E,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(u,[2,37]),t(u,h,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:S,41:w,42:k,48:A,50:C,51:R,52:I,53:L,54:E,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),t(u,[2,39]),t(u,[2,40]),t(u,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(u,[2,45]),t(u,[2,46]),{18:[1,50]},{4:f,5:d,10:p,12:m,13:g,14:y,43:51,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:52,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:53,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:54,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:55,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:56,58:31,60:D,61:_,63:O,64:M,65:P,66:B,67:F},{4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,44:[1,57],47:[1,58],58:60,59:59,63:O,64:M,65:P,66:B,67:F},t(U,[2,64]),t(U,[2,66]),t(U,[2,67]),t(U,[2,70]),t(U,[2,71]),t(U,[2,72]),t(U,[2,73]),t(U,[2,74]),t(U,[2,75]),t(U,[2,76]),t(U,[2,77]),t(U,[2,78]),t(U,[2,79]),t(U,[2,80]),t(s,[2,35]),t(u,[2,38]),t(u,[2,42]),t(u,[2,43]),t(u,[2,44]),{3:64,4:j,5:te,6:Y,7:oe,8:J,9:ue,10:re,11:ee,12:Z,13:K,14:ae,15:Q,21:63},t(u,[2,53],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,49:[1,77],63:O,64:M,65:P,66:B,67:F}),t(u,[2,56],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,49:[1,78],63:O,64:M,65:P,66:B,67:F}),t(u,[2,57],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,58],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,59],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,60],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),{45:[1,79]},{44:[1,80]},t(U,[2,65]),t(U,[2,81]),t(U,[2,82]),t(U,[2,83]),{3:82,4:j,5:te,6:Y,7:oe,8:J,9:ue,10:re,11:ee,12:Z,13:K,14:ae,15:Q,18:[1,81]},t(de,[2,23]),t(de,[2,1]),t(de,[2,2]),t(de,[2,3]),t(de,[2,4]),t(de,[2,5]),t(de,[2,6]),t(de,[2,7]),t(de,[2,8]),t(de,[2,9]),t(de,[2,10]),t(de,[2,11]),t(de,[2,12]),t(u,[2,52],{58:31,43:83,4:f,5:d,10:p,12:m,13:g,14:y,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),t(u,[2,55],{58:31,43:84,4:f,5:d,10:p,12:m,13:g,14:y,60:D,61:_,63:O,64:M,65:P,66:B,67:F}),{46:[1,85]},{45:[1,86]},{4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,16:89,17:Ye,18:He,19:Le,20:Ie,22:88,23:87},t(de,[2,24]),t(u,[2,51],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,54],{59:59,58:60,4:f,5:d,8:G,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:P,66:B,67:F}),t(u,[2,47],{22:88,16:89,23:100,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie}),{46:[1,101]},t(u,[2,29],{10:Ne}),t(Ce,[2,27],{16:103,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie}),t(Fe,[2,25]),t(Fe,[2,13]),t(Fe,[2,14]),t(Fe,[2,15]),t(Fe,[2,16]),t(Fe,[2,17]),t(Fe,[2,18]),t(Fe,[2,19]),t(Fe,[2,20]),t(Fe,[2,21]),t(Fe,[2,22]),t(u,[2,49],{10:Ne}),t(u,[2,48],{22:88,16:89,23:104,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie}),{4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,16:89,17:Ye,18:He,19:Le,20:Ie,22:105},t(Fe,[2,26]),t(u,[2,50],{10:Ne}),t(Ce,[2,28],{16:103,4:ne,5:Te,6:q,8:Ve,11:pe,13:Be,17:Ye,18:He,19:Le,20:Ie})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(z,se){if(se.recoverable)this.trace(z);else{var le=new Error(z);throw le.hash=se,le}},"parseError"),parse:o(function(z){var se=this,le=[0],ke=[],ve=[null],ye=[],Re=this.table,_e="",ze=0,Ke=0,xt=0,We=2,Oe=1,et=ye.slice.call(arguments,1),Ue=Object.create(this.lexer),lt={yy:{}};for(var Gt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Gt)&&(lt.yy[Gt]=this.yy[Gt]);Ue.setInput(z,lt.yy),lt.yy.lexer=Ue,lt.yy.parser=this,typeof Ue.yylloc>"u"&&(Ue.yylloc={});var vt=Ue.yylloc;ye.push(vt);var Lt=Ue.options&&Ue.options.ranges;typeof lt.yy.parseError=="function"?this.parseError=lt.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function dt(Se){le.length=le.length-2*Se,ve.length=ve.length-Se,ye.length=ye.length-Se}o(dt,"popStack");function nt(){var Se;return Se=ke.pop()||Ue.lex()||Oe,typeof Se!="number"&&(Se instanceof Array&&(ke=Se,Se=ke.pop()),Se=se.symbols_[Se]||Se),Se}o(nt,"lex");for(var bt,wt,yt,ft,Ur,_t,bn={},Br,cr,ar,_r;;){if(yt=le[le.length-1],this.defaultActions[yt]?ft=this.defaultActions[yt]:((bt===null||typeof bt>"u")&&(bt=nt()),ft=Re[yt]&&Re[yt][bt]),typeof ft>"u"||!ft.length||!ft[0]){var Ct="";_r=[];for(Br in Re[yt])this.terminals_[Br]&&Br>We&&_r.push("'"+this.terminals_[Br]+"'");Ue.showPosition?Ct="Parse error on line "+(ze+1)+`: +`+Ue.showPosition()+` +Expecting `+_r.join(", ")+", got '"+(this.terminals_[bt]||bt)+"'":Ct="Parse error on line "+(ze+1)+": Unexpected "+(bt==Oe?"end of input":"'"+(this.terminals_[bt]||bt)+"'"),this.parseError(Ct,{text:Ue.match,token:this.terminals_[bt]||bt,line:Ue.yylineno,loc:vt,expected:_r})}if(ft[0]instanceof Array&&ft.length>1)throw new Error("Parse Error: multiple actions possible at state: "+yt+", token: "+bt);switch(ft[0]){case 1:le.push(bt),ve.push(Ue.yytext),ye.push(Ue.yylloc),le.push(ft[1]),bt=null,wt?(bt=wt,wt=null):(Ke=Ue.yyleng,_e=Ue.yytext,ze=Ue.yylineno,vt=Ue.yylloc,xt>0&&xt--);break;case 2:if(cr=this.productions_[ft[1]][1],bn.$=ve[ve.length-cr],bn._$={first_line:ye[ye.length-(cr||1)].first_line,last_line:ye[ye.length-1].last_line,first_column:ye[ye.length-(cr||1)].first_column,last_column:ye[ye.length-1].last_column},Lt&&(bn._$.range=[ye[ye.length-(cr||1)].range[0],ye[ye.length-1].range[1]]),_t=this.performAction.apply(bn,[_e,Ke,ze,lt.yy,ft[1],ve,ye].concat(et)),typeof _t<"u")return _t;cr&&(le=le.slice(0,-1*cr*2),ve=ve.slice(0,-1*cr),ye=ye.slice(0,-1*cr)),le.push(this.productions_[ft[1]][0]),ve.push(bn.$),ye.push(bn._$),ar=Re[le[le.length-2]][le[le.length-1]],le.push(ar);break;case 3:return!0}}return!0},"parse")},xe=(function(){var he={EOF:1,parseError:o(function(se,le){if(this.yy.parser)this.yy.parser.parseError(se,le);else throw new Error(se)},"parseError"),setInput:o(function(z,se){return this.yy=se||this.yy||{},this._input=z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var z=this._input[0];this.yytext+=z,this.yyleng++,this.offset++,this.match+=z,this.matched+=z;var se=z.match(/(?:\r\n?|\n).*/g);return se?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),z},"input"),unput:o(function(z){var se=z.length,le=z.split(/(?:\r\n?|\n)/g);this._input=z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-se),this.offset-=se;var ke=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),le.length-1&&(this.yylineno-=le.length-1);var ve=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:le?(le.length===ke.length?this.yylloc.first_column:0)+ke[ke.length-le.length].length-le[0].length:this.yylloc.first_column-se},this.options.ranges&&(this.yylloc.range=[ve[0],ve[0]+this.yyleng-se]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(z){this.unput(this.match.slice(z))},"less"),pastInput:o(function(){var z=this.matched.substr(0,this.matched.length-this.match.length);return(z.length>20?"...":"")+z.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var z=this.match;return z.length<20&&(z+=this._input.substr(0,20-z.length)),(z.substr(0,20)+(z.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var z=this.pastInput(),se=new Array(z.length+1).join("-");return z+this.upcomingInput()+` +`+se+"^"},"showPosition"),test_match:o(function(z,se){var le,ke,ve;if(this.options.backtrack_lexer&&(ve={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ve.yylloc.range=this.yylloc.range.slice(0))),ke=z[0].match(/(?:\r\n?|\n).*/g),ke&&(this.yylineno+=ke.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ke?ke[ke.length-1].length-ke[ke.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+z[0].length},this.yytext+=z[0],this.match+=z[0],this.matches=z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(z[0].length),this.matched+=z[0],le=this.performAction.call(this,this.yy,this,se,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),le)return le;if(this._backtrack){for(var ye in ve)this[ye]=ve[ye];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var z,se,le,ke;this._more||(this.yytext="",this.match="");for(var ve=this._currentRules(),ye=0;yese[0].length)){if(se=le,ke=ye,this.options.backtrack_lexer){if(z=this.test_match(le,ve[ye]),z!==!1)return z;if(this._backtrack){se=!1;continue}else return!1}else if(!this.options.flex)break}return se?(z=this.test_match(se,ve[ke]),z!==!1?z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var se=this.next();return se||this.lex()},"lex"),begin:o(function(se){this.conditionStack.push(se)},"begin"),popState:o(function(){var se=this.conditionStack.length-1;return se>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(se){return se=this.conditionStack.length-1-Math.abs(se||0),se>=0?this.conditionStack[se]:"INITIAL"},"topState"),pushState:o(function(se){this.begin(se)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(se,le,ke,ve){var ye=ve;switch(ke){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return he})();fe.lexer=xe;function W(){this.yy={}}return o(W,"Parser"),W.prototype=fe,fe.Parser=W,new W})();FF.parser=FF;O1e=FF});var Ts,V6,B1e=N(()=>{"use strict";yr();La();pt();Oy();Ts=mh(),V6=class{constructor(){this.classes=new Map;this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{o(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:ur.quadrantChart?.chartWidth||500,chartWidth:ur.quadrantChart?.chartHeight||500,titlePadding:ur.quadrantChart?.titlePadding||10,titleFontSize:ur.quadrantChart?.titleFontSize||20,quadrantPadding:ur.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:ur.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:ur.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:ur.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:ur.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:ur.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:ur.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:ur.quadrantChart?.pointTextPadding||5,pointLabelFontSize:ur.quadrantChart?.pointLabelFontSize||12,pointRadius:ur.quadrantChart?.pointRadius||5,xAxisPosition:ur.quadrantChart?.xAxisPosition||"top",yAxisPosition:ur.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:ur.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:ur.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:Ts.quadrant1Fill,quadrant2Fill:Ts.quadrant2Fill,quadrant3Fill:Ts.quadrant3Fill,quadrant4Fill:Ts.quadrant4Fill,quadrant1TextFill:Ts.quadrant1TextFill,quadrant2TextFill:Ts.quadrant2TextFill,quadrant3TextFill:Ts.quadrant3TextFill,quadrant4TextFill:Ts.quadrant4TextFill,quadrantPointFill:Ts.quadrantPointFill,quadrantPointTextFill:Ts.quadrantPointTextFill,quadrantXAxisTextFill:Ts.quadrantXAxisTextFill,quadrantYAxisTextFill:Ts.quadrantYAxisTextFill,quadrantTitleFill:Ts.quadrantTitleFill,quadrantInternalBorderStrokeFill:Ts.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:Ts.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,X.info("clear called")}setData(e){this.data={...this.data,...e}}addPoints(e){this.data.points=[...e,...this.data.points]}addClass(e,r){this.classes.set(e,r)}setConfig(e){X.trace("setConfig called with: ",e),this.config={...this.config,...e}}setThemeConfig(e){X.trace("setThemeConfig called with: ",e),this.themeConfig={...this.themeConfig,...e}}calculateSpace(e,r,n,i){let a=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,s={top:e==="top"&&r?a:0,bottom:e==="bottom"&&r?a:0},l=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,u={left:this.config.yAxisPosition==="left"&&n?l:0,right:this.config.yAxisPosition==="right"&&n?l:0},h=this.config.titleFontSize+this.config.titlePadding*2,f={top:i?h:0},d=this.config.quadrantPadding+u.left,p=this.config.quadrantPadding+s.top+f.top,m=this.config.chartWidth-this.config.quadrantPadding*2-u.left-u.right,g=this.config.chartHeight-this.config.quadrantPadding*2-s.top-s.bottom-f.top,y=m/2,v=g/2;return{xAxisSpace:s,yAxisSpace:u,titleSpace:f,quadrantSpace:{quadrantLeft:d,quadrantTop:p,quadrantWidth:m,quadrantHalfWidth:y,quadrantHeight:g,quadrantHalfHeight:v}}}getAxisLabels(e,r,n,i){let{quadrantSpace:a,titleSpace:s}=i,{quadrantHalfHeight:l,quadrantHeight:u,quadrantLeft:h,quadrantHalfWidth:f,quadrantTop:d,quadrantWidth:p}=a,m=!!this.data.xAxisRightText,g=!!this.data.yAxisTopText,y=[];return this.data.xAxisLeftText&&r&&y.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&r&&y.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+f+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&n&&y.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+u-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&n&&y.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+l-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),y}getQuadrants(e){let{quadrantSpace:r}=e,{quadrantHalfHeight:n,quadrantLeft:i,quadrantHalfWidth:a,quadrantTop:s}=r,l=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s,width:a,height:n,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s,width:a,height:n,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant4Fill}];for(let u of l)u.text.x=u.x+u.width/2,this.data.points.length===0?(u.text.y=u.y+u.height/2,u.text.horizontalPos="middle"):(u.text.y=u.y+this.config.quadrantTextTopPadding,u.text.horizontalPos="top");return l}getQuadrantPoints(e){let{quadrantSpace:r}=e,{quadrantHeight:n,quadrantLeft:i,quadrantTop:a,quadrantWidth:s}=r,l=Tl().domain([0,1]).range([i,s+i]),u=Tl().domain([0,1]).range([n+a,a]);return this.data.points.map(f=>{let d=this.classes.get(f.className);return d&&(f={...d,...f}),{x:l(f.x),y:u(f.y),fill:f.color??this.themeConfig.quadrantPointFill,radius:f.radius??this.config.pointRadius,text:{text:f.text,fill:this.themeConfig.quadrantPointTextFill,x:l(f.x),y:u(f.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:f.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:f.strokeWidth??"0px"}})}getBorders(e){let r=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:n}=e,{quadrantHalfHeight:i,quadrantHeight:a,quadrantLeft:s,quadrantHalfWidth:l,quadrantTop:u,quadrantWidth:h}=n;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u,x2:s+h+r,y2:u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+h,y1:u+r,x2:s+h,y2:u+a-r},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u+a,x2:s+h+r,y2:u+a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:u+r,x2:s,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+l,y1:u+r,x2:s+l,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:u+i,x2:s+h-r,y2:u+i}]}getTitle(e){if(e)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let e=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),r=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),n=this.config.showTitle&&!!this.data.titleText,i=this.data.points.length>0?"bottom":this.config.xAxisPosition,a=this.calculateSpace(i,e,r,n);return{points:this.getQuadrantPoints(a),quadrants:this.getQuadrants(a),axisLabels:this.getAxisLabels(i,e,r,a),borderLines:this.getBorders(a),title:this.getTitle(n)}}}});function $F(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function F1e(t){return!/^\d+$/.test(t)}function $1e(t){return!/^\d+px$/.test(t)}var s0,z1e=N(()=>{"use strict";s0=class extends Error{static{o(this,"InvalidStyleError")}constructor(e,r,n){super(`value for ${e} ${r} is invalid, please use a valid ${n}`),this.name="InvalidStyleError"}};o($F,"validateHexCode");o(F1e,"validateNumber");o($1e,"validateSizeInPixels")});function sh(t){return sr(t.trim(),nZe)}function iZe(t){Ca.setData({quadrant1Text:sh(t.text)})}function aZe(t){Ca.setData({quadrant2Text:sh(t.text)})}function sZe(t){Ca.setData({quadrant3Text:sh(t.text)})}function oZe(t){Ca.setData({quadrant4Text:sh(t.text)})}function lZe(t){Ca.setData({xAxisLeftText:sh(t.text)})}function cZe(t){Ca.setData({xAxisRightText:sh(t.text)})}function uZe(t){Ca.setData({yAxisTopText:sh(t.text)})}function hZe(t){Ca.setData({yAxisBottomText:sh(t.text)})}function zF(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(F1e(i))throw new s0(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if($F(i))throw new s0(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if($F(i))throw new s0(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if($1e(i))throw new s0(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function fZe(t,e,r,n,i){let a=zF(i);Ca.addPoints([{x:r,y:n,text:sh(t.text),className:e,...a}])}function dZe(t,e){Ca.addClass(t,zF(e))}function pZe(t){Ca.setConfig({chartWidth:t})}function mZe(t){Ca.setConfig({chartHeight:t})}function gZe(){let t=ge(),{themeVariables:e,quadrantChart:r}=t;return r&&Ca.setConfig(r),Ca.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),Ca.setData({titleText:Pr()}),Ca.build()}var nZe,Ca,yZe,G1e,V1e=N(()=>{"use strict";Xt();gr();ci();B1e();z1e();nZe=ge();o(sh,"textSanitizer");Ca=new V6;o(iZe,"setQuadrant1Text");o(aZe,"setQuadrant2Text");o(sZe,"setQuadrant3Text");o(oZe,"setQuadrant4Text");o(lZe,"setXAxisLeftText");o(cZe,"setXAxisRightText");o(uZe,"setYAxisTopText");o(hZe,"setYAxisBottomText");o(zF,"parseStyles");o(fZe,"addPoint");o(dZe,"addClass");o(pZe,"setWidth");o(mZe,"setHeight");o(gZe,"getQuadrantData");yZe=o(function(){Ca.clear(),Sr()},"clear"),G1e={setWidth:pZe,setHeight:mZe,setQuadrant1Text:iZe,setQuadrant2Text:aZe,setQuadrant3Text:sZe,setQuadrant4Text:oZe,setXAxisLeftText:lZe,setXAxisRightText:cZe,setYAxisTopText:uZe,setYAxisBottomText:hZe,parseStyles:zF,addPoint:fZe,addClass:dZe,getQuadrantData:gZe,clear:yZe,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,getAccDescription:Or,setAccDescription:Ir}});var vZe,U1e,H1e=N(()=>{"use strict";yr();Xt();pt();Ei();vZe=o((t,e,r,n)=>{function i(C){return C==="top"?"hanging":"middle"}o(i,"getDominantBaseLine");function a(C){return C==="left"?"start":"middle"}o(a,"getTextAnchor");function s(C){return`translate(${C.x}, ${C.y}) rotate(${C.rotation||0})`}o(s,"getTransformation");let l=ge();X.debug(`Rendering quadrant chart +`+t);let u=l.securityLevel,h;u==="sandbox"&&(h=qe("#i"+e));let d=(u==="sandbox"?qe(h.nodes()[0].contentDocument.body):qe("body")).select(`[id="${e}"]`),p=d.append("g").attr("class","main"),m=l.quadrantChart?.chartWidth??500,g=l.quadrantChart?.chartHeight??500;mn(d,g,m,l.quadrantChart?.useMaxWidth??!0),d.attr("viewBox","0 0 "+m+" "+g),n.db.setHeight(g),n.db.setWidth(m);let y=n.db.getQuadrantData(),v=p.append("g").attr("class","quadrants"),x=p.append("g").attr("class","border"),b=p.append("g").attr("class","data-points"),T=p.append("g").attr("class","labels"),S=p.append("g").attr("class","title");y.title&&S.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",i(y.title.horizontalPos)).attr("text-anchor",a(y.title.verticalPos)).attr("transform",s(y.title)).text(y.title.text),y.borderLines&&x.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",C=>C.x1).attr("y1",C=>C.y1).attr("x2",C=>C.x2).attr("y2",C=>C.y2).style("stroke",C=>C.strokeFill).style("stroke-width",C=>C.strokeWidth);let w=v.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");w.append("rect").attr("x",C=>C.x).attr("y",C=>C.y).attr("width",C=>C.width).attr("height",C=>C.height).attr("fill",C=>C.fill),w.append("text").attr("x",0).attr("y",0).attr("fill",C=>C.text.fill).attr("font-size",C=>C.text.fontSize).attr("dominant-baseline",C=>i(C.text.horizontalPos)).attr("text-anchor",C=>a(C.text.verticalPos)).attr("transform",C=>s(C.text)).text(C=>C.text.text),T.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(C=>C.text).attr("fill",C=>C.fill).attr("font-size",C=>C.fontSize).attr("dominant-baseline",C=>i(C.horizontalPos)).attr("text-anchor",C=>a(C.verticalPos)).attr("transform",C=>s(C));let A=b.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");A.append("circle").attr("cx",C=>C.x).attr("cy",C=>C.y).attr("r",C=>C.radius).attr("fill",C=>C.fill).attr("stroke",C=>C.strokeColor).attr("stroke-width",C=>C.strokeWidth),A.append("text").attr("x",0).attr("y",0).text(C=>C.text.text).attr("fill",C=>C.text.fill).attr("font-size",C=>C.text.fontSize).attr("dominant-baseline",C=>i(C.text.horizontalPos)).attr("text-anchor",C=>a(C.text.verticalPos)).attr("transform",C=>s(C.text))},"draw"),U1e={draw:vZe}});var q1e={};dr(q1e,{diagram:()=>xZe});var xZe,W1e=N(()=>{"use strict";P1e();V1e();H1e();xZe={parser:O1e,db:G1e,renderer:U1e,styles:o(()=>"","styles")}});var GF,j1e,K1e=N(()=>{"use strict";GF=(function(){var t=o(function(O,M,P,B){for(P=P||{},B=O.length;B--;P[O[B]]=M);return P},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],l=[1,5,10,12,14,16,18,19,21,23,34,35,36],u=[1,25],h=[1,26],f=[1,28],d=[1,29],p=[1,30],m=[1,31],g=[1,32],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],S=[1,43],w=[1,42],k=[1,47],A=[1,50],C=[1,10,12,14,16,18,19,21,23,34,35,36],R=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],I=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],L=[1,64],E={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:o(function(M,P,B,F,G,$,U){var j=$.length-1;switch(G){case 5:F.setOrientation($[j]);break;case 9:F.setDiagramTitle($[j].text.trim());break;case 12:F.setLineData({text:"",type:"text"},$[j]);break;case 13:F.setLineData($[j-1],$[j]);break;case 14:F.setBarData({text:"",type:"text"},$[j]);break;case 15:F.setBarData($[j-1],$[j]);break;case 16:this.$=$[j].trim(),F.setAccTitle(this.$);break;case 17:case 18:this.$=$[j].trim(),F.setAccDescription(this.$);break;case 19:this.$=$[j-1];break;case 20:this.$=[Number($[j-2]),...$[j]];break;case 21:this.$=[Number($[j])];break;case 22:F.setXAxisTitle($[j]);break;case 23:F.setXAxisTitle($[j-1]);break;case 24:F.setXAxisTitle({type:"text",text:""});break;case 25:F.setXAxisBand($[j]);break;case 26:F.setXAxisRangeData(Number($[j-2]),Number($[j]));break;case 27:this.$=$[j-1];break;case 28:this.$=[$[j-2],...$[j]];break;case 29:this.$=[$[j]];break;case 30:F.setYAxisTitle($[j]);break;case 31:F.setYAxisTitle($[j-1]);break;case 32:F.setYAxisTitle({type:"text",text:""});break;case 33:F.setYAxisRangeData(Number($[j-2]),Number($[j]));break;case 37:this.$={text:$[j],type:"text"};break;case 38:this.$={text:$[j],type:"text"};break;case 39:this.$={text:$[j],type:"markdown"};break;case 40:this.$=$[j];break;case 41:this.$=$[j-1]+""+$[j];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(l,[2,34]),t(l,[2,35]),t(l,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(l,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:39,13:38,24:S,27:w,29:40,30:41,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:45,15:44,27:k,33:46,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:49,17:48,24:A,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:52,17:51,24:A,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{20:[1,53]},{22:[1,54]},t(C,[2,18]),{1:[2,2]},t(C,[2,8]),t(C,[2,9]),t(R,[2,37],{40:55,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T}),t(R,[2,38]),t(R,[2,39]),t(I,[2,40]),t(I,[2,42]),t(I,[2,43]),t(I,[2,44]),t(I,[2,45]),t(I,[2,46]),t(I,[2,47]),t(I,[2,48]),t(I,[2,49]),t(I,[2,50]),t(I,[2,51]),t(C,[2,10]),t(C,[2,22],{30:41,29:56,24:S,27:w}),t(C,[2,24]),t(C,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(C,[2,11]),t(C,[2,30],{33:60,27:k}),t(C,[2,32]),{31:[1,61]},t(C,[2,12]),{17:62,24:A},{25:63,27:L},t(C,[2,14]),{17:65,24:A},t(C,[2,16]),t(C,[2,17]),t(I,[2,41]),t(C,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(C,[2,31]),{27:[1,69]},t(C,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(C,[2,15]),t(C,[2,26]),t(C,[2,27]),{11:59,32:72,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(C,[2,33]),t(C,[2,19]),{25:73,27:L},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:o(function(M,P){if(P.recoverable)this.trace(M);else{var B=new Error(M);throw B.hash=P,B}},"parseError"),parse:o(function(M){var P=this,B=[0],F=[],G=[null],$=[],U=this.table,j="",te=0,Y=0,oe=0,J=2,ue=1,re=$.slice.call(arguments,1),ee=Object.create(this.lexer),Z={yy:{}};for(var K in this.yy)Object.prototype.hasOwnProperty.call(this.yy,K)&&(Z.yy[K]=this.yy[K]);ee.setInput(M,Z.yy),Z.yy.lexer=ee,Z.yy.parser=this,typeof ee.yylloc>"u"&&(ee.yylloc={});var ae=ee.yylloc;$.push(ae);var Q=ee.options&&ee.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function de(fe){B.length=B.length-2*fe,G.length=G.length-fe,$.length=$.length-fe}o(de,"popStack");function ne(){var fe;return fe=F.pop()||ee.lex()||ue,typeof fe!="number"&&(fe instanceof Array&&(F=fe,fe=F.pop()),fe=P.symbols_[fe]||fe),fe}o(ne,"lex");for(var Te,q,Ve,pe,Be,Ye,He={},Le,Ie,Ne,Ce;;){if(Ve=B[B.length-1],this.defaultActions[Ve]?pe=this.defaultActions[Ve]:((Te===null||typeof Te>"u")&&(Te=ne()),pe=U[Ve]&&U[Ve][Te]),typeof pe>"u"||!pe.length||!pe[0]){var Fe="";Ce=[];for(Le in U[Ve])this.terminals_[Le]&&Le>J&&Ce.push("'"+this.terminals_[Le]+"'");ee.showPosition?Fe="Parse error on line "+(te+1)+`: +`+ee.showPosition()+` +Expecting `+Ce.join(", ")+", got '"+(this.terminals_[Te]||Te)+"'":Fe="Parse error on line "+(te+1)+": Unexpected "+(Te==ue?"end of input":"'"+(this.terminals_[Te]||Te)+"'"),this.parseError(Fe,{text:ee.match,token:this.terminals_[Te]||Te,line:ee.yylineno,loc:ae,expected:Ce})}if(pe[0]instanceof Array&&pe.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ve+", token: "+Te);switch(pe[0]){case 1:B.push(Te),G.push(ee.yytext),$.push(ee.yylloc),B.push(pe[1]),Te=null,q?(Te=q,q=null):(Y=ee.yyleng,j=ee.yytext,te=ee.yylineno,ae=ee.yylloc,oe>0&&oe--);break;case 2:if(Ie=this.productions_[pe[1]][1],He.$=G[G.length-Ie],He._$={first_line:$[$.length-(Ie||1)].first_line,last_line:$[$.length-1].last_line,first_column:$[$.length-(Ie||1)].first_column,last_column:$[$.length-1].last_column},Q&&(He._$.range=[$[$.length-(Ie||1)].range[0],$[$.length-1].range[1]]),Ye=this.performAction.apply(He,[j,Y,te,Z.yy,pe[1],G,$].concat(re)),typeof Ye<"u")return Ye;Ie&&(B=B.slice(0,-1*Ie*2),G=G.slice(0,-1*Ie),$=$.slice(0,-1*Ie)),B.push(this.productions_[pe[1]][0]),G.push(He.$),$.push(He._$),Ne=U[B[B.length-2]][B[B.length-1]],B.push(Ne);break;case 3:return!0}}return!0},"parse")},D=(function(){var O={EOF:1,parseError:o(function(P,B){if(this.yy.parser)this.yy.parser.parseError(P,B);else throw new Error(P)},"parseError"),setInput:o(function(M,P){return this.yy=P||this.yy||{},this._input=M,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var M=this._input[0];this.yytext+=M,this.yyleng++,this.offset++,this.match+=M,this.matched+=M;var P=M.match(/(?:\r\n?|\n).*/g);return P?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),M},"input"),unput:o(function(M){var P=M.length,B=M.split(/(?:\r\n?|\n)/g);this._input=M+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-P),this.offset-=P;var F=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),B.length-1&&(this.yylineno-=B.length-1);var G=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:B?(B.length===F.length?this.yylloc.first_column:0)+F[F.length-B.length].length-B[0].length:this.yylloc.first_column-P},this.options.ranges&&(this.yylloc.range=[G[0],G[0]+this.yyleng-P]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(M){this.unput(this.match.slice(M))},"less"),pastInput:o(function(){var M=this.matched.substr(0,this.matched.length-this.match.length);return(M.length>20?"...":"")+M.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var M=this.match;return M.length<20&&(M+=this._input.substr(0,20-M.length)),(M.substr(0,20)+(M.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var M=this.pastInput(),P=new Array(M.length+1).join("-");return M+this.upcomingInput()+` +`+P+"^"},"showPosition"),test_match:o(function(M,P){var B,F,G;if(this.options.backtrack_lexer&&(G={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(G.yylloc.range=this.yylloc.range.slice(0))),F=M[0].match(/(?:\r\n?|\n).*/g),F&&(this.yylineno+=F.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:F?F[F.length-1].length-F[F.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+M[0].length},this.yytext+=M[0],this.match+=M[0],this.matches=M,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(M[0].length),this.matched+=M[0],B=this.performAction.call(this,this.yy,this,P,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),B)return B;if(this._backtrack){for(var $ in G)this[$]=G[$];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var M,P,B,F;this._more||(this.yytext="",this.match="");for(var G=this._currentRules(),$=0;$P[0].length)){if(P=B,F=$,this.options.backtrack_lexer){if(M=this.test_match(B,G[$]),M!==!1)return M;if(this._backtrack){P=!1;continue}else return!1}else if(!this.options.flex)break}return P?(M=this.test_match(P,G[F]),M!==!1?M:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var P=this.next();return P||this.lex()},"lex"),begin:o(function(P){this.conditionStack.push(P)},"begin"),popState:o(function(){var P=this.conditionStack.length-1;return P>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(P){return P=this.conditionStack.length-1-Math.abs(P||0),P>=0?this.conditionStack[P]:"INITIAL"},"topState"),pushState:o(function(P){this.begin(P)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(P,B,F,G){var $=G;switch(F){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 5;case 16:return 8;case 17:return this.pushState("axis_data"),"X_AXIS";break;case 18:return this.pushState("axis_data"),"Y_AXIS";break;case 19:return this.pushState("axis_band_data"),24;break;case 20:return 31;case 21:return this.pushState("data"),16;break;case 22:return this.pushState("data"),18;break;case 23:return this.pushState("data_inner"),24;break;case 24:return 27;case 25:return this.popState(),26;break;case 26:this.popState();break;case 27:this.pushState("string");break;case 28:this.popState();break;case 29:return"STR";case 30:return 24;case 31:return 26;case 32:return 43;case 33:return"COLON";case 34:return 44;case 35:return 28;case 36:return 45;case 37:return 46;case 38:return 48;case 39:return 50;case 40:return 47;case 41:return 41;case 42:return 49;case 43:return 42;case 44:break;case 45:return 35;case 46:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:xychart\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,24,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,18,21,22,23,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,25,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,22,24,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[28,29],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,18,21,22,26,27,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],inclusive:!0}}};return O})();E.lexer=D;function _(){this.yy={}}return o(_,"Parser"),_.prototype=E,E.Parser=_,new _})();GF.parser=GF;j1e=GF});function VF(t){return t.type==="bar"}function U6(t){return t.type==="band"}function ry(t){return t.type==="linear"}var H6=N(()=>{"use strict";o(VF,"isBarPlot");o(U6,"isBandAxisData");o(ry,"isLinearAxisData")});var ny,UF=N(()=>{"use strict";zo();ny=class{constructor(e){this.parentGroup=e}static{o(this,"TextDimensionCalculatorWithFont")}getMaxDimension(e,r){if(!this.parentGroup)return{width:e.reduce((a,s)=>Math.max(s.length,a),0)*r,height:r};let n={width:0,height:0},i=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",r);for(let a of e){let s=qZ(i,1,a),l=s?s.width:a.length*r,u=s?s.height:r;n.width=Math.max(n.width,l),n.height=Math.max(n.height,u)}return i.remove(),n}}});var iy,HF=N(()=>{"use strict";iy=class{constructor(e,r,n,i){this.axisConfig=e;this.title=r;this.textDimensionCalculator=n;this.axisThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0};this.axisPosition="left";this.showTitle=!1;this.showLabel=!1;this.showTick=!1;this.showAxisLine=!1;this.outerPadding=0;this.titleTextHeight=0;this.labelTextHeight=0;this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{o(this,"BaseAxis")}setRange(e){this.range=e,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let r=e.height;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.width;this.outerPadding=Math.min(n.width/2,i);let a=n.height+this.axisConfig.labelPadding*2;this.labelTextHeight=n.height,a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-r}calculateSpaceIfDrawnVertical(e){let r=e.width;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.height;this.outerPadding=Math.min(n.height/2,i);let a=n.width+this.axisConfig.labelPadding*2;a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width-r,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${r},${this.boundingRect.y} L ${r},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(r),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let r=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${r},${this.getScaleValue(n)} L ${r-this.axisConfig.tickLength},${this.getScaleValue(n)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r} L ${this.getScaleValue(n)},${r+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y;e.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(n)},${r+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}});var q6,Q1e=N(()=>{"use strict";yr();pt();HF();q6=class extends iy{static{o(this,"BandAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.categories=n,this.scale=q0().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=q0().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),X.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}}});var W6,Z1e=N(()=>{"use strict";yr();HF();W6=class extends iy{static{o(this,"LinearAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.domain=n,this.scale=Tl().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition==="left"&&e.reverse(),this.scale=Tl().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}}});function qF(t,e,r,n){let i=new ny(n);return U6(t)?new q6(e,r,t.categories,t.title,i):new W6(e,r,[t.min,t.max],t.title,i)}var J1e=N(()=>{"use strict";H6();UF();Q1e();Z1e();o(qF,"getAxis")});function eye(t,e,r,n){let i=new ny(n);return new WF(i,t,e,r)}var WF,tye=N(()=>{"use strict";UF();WF=class{constructor(e,r,n,i){this.textDimensionCalculator=e;this.chartConfig=r;this.chartData=n;this.chartThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{o(this,"ChartTitle")}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let r=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(r.width,e.width),i=r.height+2*this.chartConfig.titlePadding;return r.width<=n&&r.height<=i&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=i,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};o(eye,"getChartTitleComponent")});var Y6,rye=N(()=>{"use strict";yr();Y6=class{constructor(e,r,n,i,a){this.plotData=e;this.xAxis=r;this.yAxis=n;this.orientation=i;this.plotIndex=a}static{o(this,"LinePlot")}getDrawableElement(){let e=this.plotData.data.map(n=>[this.xAxis.getScaleValue(n[0]),this.yAxis.getScaleValue(n[1])]),r;return this.orientation==="horizontal"?r=Cl().y(n=>n[0]).x(n=>n[1])(e):r=Cl().x(n=>n[0]).y(n=>n[1])(e),r?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:r,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}});var X6,nye=N(()=>{"use strict";X6=class{constructor(e,r,n,i,a,s){this.barData=e;this.boundingRect=r;this.xAxis=n;this.yAxis=i;this.orientation=a;this.plotIndex=s}static{o(this,"BarPlot")}getDrawableElement(){let e=this.barData.data.map(a=>[this.xAxis.getScaleValue(a[0]),this.yAxis.getScaleValue(a[1])]),n=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),i=n/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:this.boundingRect.x,y:a[0]-i,height:n,width:a[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:a[0]-i,y:a[1],width:n,height:this.boundingRect.y+this.boundingRect.height-a[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}});function iye(t,e,r){return new YF(t,e,r)}var YF,aye=N(()=>{"use strict";rye();nye();YF=class{constructor(e,r,n){this.chartConfig=e;this.chartData=r;this.chartThemeConfig=n;this.boundingRect={x:0,y:0,width:0,height:0}}static{o(this,"BasePlot")}setAxes(e,r){this.xAxis=e,this.yAxis=r}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let e=[];for(let[r,n]of this.chartData.plots.entries())switch(n.type){case"line":{let i=new Y6(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break;case"bar":{let i=new X6(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break}return e}};o(iye,"getPlotComponent")});var j6,sye=N(()=>{"use strict";J1e();tye();aye();H6();j6=class{constructor(e,r,n,i){this.chartConfig=e;this.chartData=r;this.componentStore={title:eye(e,r,n,i),plot:iye(e,r,n),xAxis:qF(r.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},i),yAxis:qF(r.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},i)}}static{o(this,"Orchestrator")}calculateVerticalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),l=this.componentStore.plot.calculateSpace({width:a,height:s});e-=l.width,r-=l.height,l=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),i=l.height,r-=l.height,this.componentStore.xAxis.setAxisPosition("bottom"),l=this.componentStore.xAxis.calculateSpace({width:e,height:r}),r-=l.height,this.componentStore.yAxis.setAxisPosition("left"),l=this.componentStore.yAxis.calculateSpace({width:e,height:r}),n=l.width,e-=l.width,e>0&&(a+=e,e=0),r>0&&(s+=r,r=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:i+s}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(u=>VF(u))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=0,s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),l=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),u=this.componentStore.plot.calculateSpace({width:s,height:l});e-=u.width,r-=u.height,u=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),n=u.height,r-=u.height,this.componentStore.xAxis.setAxisPosition("left"),u=this.componentStore.xAxis.calculateSpace({width:e,height:r}),e-=u.width,i=u.width,this.componentStore.yAxis.setAxisPosition("top"),u=this.componentStore.yAxis.calculateSpace({width:e,height:r}),r-=u.height,a=n+u.height,e>0&&(s+=e,e=0),r>0&&(l+=r,r=0),this.componentStore.plot.calculateSpace({width:s,height:l}),this.componentStore.plot.setBoundingBoxXY({x:i,y:a}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:i,y:n}),this.componentStore.xAxis.setRange([a,a+l]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(h=>VF(h))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let r of Object.values(this.componentStore))e.push(...r.getDrawableElements());return e}}});var K6,oye=N(()=>{"use strict";sye();K6=class{static{o(this,"XYChartBuilder")}static build(e,r,n,i){return new j6(e,r,n,i).getDrawableElement()}}});function cye(){let t=mh(),e=Qt();return Vn(t.xyChart,e.themeVariables.xyChart)}function uye(){let t=Qt();return Vn(ur.xyChart,t.xyChart)}function hye(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function KF(t){let e=Qt();return sr(t.trim(),e)}function kZe(t){lye=t}function EZe(t){t==="horizontal"?v4.chartOrientation="horizontal":v4.chartOrientation="vertical"}function SZe(t){pn.xAxis.title=KF(t.text)}function fye(t,e){pn.xAxis={type:"linear",title:pn.xAxis.title,min:t,max:e},Q6=!0}function CZe(t){pn.xAxis={type:"band",title:pn.xAxis.title,categories:t.map(e=>KF(e.text))},Q6=!0}function AZe(t){pn.yAxis.title=KF(t.text)}function _Ze(t,e){pn.yAxis={type:"linear",title:pn.yAxis.title,min:t,max:e},jF=!0}function DZe(t){let e=Math.min(...t),r=Math.max(...t),n=ry(pn.yAxis)?pn.yAxis.min:1/0,i=ry(pn.yAxis)?pn.yAxis.max:-1/0;pn.yAxis={type:"linear",title:pn.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function dye(t){let e=[];if(t.length===0)return e;if(!Q6){let r=ry(pn.xAxis)?pn.xAxis.min:1/0,n=ry(pn.xAxis)?pn.xAxis.max:-1/0;fye(Math.min(r,1),Math.max(n,t.length))}if(jF||DZe(t),U6(pn.xAxis)&&(e=pn.xAxis.categories.map((r,n)=>[r,t[n]])),ry(pn.xAxis)){let r=pn.xAxis.min,n=pn.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,l)=>[s,t[l]])}return e}function pye(t){return XF[t===0?0:t%XF.length]}function LZe(t,e){let r=dye(e);pn.plots.push({type:"line",strokeFill:pye(y4),strokeWidth:2,data:r}),y4++}function RZe(t,e){let r=dye(e);pn.plots.push({type:"bar",fill:pye(y4),data:r}),y4++}function NZe(){if(pn.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return pn.title=Pr(),K6.build(v4,pn,x4,lye)}function MZe(){return x4}function IZe(){return v4}function OZe(){return pn}var y4,lye,v4,x4,pn,XF,Q6,jF,PZe,mye,gye=N(()=>{"use strict";qn();La();Oy();tr();gr();ci();oye();H6();y4=0,v4=uye(),x4=cye(),pn=hye(),XF=x4.plotColorPalette.split(",").map(t=>t.trim()),Q6=!1,jF=!1;o(cye,"getChartDefaultThemeConfig");o(uye,"getChartDefaultConfig");o(hye,"getChartDefaultData");o(KF,"textSanitizer");o(kZe,"setTmpSVGG");o(EZe,"setOrientation");o(SZe,"setXAxisTitle");o(fye,"setXAxisRangeData");o(CZe,"setXAxisBand");o(AZe,"setYAxisTitle");o(_Ze,"setYAxisRangeData");o(DZe,"setYAxisRangeFromPlotData");o(dye,"transformDataWithoutCategory");o(pye,"getPlotColorFromPalette");o(LZe,"setLineData");o(RZe,"setBarData");o(NZe,"getDrawableElem");o(MZe,"getChartThemeConfig");o(IZe,"getChartConfig");o(OZe,"getXYChartData");PZe=o(function(){Sr(),y4=0,v4=uye(),pn=hye(),x4=cye(),XF=x4.plotColorPalette.split(",").map(t=>t.trim()),Q6=!1,jF=!1},"clear"),mye={getDrawableElem:NZe,clear:PZe,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,getAccDescription:Or,setAccDescription:Ir,setOrientation:EZe,setXAxisTitle:SZe,setXAxisRangeData:fye,setXAxisBand:CZe,setYAxisTitle:AZe,setYAxisRangeData:_Ze,setLineData:LZe,setBarData:RZe,setTmpSVGG:kZe,getChartThemeConfig:MZe,getChartConfig:IZe,getXYChartData:OZe}});var BZe,yye,vye=N(()=>{"use strict";pt();tu();Ei();BZe=o((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig(),l=i.getXYChartData().plots[0].data.map(T=>T[1]);function u(T){return T==="top"?"text-before-edge":"middle"}o(u,"getDominantBaseLine");function h(T){return T==="left"?"start":T==="right"?"end":"middle"}o(h,"getTextAnchor");function f(T){return`translate(${T.x}, ${T.y}) rotate(${T.rotation||0})`}o(f,"getTextTransformation"),X.debug(`Rendering xychart chart +`+t);let d=aa(e),p=d.append("g").attr("class","main"),m=p.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");mn(d,s.height,s.width,!0),d.attr("viewBox",`0 0 ${s.width} ${s.height}`),m.attr("fill",a.backgroundColor),i.setTmpSVGG(d.append("g").attr("class","mermaid-tmp-group"));let g=i.getDrawableElem(),y={};function v(T){let S=p,w="";for(let[k]of T.entries()){let A=p;k>0&&y[w]&&(A=y[w]),w+=T[k],S=y[w],S||(S=y[w]=A.append("g").attr("class",T[k]))}return S}o(v,"getGroup");for(let T of g){if(T.data.length===0)continue;let S=v(T.groupTexts);switch(T.type){case"rect":if(S.selectAll("rect").data(T.data).enter().append("rect").attr("x",w=>w.x).attr("y",w=>w.y).attr("width",w=>w.width).attr("height",w=>w.height).attr("fill",w=>w.fill).attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth),s.showDataLabel)if(s.chartOrientation==="horizontal"){let A=function(I,L){let{data:E,label:D}=I;return L*D.length*.7<=E.width-10};var x=A;o(A,"fitsHorizontally");let w=.7,k=T.data.map((I,L)=>({data:I,label:l[L].toString()})).filter(I=>I.data.width>0&&I.data.height>0),C=k.map(I=>{let{data:L}=I,E=L.height*.7;for(;!A(I,E)&&E>0;)E-=1;return E}),R=Math.floor(Math.min(...C));S.selectAll("text").data(k).enter().append("text").attr("x",I=>I.data.x+I.data.width-10).attr("y",I=>I.data.y+I.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${R}px`).text(I=>I.label)}else{let A=function(I,L,E){let{data:D,label:_}=I,M=L*_.length*.7,P=D.x+D.width/2,B=P-M/2,F=P+M/2,G=B>=D.x&&F<=D.x+D.width,$=D.y+E+L<=D.y+D.height;return G&&$};var b=A;o(A,"fitsInBar");let w=10,k=T.data.map((I,L)=>({data:I,label:l[L].toString()})).filter(I=>I.data.width>0&&I.data.height>0),C=k.map(I=>{let{data:L,label:E}=I,D=L.width/(E.length*.7);for(;!A(I,D,10)&&D>0;)D-=1;return D}),R=Math.floor(Math.min(...C));S.selectAll("text").data(k).enter().append("text").attr("x",I=>I.data.x+I.data.width/2).attr("y",I=>I.data.y+10).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${R}px`).text(I=>I.label)}break;case"text":S.selectAll("text").data(T.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",w=>w.fill).attr("font-size",w=>w.fontSize).attr("dominant-baseline",w=>u(w.verticalPos)).attr("text-anchor",w=>h(w.horizontalPos)).attr("transform",w=>f(w)).text(w=>w.text);break;case"path":S.selectAll("path").data(T.data).enter().append("path").attr("d",w=>w.path).attr("fill",w=>w.fill?w.fill:"none").attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth);break}}},"draw"),yye={draw:BZe}});var xye={};dr(xye,{diagram:()=>FZe});var FZe,bye=N(()=>{"use strict";K1e();gye();vye();FZe={parser:j1e,db:mye,renderer:yye}});var QF,kye,Eye=N(()=>{"use strict";QF=(function(){var t=o(function(fe,xe,W,he){for(W=W||{},he=fe.length;he--;W[fe[he]]=xe);return W},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],s=[1,22],l=[2,7],u=[1,26],h=[1,27],f=[1,28],d=[1,29],p=[1,33],m=[1,34],g=[1,35],y=[1,36],v=[1,37],x=[1,38],b=[1,24],T=[1,31],S=[1,32],w=[1,30],k=[1,39],A=[1,40],C=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],R=[1,61],I=[89,90],L=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],E=[27,29],D=[1,70],_=[1,71],O=[1,72],M=[1,73],P=[1,74],B=[1,75],F=[1,76],G=[1,83],$=[1,80],U=[1,84],j=[1,85],te=[1,86],Y=[1,87],oe=[1,88],J=[1,89],ue=[1,90],re=[1,91],ee=[1,92],Z=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],K=[63,64],ae=[1,101],Q=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],de=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],ne=[1,110],Te=[1,106],q=[1,107],Ve=[1,108],pe=[1,109],Be=[1,111],Ye=[1,116],He=[1,117],Le=[1,114],Ie=[1,115],Ne={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(xe,W,he,z,se,le,ke){var ve=le.length-1;switch(se){case 4:this.$=le[ve].trim(),z.setAccTitle(this.$);break;case 5:case 6:this.$=le[ve].trim(),z.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:z.setDirection("TB");break;case 18:z.setDirection("BT");break;case 19:z.setDirection("RL");break;case 20:z.setDirection("LR");break;case 21:z.addRequirement(le[ve-3],le[ve-4]);break;case 22:z.addRequirement(le[ve-5],le[ve-6]),z.setClass([le[ve-5]],le[ve-3]);break;case 23:z.setNewReqId(le[ve-2]);break;case 24:z.setNewReqText(le[ve-2]);break;case 25:z.setNewReqRisk(le[ve-2]);break;case 26:z.setNewReqVerifyMethod(le[ve-2]);break;case 29:this.$=z.RequirementType.REQUIREMENT;break;case 30:this.$=z.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=z.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=z.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=z.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=z.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=z.RiskLevel.LOW_RISK;break;case 36:this.$=z.RiskLevel.MED_RISK;break;case 37:this.$=z.RiskLevel.HIGH_RISK;break;case 38:this.$=z.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=z.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=z.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=z.VerifyType.VERIFY_TEST;break;case 42:z.addElement(le[ve-3]);break;case 43:z.addElement(le[ve-5]),z.setClass([le[ve-5]],le[ve-3]);break;case 44:z.setNewElementType(le[ve-2]);break;case 45:z.setNewElementDocRef(le[ve-2]);break;case 48:z.addRelationship(le[ve-2],le[ve],le[ve-4]);break;case 49:z.addRelationship(le[ve-2],le[ve-4],le[ve]);break;case 50:this.$=z.Relationships.CONTAINS;break;case 51:this.$=z.Relationships.COPIES;break;case 52:this.$=z.Relationships.DERIVES;break;case 53:this.$=z.Relationships.SATISFIES;break;case 54:this.$=z.Relationships.VERIFIES;break;case 55:this.$=z.Relationships.REFINES;break;case 56:this.$=z.Relationships.TRACES;break;case 57:this.$=le[ve-2],z.defineClass(le[ve-1],le[ve]);break;case 58:z.setClass(le[ve-1],le[ve]);break;case 59:z.setClass([le[ve-2]],le[ve]);break;case 60:case 62:this.$=[le[ve]];break;case 61:case 63:this.$=le[ve-2].concat([le[ve]]);break;case 64:this.$=le[ve-2],z.setCssStyle(le[ve-1],le[ve]);break;case 65:this.$=[le[ve]];break;case 66:le[ve-2].push(le[ve]),this.$=le[ve-2];break;case 68:this.$=le[ve-1]+le[ve];break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:s,7:42,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:43,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:44,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:45,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:46,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:47,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:48,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:49,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{4:17,5:s,7:50,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:k,90:A},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},t(C,[2,17]),t(C,[2,18]),t(C,[2,19]),t(C,[2,20]),{30:60,33:62,75:R,89:k,90:A},{30:63,33:62,75:R,89:k,90:A},{30:64,33:62,75:R,89:k,90:A},t(I,[2,29]),t(I,[2,30]),t(I,[2,31]),t(I,[2,32]),t(I,[2,33]),t(I,[2,34]),t(L,[2,81]),t(L,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},t(E,[2,79]),t(E,[2,80]),{27:[1,67],29:[1,68]},t(E,[2,85]),t(E,[2,86]),{62:69,65:D,66:_,67:O,68:M,69:P,70:B,71:F},{62:77,65:D,66:_,67:O,68:M,69:P,70:B,71:F},{30:78,33:62,75:R,89:k,90:A},{73:79,75:G,76:$,78:81,79:82,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee},t(Z,[2,60]),t(Z,[2,62]),{73:93,75:G,76:$,78:81,79:82,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee},{30:94,33:62,75:R,76:$,89:k,90:A},{5:[1,95]},{30:96,33:62,75:R,89:k,90:A},{5:[1,97]},{30:98,33:62,75:R,89:k,90:A},{63:[1,99]},t(K,[2,50]),t(K,[2,51]),t(K,[2,52]),t(K,[2,53]),t(K,[2,54]),t(K,[2,55]),t(K,[2,56]),{64:[1,100]},t(C,[2,59],{76:$}),t(C,[2,64],{76:ae}),{33:103,75:[1,102],89:k,90:A},t(Q,[2,65],{79:104,75:G,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee}),t(de,[2,67]),t(de,[2,69]),t(de,[2,70]),t(de,[2,71]),t(de,[2,72]),t(de,[2,73]),t(de,[2,74]),t(de,[2,75]),t(de,[2,76]),t(de,[2,77]),t(de,[2,78]),t(C,[2,57],{76:ae}),t(C,[2,58],{76:$}),{5:ne,28:105,31:Te,34:q,36:Ve,38:pe,40:Be},{27:[1,112],76:$},{5:Ye,40:He,56:113,57:Le,59:Ie},{27:[1,118],76:$},{33:119,89:k,90:A},{33:120,89:k,90:A},{75:G,78:121,79:82,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee},t(Z,[2,61]),t(Z,[2,63]),t(de,[2,68]),t(C,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:ne,28:126,31:Te,34:q,36:Ve,38:pe,40:Be},t(C,[2,28]),{5:[1,127]},t(C,[2,42]),{32:[1,128]},{32:[1,129]},{5:Ye,40:He,56:130,57:Le,59:Ie},t(C,[2,47]),{5:[1,131]},t(C,[2,48]),t(C,[2,49]),t(Q,[2,66],{79:104,75:G,80:U,81:j,82:te,83:Y,84:oe,85:J,86:ue,87:re,88:ee}),{33:132,89:k,90:A},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},t(C,[2,27]),{5:ne,28:145,31:Te,34:q,36:Ve,38:pe,40:Be},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},t(C,[2,46]),{5:Ye,40:He,56:152,57:Le,59:Ie},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},t(C,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},t(C,[2,43]),{5:ne,28:159,31:Te,34:q,36:Ve,38:pe,40:Be},{5:ne,28:160,31:Te,34:q,36:Ve,38:pe,40:Be},{5:ne,28:161,31:Te,34:q,36:Ve,38:pe,40:Be},{5:ne,28:162,31:Te,34:q,36:Ve,38:pe,40:Be},{5:Ye,40:He,56:163,57:Le,59:Ie},{5:Ye,40:He,56:164,57:Le,59:Ie},t(C,[2,23]),t(C,[2,24]),t(C,[2,25]),t(C,[2,26]),t(C,[2,44]),t(C,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(xe,W){if(W.recoverable)this.trace(xe);else{var he=new Error(xe);throw he.hash=W,he}},"parseError"),parse:o(function(xe){var W=this,he=[0],z=[],se=[null],le=[],ke=this.table,ve="",ye=0,Re=0,_e=0,ze=2,Ke=1,xt=le.slice.call(arguments,1),We=Object.create(this.lexer),Oe={yy:{}};for(var et in this.yy)Object.prototype.hasOwnProperty.call(this.yy,et)&&(Oe.yy[et]=this.yy[et]);We.setInput(xe,Oe.yy),Oe.yy.lexer=We,Oe.yy.parser=this,typeof We.yylloc>"u"&&(We.yylloc={});var Ue=We.yylloc;le.push(Ue);var lt=We.options&&We.options.ranges;typeof Oe.yy.parseError=="function"?this.parseError=Oe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Gt(ar){he.length=he.length-2*ar,se.length=se.length-ar,le.length=le.length-ar}o(Gt,"popStack");function vt(){var ar;return ar=z.pop()||We.lex()||Ke,typeof ar!="number"&&(ar instanceof Array&&(z=ar,ar=z.pop()),ar=W.symbols_[ar]||ar),ar}o(vt,"lex");for(var Lt,dt,nt,bt,wt,yt,ft={},Ur,_t,bn,Br;;){if(nt=he[he.length-1],this.defaultActions[nt]?bt=this.defaultActions[nt]:((Lt===null||typeof Lt>"u")&&(Lt=vt()),bt=ke[nt]&&ke[nt][Lt]),typeof bt>"u"||!bt.length||!bt[0]){var cr="";Br=[];for(Ur in ke[nt])this.terminals_[Ur]&&Ur>ze&&Br.push("'"+this.terminals_[Ur]+"'");We.showPosition?cr="Parse error on line "+(ye+1)+`: +`+We.showPosition()+` +Expecting `+Br.join(", ")+", got '"+(this.terminals_[Lt]||Lt)+"'":cr="Parse error on line "+(ye+1)+": Unexpected "+(Lt==Ke?"end of input":"'"+(this.terminals_[Lt]||Lt)+"'"),this.parseError(cr,{text:We.match,token:this.terminals_[Lt]||Lt,line:We.yylineno,loc:Ue,expected:Br})}if(bt[0]instanceof Array&&bt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+nt+", token: "+Lt);switch(bt[0]){case 1:he.push(Lt),se.push(We.yytext),le.push(We.yylloc),he.push(bt[1]),Lt=null,dt?(Lt=dt,dt=null):(Re=We.yyleng,ve=We.yytext,ye=We.yylineno,Ue=We.yylloc,_e>0&&_e--);break;case 2:if(_t=this.productions_[bt[1]][1],ft.$=se[se.length-_t],ft._$={first_line:le[le.length-(_t||1)].first_line,last_line:le[le.length-1].last_line,first_column:le[le.length-(_t||1)].first_column,last_column:le[le.length-1].last_column},lt&&(ft._$.range=[le[le.length-(_t||1)].range[0],le[le.length-1].range[1]]),yt=this.performAction.apply(ft,[ve,Re,ye,Oe.yy,bt[1],se,le].concat(xt)),typeof yt<"u")return yt;_t&&(he=he.slice(0,-1*_t*2),se=se.slice(0,-1*_t),le=le.slice(0,-1*_t)),he.push(this.productions_[bt[1]][0]),se.push(ft.$),le.push(ft._$),bn=ke[he[he.length-2]][he[he.length-1]],he.push(bn);break;case 3:return!0}}return!0},"parse")},Ce=(function(){var fe={EOF:1,parseError:o(function(W,he){if(this.yy.parser)this.yy.parser.parseError(W,he);else throw new Error(W)},"parseError"),setInput:o(function(xe,W){return this.yy=W||this.yy||{},this._input=xe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var xe=this._input[0];this.yytext+=xe,this.yyleng++,this.offset++,this.match+=xe,this.matched+=xe;var W=xe.match(/(?:\r\n?|\n).*/g);return W?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),xe},"input"),unput:o(function(xe){var W=xe.length,he=xe.split(/(?:\r\n?|\n)/g);this._input=xe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-W),this.offset-=W;var z=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),he.length-1&&(this.yylineno-=he.length-1);var se=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:he?(he.length===z.length?this.yylloc.first_column:0)+z[z.length-he.length].length-he[0].length:this.yylloc.first_column-W},this.options.ranges&&(this.yylloc.range=[se[0],se[0]+this.yyleng-W]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(xe){this.unput(this.match.slice(xe))},"less"),pastInput:o(function(){var xe=this.matched.substr(0,this.matched.length-this.match.length);return(xe.length>20?"...":"")+xe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var xe=this.match;return xe.length<20&&(xe+=this._input.substr(0,20-xe.length)),(xe.substr(0,20)+(xe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var xe=this.pastInput(),W=new Array(xe.length+1).join("-");return xe+this.upcomingInput()+` +`+W+"^"},"showPosition"),test_match:o(function(xe,W){var he,z,se;if(this.options.backtrack_lexer&&(se={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(se.yylloc.range=this.yylloc.range.slice(0))),z=xe[0].match(/(?:\r\n?|\n).*/g),z&&(this.yylineno+=z.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:z?z[z.length-1].length-z[z.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+xe[0].length},this.yytext+=xe[0],this.match+=xe[0],this.matches=xe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(xe[0].length),this.matched+=xe[0],he=this.performAction.call(this,this.yy,this,W,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),he)return he;if(this._backtrack){for(var le in se)this[le]=se[le];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var xe,W,he,z;this._more||(this.yytext="",this.match="");for(var se=this._currentRules(),le=0;leW[0].length)){if(W=he,z=le,this.options.backtrack_lexer){if(xe=this.test_match(he,se[le]),xe!==!1)return xe;if(this._backtrack){W=!1;continue}else return!1}else if(!this.options.flex)break}return W?(xe=this.test_match(W,se[z]),xe!==!1?xe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var W=this.next();return W||this.lex()},"lex"),begin:o(function(W){this.conditionStack.push(W)},"begin"),popState:o(function(){var W=this.conditionStack.length-1;return W>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(W){return W=this.conditionStack.length-1-Math.abs(W||0),W>=0?this.conditionStack[W]:"INITIAL"},"topState"),pushState:o(function(W){this.begin(W)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(W,he,z,se){var le=se;switch(z){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return he.yytext=he.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return fe})();Ne.lexer=Ce;function Fe(){this.yy={}}return o(Fe,"Parser"),Fe.prototype=Ne,Ne.Parser=Fe,new Fe})();QF.parser=QF;kye=QF});var Z6,Sye=N(()=>{"use strict";Xt();pt();ci();Z6=class{constructor(){this.relations=[];this.latestRequirement=this.getInitialRequirement();this.requirements=new Map;this.latestElement=this.getInitialElement();this.elements=new Map;this.classes=new Map;this.direction="TB";this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"};this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"};this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"};this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"};this.setAccTitle=Rr;this.getAccTitle=Mr;this.setAccDescription=Ir;this.getAccDescription=Or;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getConfig=o(()=>ge().requirement,"getConfig");this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,r){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:r,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),X.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,r,n){this.relations.push({type:e,src:r,dst:n})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,Sr()}setCssStyle(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(!r||!i)return;for(let a of r)a.includes(",")?i.cssStyles.push(...a.split(",")):i.cssStyles.push(a)}}setClass(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(i)for(let a of r){i.classes.push(a);let s=this.classes.get(a)?.styles;s&&i.cssStyles.push(...s)}}}defineClass(e,r){for(let n of e){let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.requirements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))}),this.elements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))})}}getClasses(){return this.classes}getData(){let e=ge(),r=[],n=[];for(let i of this.requirements.values()){let a=i;a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),a.shape="requirementBox",a.look=e.look,r.push(a)}for(let i of this.elements.values()){let a=i;a.shape="requirementBox",a.look=e.look,a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),r.push(a)}for(let i of this.relations){let a=0,s=i.type===this.Relationships.CONTAINS,l={id:`${i.src}-${i.dst}-${a}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`<<${i.type}>>`,classes:"relationshipLine",style:["fill:none",s?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:s?"normal":"dashed",arrowTypeStart:s?"requirement_contains":"",arrowTypeEnd:s?"":"requirement_arrow",look:e.look};n.push(l),a++}return{nodes:r,edges:n,other:{},config:e,direction:this.getDirection()}}}});var VZe,Cye,Aye=N(()=>{"use strict";VZe=o(t=>` + + marker { + fill: ${t.relationColor}; + stroke: ${t.relationColor}; + } + + marker.cross { + stroke: ${t.lineColor}; + } + + svg { + font-family: ${t.fontFamily}; + font-size: ${t.fontSize}; + } + + .reqBox { + fill: ${t.requirementBackground}; + fill-opacity: 1.0; + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${t.requirementTextColor}; + } + .reqLabelBox { + fill: ${t.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + .relationshipLine { + stroke: ${t.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${t.relationLabelColor}; + } + .divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; + } + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + .labelBkg { + background-color: ${t.edgeLabelBackground}; + } + +`,"getStyles"),Cye=VZe});var ZF={};dr(ZF,{draw:()=>UZe});var UZe,_ye=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();UZe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing requirement diagram (unified)",e);let{securityLevel:i,state:a,layout:s}=ge(),l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=$c(s),l.nodeSpacing=a?.nodeSpacing??50,l.rankSpacing=a?.rankSpacing??50,l.markers=["requirement_contains","requirement_arrow"],l.diagramId=e,await Qo(l,u);let h=8;qt.insertTitle(u,"requirementDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,h,"requirementDiagram",a?.useMaxWidth??!0)},"draw")});var Dye={};dr(Dye,{diagram:()=>HZe});var HZe,Lye=N(()=>{"use strict";Eye();Sye();Aye();_ye();HZe={parser:kye,get db(){return new Z6},renderer:ZF,styles:Cye}});var JF,Mye,Iye=N(()=>{"use strict";JF=(function(){var t=o(function(ee,Z,K,ae){for(K=K||{},ae=ee.length;ae--;K[ee[ae]]=Z);return K},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,13],u=[1,14],h=[1,16],f=[1,17],d=[1,18],p=[1,24],m=[1,25],g=[1,26],y=[1,27],v=[1,28],x=[1,29],b=[1,30],T=[1,31],S=[1,32],w=[1,33],k=[1,34],A=[1,35],C=[1,36],R=[1,37],I=[1,38],L=[1,39],E=[1,41],D=[1,42],_=[1,43],O=[1,44],M=[1,45],P=[1,46],B=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,55,60,61,62,63,71],F=[2,71],G=[4,5,16,50,52,53],$=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,55,60,61,62,63,71],U=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,55,60,61,62,63,71],j=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,55,60,61,62,63,71],te=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,55,60,61,62,63,71],Y=[69,70,71],oe=[1,127],J={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,actor_with_config:54,note:55,placement:56,text2:57,over:58,actor_pair:59,links:60,link:61,properties:62,details:63,spaceList:64,",":65,left_of:66,right_of:67,signaltype:68,"+":69,"-":70,ACTOR:71,config_object:72,CONFIG_START:73,CONFIG_CONTENT:74,CONFIG_END:75,SOLID_OPEN_ARROW:76,DOTTED_OPEN_ARROW:77,SOLID_ARROW:78,BIDIRECTIONAL_SOLID_ARROW:79,DOTTED_ARROW:80,BIDIRECTIONAL_DOTTED_ARROW:81,SOLID_CROSS:82,DOTTED_CROSS:83,SOLID_POINT:84,DOTTED_POINT:85,TXT:86,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",55:"note",58:"over",60:"links",61:"link",62:"properties",63:"details",65:",",66:"left_of",67:"right_of",69:"+",70:"-",71:"ACTOR",73:"CONFIG_START",74:"CONFIG_CONTENT",75:"CONFIG_END",76:"SOLID_OPEN_ARROW",77:"DOTTED_OPEN_ARROW",78:"SOLID_ARROW",79:"BIDIRECTIONAL_SOLID_ARROW",80:"DOTTED_ARROW",81:"BIDIRECTIONAL_DOTTED_ARROW",82:"SOLID_CROSS",83:"DOTTED_CROSS",84:"SOLID_POINT",85:"DOTTED_POINT",86:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[64,2],[64,1],[59,3],[59,1],[56,1],[56,1],[17,5],[17,5],[17,4],[54,2],[72,3],[22,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[68,1],[57,1]],performAction:o(function(Z,K,ae,Q,de,ne,Te){var q=ne.length-1;switch(de){case 3:return Q.apply(ne[q]),ne[q];break;case 4:case 9:this.$=[];break;case 5:case 10:ne[q-1].push(ne[q]),this.$=ne[q-1];break;case 6:case 7:case 11:case 12:this.$=ne[q];break;case 8:case 13:this.$=[];break;case 15:ne[q].type="createParticipant",this.$=ne[q];break;case 16:ne[q-1].unshift({type:"boxStart",boxData:Q.parseBoxData(ne[q-2])}),ne[q-1].push({type:"boxEnd",boxText:ne[q-2]}),this.$=ne[q-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(ne[q-2]),sequenceIndexStep:Number(ne[q-1]),sequenceVisible:!0,signalType:Q.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(ne[q-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:Q.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:Q.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:Q.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:Q.LINETYPE.ACTIVE_START,actor:ne[q-1].actor};break;case 23:this.$={type:"activeEnd",signalType:Q.LINETYPE.ACTIVE_END,actor:ne[q-1].actor};break;case 29:Q.setDiagramTitle(ne[q].substring(6)),this.$=ne[q].substring(6);break;case 30:Q.setDiagramTitle(ne[q].substring(7)),this.$=ne[q].substring(7);break;case 31:this.$=ne[q].trim(),Q.setAccTitle(this.$);break;case 32:case 33:this.$=ne[q].trim(),Q.setAccDescription(this.$);break;case 34:ne[q-1].unshift({type:"loopStart",loopText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.LOOP_START}),ne[q-1].push({type:"loopEnd",loopText:ne[q-2],signalType:Q.LINETYPE.LOOP_END}),this.$=ne[q-1];break;case 35:ne[q-1].unshift({type:"rectStart",color:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.RECT_START}),ne[q-1].push({type:"rectEnd",color:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.RECT_END}),this.$=ne[q-1];break;case 36:ne[q-1].unshift({type:"optStart",optText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.OPT_START}),ne[q-1].push({type:"optEnd",optText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.OPT_END}),this.$=ne[q-1];break;case 37:ne[q-1].unshift({type:"altStart",altText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.ALT_START}),ne[q-1].push({type:"altEnd",signalType:Q.LINETYPE.ALT_END}),this.$=ne[q-1];break;case 38:ne[q-1].unshift({type:"parStart",parText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.PAR_START}),ne[q-1].push({type:"parEnd",signalType:Q.LINETYPE.PAR_END}),this.$=ne[q-1];break;case 39:ne[q-1].unshift({type:"parStart",parText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.PAR_OVER_START}),ne[q-1].push({type:"parEnd",signalType:Q.LINETYPE.PAR_END}),this.$=ne[q-1];break;case 40:ne[q-1].unshift({type:"criticalStart",criticalText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.CRITICAL_START}),ne[q-1].push({type:"criticalEnd",signalType:Q.LINETYPE.CRITICAL_END}),this.$=ne[q-1];break;case 41:ne[q-1].unshift({type:"breakStart",breakText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.BREAK_START}),ne[q-1].push({type:"breakEnd",optText:Q.parseMessage(ne[q-2]),signalType:Q.LINETYPE.BREAK_END}),this.$=ne[q-1];break;case 43:this.$=ne[q-3].concat([{type:"option",optionText:Q.parseMessage(ne[q-1]),signalType:Q.LINETYPE.CRITICAL_OPTION},ne[q]]);break;case 45:this.$=ne[q-3].concat([{type:"and",parText:Q.parseMessage(ne[q-1]),signalType:Q.LINETYPE.PAR_AND},ne[q]]);break;case 47:this.$=ne[q-3].concat([{type:"else",altText:Q.parseMessage(ne[q-1]),signalType:Q.LINETYPE.ALT_ELSE},ne[q]]);break;case 48:ne[q-3].draw="participant",ne[q-3].type="addParticipant",ne[q-3].description=Q.parseMessage(ne[q-1]),this.$=ne[q-3];break;case 49:ne[q-1].draw="participant",ne[q-1].type="addParticipant",this.$=ne[q-1];break;case 50:ne[q-3].draw="actor",ne[q-3].type="addParticipant",ne[q-3].description=Q.parseMessage(ne[q-1]),this.$=ne[q-3];break;case 51:ne[q-1].draw="actor",ne[q-1].type="addParticipant",this.$=ne[q-1];break;case 52:ne[q-1].type="destroyParticipant",this.$=ne[q-1];break;case 53:ne[q-1].draw="participant",ne[q-1].type="addParticipant",this.$=ne[q-1];break;case 54:this.$=[ne[q-1],{type:"addNote",placement:ne[q-2],actor:ne[q-1].actor,text:ne[q]}];break;case 55:ne[q-2]=[].concat(ne[q-1],ne[q-1]).slice(0,2),ne[q-2][0]=ne[q-2][0].actor,ne[q-2][1]=ne[q-2][1].actor,this.$=[ne[q-1],{type:"addNote",placement:Q.PLACEMENT.OVER,actor:ne[q-2].slice(0,2),text:ne[q]}];break;case 56:this.$=[ne[q-1],{type:"addLinks",actor:ne[q-1].actor,text:ne[q]}];break;case 57:this.$=[ne[q-1],{type:"addALink",actor:ne[q-1].actor,text:ne[q]}];break;case 58:this.$=[ne[q-1],{type:"addProperties",actor:ne[q-1].actor,text:ne[q]}];break;case 59:this.$=[ne[q-1],{type:"addDetails",actor:ne[q-1].actor,text:ne[q]}];break;case 62:this.$=[ne[q-2],ne[q]];break;case 63:this.$=ne[q];break;case 64:this.$=Q.PLACEMENT.LEFTOF;break;case 65:this.$=Q.PLACEMENT.RIGHTOF;break;case 66:this.$=[ne[q-4],ne[q-1],{type:"addMessage",from:ne[q-4].actor,to:ne[q-1].actor,signalType:ne[q-3],msg:ne[q],activate:!0},{type:"activeStart",signalType:Q.LINETYPE.ACTIVE_START,actor:ne[q-1].actor}];break;case 67:this.$=[ne[q-4],ne[q-1],{type:"addMessage",from:ne[q-4].actor,to:ne[q-1].actor,signalType:ne[q-3],msg:ne[q]},{type:"activeEnd",signalType:Q.LINETYPE.ACTIVE_END,actor:ne[q-4].actor}];break;case 68:this.$=[ne[q-3],ne[q-1],{type:"addMessage",from:ne[q-3].actor,to:ne[q-1].actor,signalType:ne[q-2],msg:ne[q]}];break;case 69:this.$={type:"addParticipant",actor:ne[q-1],config:ne[q]};break;case 70:this.$=ne[q-1].trim();break;case 71:this.$={type:"addParticipant",actor:ne[q]};break;case 72:this.$=Q.LINETYPE.SOLID_OPEN;break;case 73:this.$=Q.LINETYPE.DOTTED_OPEN;break;case 74:this.$=Q.LINETYPE.SOLID;break;case 75:this.$=Q.LINETYPE.BIDIRECTIONAL_SOLID;break;case 76:this.$=Q.LINETYPE.DOTTED;break;case 77:this.$=Q.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 78:this.$=Q.LINETYPE.SOLID_CROSS;break;case 79:this.$=Q.LINETYPE.DOTTED_CROSS;break;case 80:this.$=Q.LINETYPE.SOLID_POINT;break;case 81:this.$=Q.LINETYPE.DOTTED_POINT;break;case 82:this.$=Q.parseMessage(ne[q].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,55,60,61,62,63,71],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},t(B,[2,5]),{9:47,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},t(B,[2,7]),t(B,[2,8]),t(B,[2,14]),{12:48,50:R,52:I,53:L},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,71:P},{22:55,71:P},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(B,[2,29]),t(B,[2,30]),{32:[1,61]},{34:[1,62]},t(B,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,54:72,71:[1,73]},{22:74,71:P},{22:75,71:P},{68:76,76:[1,77],77:[1,78],78:[1,79],79:[1,80],80:[1,81],81:[1,82],82:[1,83],83:[1,84],84:[1,85],85:[1,86]},{56:87,58:[1,88],66:[1,89],67:[1,90]},{22:91,71:P},{22:92,71:P},{22:93,71:P},{22:94,71:P},t([5,51,65,76,77,78,79,80,81,82,83,84,85,86],F),t(B,[2,6]),t(B,[2,15]),t(G,[2,9],{10:95}),t(B,[2,17]),{5:[1,97],19:[1,96]},{5:[1,98]},t(B,[2,21]),{5:[1,99]},{5:[1,100]},t(B,[2,24]),t(B,[2,25]),t(B,[2,26]),t(B,[2,27]),t(B,[2,28]),t(B,[2,31]),t(B,[2,32]),t($,i,{7:101}),t($,i,{7:102}),t($,i,{7:103}),t(U,i,{40:104,7:105}),t(j,i,{42:106,7:107}),t(j,i,{7:107,42:108}),t(te,i,{45:109,7:110}),t($,i,{7:111}),{5:[1,113],51:[1,112]},{5:[1,114]},t([5,51],F,{72:115,73:[1,116]}),{5:[1,118],51:[1,117]},{5:[1,119]},{22:122,69:[1,120],70:[1,121],71:P},t(Y,[2,72]),t(Y,[2,73]),t(Y,[2,74]),t(Y,[2,75]),t(Y,[2,76]),t(Y,[2,77]),t(Y,[2,78]),t(Y,[2,79]),t(Y,[2,80]),t(Y,[2,81]),{22:123,71:P},{22:125,59:124,71:P},{71:[2,64]},{71:[2,65]},{57:126,86:oe},{57:128,86:oe},{57:129,86:oe},{57:130,86:oe},{4:[1,133],5:[1,135],11:132,12:134,16:[1,131],50:R,52:I,53:L},{5:[1,136]},t(B,[2,19]),t(B,[2,20]),t(B,[2,22]),t(B,[2,23]),{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,137],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,138],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,139],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{16:[1,140]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,46],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,49:[1,141],50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{16:[1,142]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,44],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,48:[1,143],50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{16:[1,144]},{16:[1,145]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,42],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,47:[1,146],50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,147],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:k,44:A,46:C,50:R,52:I,53:L,55:E,60:D,61:_,62:O,63:M,71:P},{15:[1,148]},t(B,[2,49]),t(B,[2,53]),{5:[2,69]},{74:[1,149]},{15:[1,150]},t(B,[2,51]),t(B,[2,52]),{22:151,71:P},{22:152,71:P},{57:153,86:oe},{57:154,86:oe},{57:155,86:oe},{65:[1,156],86:[2,63]},{5:[2,56]},{5:[2,82]},{5:[2,57]},{5:[2,58]},{5:[2,59]},t(B,[2,16]),t(G,[2,10]),{12:157,50:R,52:I,53:L},t(G,[2,12]),t(G,[2,13]),t(B,[2,18]),t(B,[2,34]),t(B,[2,35]),t(B,[2,36]),t(B,[2,37]),{15:[1,158]},t(B,[2,38]),{15:[1,159]},t(B,[2,39]),t(B,[2,40]),{15:[1,160]},t(B,[2,41]),{5:[1,161]},{75:[1,162]},{5:[1,163]},{57:164,86:oe},{57:165,86:oe},{5:[2,68]},{5:[2,54]},{5:[2,55]},{22:166,71:P},t(G,[2,11]),t(U,i,{7:105,40:167}),t(j,i,{7:107,42:168}),t(te,i,{7:110,45:169}),t(B,[2,48]),{5:[2,70]},t(B,[2,50]),{5:[2,66]},{5:[2,67]},{86:[2,62]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],89:[2,64],90:[2,65],115:[2,69],126:[2,56],127:[2,82],128:[2,57],129:[2,58],130:[2,59],153:[2,68],154:[2,54],155:[2,55],162:[2,70],164:[2,66],165:[2,67],166:[2,62],167:[2,47],168:[2,45],169:[2,43]},parseError:o(function(Z,K){if(K.recoverable)this.trace(Z);else{var ae=new Error(Z);throw ae.hash=K,ae}},"parseError"),parse:o(function(Z){var K=this,ae=[0],Q=[],de=[null],ne=[],Te=this.table,q="",Ve=0,pe=0,Be=0,Ye=2,He=1,Le=ne.slice.call(arguments,1),Ie=Object.create(this.lexer),Ne={yy:{}};for(var Ce in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ce)&&(Ne.yy[Ce]=this.yy[Ce]);Ie.setInput(Z,Ne.yy),Ne.yy.lexer=Ie,Ne.yy.parser=this,typeof Ie.yylloc>"u"&&(Ie.yylloc={});var Fe=Ie.yylloc;ne.push(Fe);var fe=Ie.options&&Ie.options.ranges;typeof Ne.yy.parseError=="function"?this.parseError=Ne.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xe(We){ae.length=ae.length-2*We,de.length=de.length-We,ne.length=ne.length-We}o(xe,"popStack");function W(){var We;return We=Q.pop()||Ie.lex()||He,typeof We!="number"&&(We instanceof Array&&(Q=We,We=Q.pop()),We=K.symbols_[We]||We),We}o(W,"lex");for(var he,z,se,le,ke,ve,ye={},Re,_e,ze,Ke;;){if(se=ae[ae.length-1],this.defaultActions[se]?le=this.defaultActions[se]:((he===null||typeof he>"u")&&(he=W()),le=Te[se]&&Te[se][he]),typeof le>"u"||!le.length||!le[0]){var xt="";Ke=[];for(Re in Te[se])this.terminals_[Re]&&Re>Ye&&Ke.push("'"+this.terminals_[Re]+"'");Ie.showPosition?xt="Parse error on line "+(Ve+1)+`: +`+Ie.showPosition()+` +Expecting `+Ke.join(", ")+", got '"+(this.terminals_[he]||he)+"'":xt="Parse error on line "+(Ve+1)+": Unexpected "+(he==He?"end of input":"'"+(this.terminals_[he]||he)+"'"),this.parseError(xt,{text:Ie.match,token:this.terminals_[he]||he,line:Ie.yylineno,loc:Fe,expected:Ke})}if(le[0]instanceof Array&&le.length>1)throw new Error("Parse Error: multiple actions possible at state: "+se+", token: "+he);switch(le[0]){case 1:ae.push(he),de.push(Ie.yytext),ne.push(Ie.yylloc),ae.push(le[1]),he=null,z?(he=z,z=null):(pe=Ie.yyleng,q=Ie.yytext,Ve=Ie.yylineno,Fe=Ie.yylloc,Be>0&&Be--);break;case 2:if(_e=this.productions_[le[1]][1],ye.$=de[de.length-_e],ye._$={first_line:ne[ne.length-(_e||1)].first_line,last_line:ne[ne.length-1].last_line,first_column:ne[ne.length-(_e||1)].first_column,last_column:ne[ne.length-1].last_column},fe&&(ye._$.range=[ne[ne.length-(_e||1)].range[0],ne[ne.length-1].range[1]]),ve=this.performAction.apply(ye,[q,pe,Ve,Ne.yy,le[1],de,ne].concat(Le)),typeof ve<"u")return ve;_e&&(ae=ae.slice(0,-1*_e*2),de=de.slice(0,-1*_e),ne=ne.slice(0,-1*_e)),ae.push(this.productions_[le[1]][0]),de.push(ye.$),ne.push(ye._$),ze=Te[ae[ae.length-2]][ae[ae.length-1]],ae.push(ze);break;case 3:return!0}}return!0},"parse")},ue=(function(){var ee={EOF:1,parseError:o(function(K,ae){if(this.yy.parser)this.yy.parser.parseError(K,ae);else throw new Error(K)},"parseError"),setInput:o(function(Z,K){return this.yy=K||this.yy||{},this._input=Z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Z=this._input[0];this.yytext+=Z,this.yyleng++,this.offset++,this.match+=Z,this.matched+=Z;var K=Z.match(/(?:\r\n?|\n).*/g);return K?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Z},"input"),unput:o(function(Z){var K=Z.length,ae=Z.split(/(?:\r\n?|\n)/g);this._input=Z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-K),this.offset-=K;var Q=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ae.length-1&&(this.yylineno-=ae.length-1);var de=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ae?(ae.length===Q.length?this.yylloc.first_column:0)+Q[Q.length-ae.length].length-ae[0].length:this.yylloc.first_column-K},this.options.ranges&&(this.yylloc.range=[de[0],de[0]+this.yyleng-K]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Z){this.unput(this.match.slice(Z))},"less"),pastInput:o(function(){var Z=this.matched.substr(0,this.matched.length-this.match.length);return(Z.length>20?"...":"")+Z.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Z=this.match;return Z.length<20&&(Z+=this._input.substr(0,20-Z.length)),(Z.substr(0,20)+(Z.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Z=this.pastInput(),K=new Array(Z.length+1).join("-");return Z+this.upcomingInput()+` +`+K+"^"},"showPosition"),test_match:o(function(Z,K){var ae,Q,de;if(this.options.backtrack_lexer&&(de={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(de.yylloc.range=this.yylloc.range.slice(0))),Q=Z[0].match(/(?:\r\n?|\n).*/g),Q&&(this.yylineno+=Q.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Q?Q[Q.length-1].length-Q[Q.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Z[0].length},this.yytext+=Z[0],this.match+=Z[0],this.matches=Z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Z[0].length),this.matched+=Z[0],ae=this.performAction.call(this,this.yy,this,K,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ae)return ae;if(this._backtrack){for(var ne in de)this[ne]=de[ne];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Z,K,ae,Q;this._more||(this.yytext="",this.match="");for(var de=this._currentRules(),ne=0;neK[0].length)){if(K=ae,Q=ne,this.options.backtrack_lexer){if(Z=this.test_match(ae,de[ne]),Z!==!1)return Z;if(this._backtrack){K=!1;continue}else return!1}else if(!this.options.flex)break}return K?(Z=this.test_match(K,de[Q]),Z!==!1?Z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var K=this.next();return K||this.lex()},"lex"),begin:o(function(K){this.conditionStack.push(K)},"begin"),popState:o(function(){var K=this.conditionStack.length-1;return K>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(K){return K=this.conditionStack.length-1-Math.abs(K||0),K>=0?this.conditionStack[K]:"INITIAL"},"topState"),pushState:o(function(K){this.begin(K)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(K,ae,Q,de){var ne=de;switch(Q){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("CONFIG"),73;break;case 8:return 74;case 9:return this.popState(),this.popState(),75;break;case 10:return ae.yytext=ae.yytext.trim(),71;break;case 11:return ae.yytext=ae.yytext.trim(),this.begin("ALIAS"),71;break;case 12:return this.begin("LINE"),14;break;case 13:return this.begin("ID"),50;break;case 14:return this.begin("ID"),52;break;case 15:return 13;case 16:return this.begin("ID"),53;break;case 17:return ae.yytext=ae.yytext.trim(),this.begin("ALIAS"),71;break;case 18:return this.popState(),this.popState(),this.begin("LINE"),51;break;case 19:return this.popState(),this.popState(),5;break;case 20:return this.begin("LINE"),36;break;case 21:return this.begin("LINE"),37;break;case 22:return this.begin("LINE"),38;break;case 23:return this.begin("LINE"),39;break;case 24:return this.begin("LINE"),49;break;case 25:return this.begin("LINE"),41;break;case 26:return this.begin("LINE"),43;break;case 27:return this.begin("LINE"),48;break;case 28:return this.begin("LINE"),44;break;case 29:return this.begin("LINE"),47;break;case 30:return this.begin("LINE"),46;break;case 31:return this.popState(),15;break;case 32:return 16;case 33:return 66;case 34:return 67;case 35:return 60;case 36:return 61;case 37:return 62;case 38:return 63;case 39:return 58;case 40:return 55;case 41:return this.begin("ID"),21;break;case 42:return this.begin("ID"),23;break;case 43:return 29;case 44:return 30;case 45:return this.begin("acc_title"),31;break;case 46:return this.popState(),"acc_title_value";break;case 47:return this.begin("acc_descr"),33;break;case 48:return this.popState(),"acc_descr_value";break;case 49:this.begin("acc_descr_multiline");break;case 50:this.popState();break;case 51:return"acc_descr_multiline_value";case 52:return 6;case 53:return 18;case 54:return 20;case 55:return 65;case 56:return 5;case 57:return ae.yytext=ae.yytext.trim(),71;break;case 58:return 78;case 59:return 79;case 60:return 80;case 61:return 81;case 62:return 76;case 63:return 77;case 64:return 82;case 65:return 83;case 66:return 84;case 67:return 85;case 68:return 86;case 69:return 86;case 70:return 69;case 71:return 70;case 72:return 5;case 73:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:@\{)/i,/^(?:[^\}]+)/i,/^(?:\})/i,/^(?:[^\<->\->:\n,;@\s]+(?=@\{))/i,/^(?:[^\<->\->:\n,;@]+?([\-]*[^\<->\->:\n,;@]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^<\->\->:\n,;]+?([\-]*[^<\->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^+<\->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+<\->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[50,51],inclusive:!1},acc_descr:{rules:[48],inclusive:!1},acc_title:{rules:[46],inclusive:!1},ID:{rules:[2,3,7,10,11,17],inclusive:!1},ALIAS:{rules:[2,3,18,19],inclusive:!1},LINE:{rules:[2,3,31],inclusive:!1},CONFIG:{rules:[8,9],inclusive:!1},CONFIG_DATA:{rules:[],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,12,13,14,15,16,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,47,49,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73],inclusive:!0}}};return ee})();J.lexer=ue;function re(){this.yy={}}return o(re,"Parser"),re.prototype=J,J.Parser=re,new re})();JF.parser=JF;Mye=JF});var XZe,jZe,KZe,b4,J6,e$=N(()=>{"use strict";Xt();w2();pt();fF();gr();ci();XZe={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},jZe={FILLED:0,OPEN:1},KZe={LEFTOF:0,RIGHTOF:1,OVER:2},b4={ACTOR:"actor",BOUNDARY:"boundary",COLLECTIONS:"collections",CONTROL:"control",DATABASE:"database",ENTITY:"entity",PARTICIPANT:"participant",QUEUE:"queue"},J6=class{constructor(){this.state=new J1(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0}));this.setAccTitle=Rr;this.setAccDescription=Ir;this.setDiagramTitle=$r;this.getAccTitle=Mr;this.getAccDescription=Or;this.getDiagramTitle=Pr;this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(ge().wrap),this.LINETYPE=XZe,this.ARROWTYPE=jZe,this.PLACEMENT=KZe}static{o(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,r,n,i,a){let s=this.state.records.currentBox,l;if(a!==void 0){let h;a.includes(` +`)?h=a+` +`:h=`{ +`+a+` +}`,l=Kh(h,{schema:jh})}i=l?.type??i;let u=this.state.records.actors.get(e);if(u){if(this.state.records.currentBox&&u.box&&this.state.records.currentBox!==u.box)throw new Error(`A same participant should only be defined in one Box: ${u.name} can't be in '${u.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(s=u.box?u.box:this.state.records.currentBox,u.box=s,u&&r===u.name&&n==null)return}if(n?.text==null&&(n={text:r,type:i}),(i==null||n.text==null)&&(n={text:r,type:i}),this.state.records.actors.set(e,{box:s,name:r,description:n.text,wrap:n.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:i??"participant"}),this.state.records.prevActor){let h=this.state.records.actors.get(this.state.records.prevActor);h&&(h.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let r,n=0;if(!e)return 0;for(r=0;r>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},l}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:r,message:n?.text??"",wrap:n?.wrap??this.autoWrap(),type:i,activate:a}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let r=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(r===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:r}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:ge().sequence?.wrap??!1}clear(){this.state.reset(),Sr()}parseMessage(e){let r=e.trim(),{wrap:n,cleanedText:i}=this.extractWrap(r),a={text:i,wrap:n};return X.debug(`parseMessage: ${JSON.stringify(a)}`),a}parseBoxData(e){let r=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),n=r?.[1]?r[1].trim():"transparent",i=r?.[2]?r[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",n)||(n="transparent",i=e.trim());else{let l=new Option().style;l.color=n,l.color!==n&&(n="transparent",i=e.trim())}let{wrap:a,cleanedText:s}=this.extractWrap(i);return{text:s?sr(s,ge()):void 0,color:n,wrap:a}}addNote(e,r,n){let i={actor:e,placement:r,message:n.text,wrap:n.wrap??this.autoWrap()},a=[].concat(e,e);this.state.records.notes.push(i),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:a[0],to:a[1],message:n.text,wrap:n.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:r})}addLinks(e,r){let n=this.getActor(e);try{let i=sr(r.text,ge());i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let a=JSON.parse(i);this.insertLinks(n,a)}catch(i){X.error("error while parsing actor link text",i)}}addALink(e,r){let n=this.getActor(e);try{let i={},a=sr(r.text,ge()),s=a.indexOf("@");a=a.replace(/=/g,"="),a=a.replace(/&/g,"&");let l=a.slice(0,s-1).trim(),u=a.slice(s+1).trim();i[l]=u,this.insertLinks(n,i)}catch(i){X.error("error while parsing actor link text",i)}}insertLinks(e,r){if(e.links==null)e.links=r;else for(let n in r)e.links[n]=r[n]}addProperties(e,r){let n=this.getActor(e);try{let i=sr(r.text,ge()),a=JSON.parse(i);this.insertProperties(n,a)}catch(i){X.error("error while parsing actor properties text",i)}}insertProperties(e,r){if(e.properties==null)e.properties=r;else for(let n in r)e.properties[n]=r[n]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,r){let n=this.getActor(e),i=document.getElementById(r.text);try{let a=i.innerHTML,s=JSON.parse(a);s.properties&&this.insertProperties(n,s.properties),s.links&&this.insertLinks(n,s.links)}catch(a){X.error("error while parsing actor details text",a)}}getActorProperty(e,r){if(e?.properties!==void 0)return e.properties[r]}apply(e){if(Array.isArray(e))e.forEach(r=>{this.apply(r)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw,e.config);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw,e.config),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":Rr(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return ge().sequence}}});var QZe,Oye,Pye=N(()=>{"use strict";QZe=o(t=>`.actor { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + + text.actor > tspan { + fill: ${t.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${t.actorLineColor}; + } + + .innerArc { + stroke-width: 1.5; + stroke-dasharray: none; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${t.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${t.signalColor}; + } + + #arrowhead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .sequenceNumber { + fill: ${t.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${t.signalColor}; + } + + #crosshead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .messageText { + fill: ${t.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${t.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${t.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${t.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation1 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation2 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${t.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + .actor-man circle, line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + stroke-width: 2px; + } + +`,"getStyles"),Oye=QZe});var t$,Yf,jf,Kf,eC,Xf,T4,ZZe,tC,w4,o0,Bye,Fr,r$,JZe,eJe,tJe,rJe,nJe,iJe,aJe,sJe,oJe,lJe,cJe,uJe,hJe,Fye,fJe,dJe,pJe,mJe,gJe,yJe,vJe,$ye,xJe,oh,bJe,mi,zye=N(()=>{"use strict";t$=ja(tm(),1);qn();tr();gr();r2();Yf=36,jf="actor-top",Kf="actor-bottom",eC="actor-box",Xf="actor-man",T4=o(function(t,e){return Fd(t,e)},"drawRect"),ZZe=o(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,l=e.rectData;var u="none";i&&(u="block !important");let h=t.append("g");h.attr("id","actor"+s+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",u);var f="";l.class!==void 0&&(f=" "+l.class);let d=l.width>r?l.width:r,p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+f),p.attr("x",l.x),p.attr("y",l.height),p.attr("fill",l.fill),p.attr("stroke",l.stroke),p.attr("width",d),p.attr("height",l.height),p.attr("rx",l.rx),p.attr("ry",l.ry),a!=null){var m=20;for(let v in a){var g=h.append("a"),y=(0,t$.sanitizeUrl)(a[v]);g.attr("xlink:href",y),g.attr("target","_blank"),bJe(n)(v,g,l.x+10,l.height+m,d,20,{class:"actor"},n),m+=30}}return p.attr("height",m),{height:l.height+m,width:d}},"drawPopup"),tC=o(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),w4=o(async function(t,e,r=null){let n=t.append("foreignObject"),i=await kh(e.text,Qt()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let l=t.node().firstChild;l.setAttribute("height",s.height+2*e.textMargin);let u=l.getBBox();n.attr("x",Math.round(u.x+u.width/2-s.width/2)).attr("y",Math.round(u.y+u.height/2-s.height/2))}else if(r){let{startx:l,stopx:u,starty:h}=r;if(l>u){let f=l;l=u,u=f}n.attr("x",Math.round(l+Math.abs(l-u)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(h)):n.attr("y",Math.round(h-s.height))}return[n]},"drawKatex"),o0=o(function(t,e){let r=0,n=0,i=e.text.split(tt.lineBreakRegex),[a,s]=vc(e.fontSize),l=[],u=0,h=o(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":h=o(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":h=o(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":h=o(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[f,d]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(u=f*a);let p=t.append("text");p.attr("x",e.x),p.attr("y",h()),e.anchor!==void 0&&p.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&p.style("font-family",e.fontFamily),s!==void 0&&p.style("font-size",s),e.fontWeight!==void 0&&p.style("font-weight",e.fontWeight),e.fill!==void 0&&p.attr("fill",e.fill),e.class!==void 0&&p.attr("class",e.class),e.dy!==void 0?p.attr("dy",e.dy):u!==0&&p.attr("dy",u);let m=d||BL;if(e.tspan){let g=p.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(m)}else p.text(m);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(p._groups||p)[0][0].getBBox().height,r=n),l.push(p)}return l},"drawText"),Bye=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,o0(t,e),n},"drawLabel"),Fr=-1,r$=o((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),JZe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.rx=3,h.ry=3,h.name=e.name;let d=T4(u,h);if(e.rectData=h,e.properties?.icon){let m=e.properties.icon.trim();m.charAt(0)==="@"?lT(u,h.x+h.width-20,h.y+10,m.substr(1)):oT(u,h.x+h.width-20,h.y+10,m)}oh(r,kn(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${eC}`},r);let p=e.height;if(d.node){let m=d.node().getBBox();e.height=m.height,p=m.height}return p},"drawActorTypeParticipant"),eJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name;let d=6,p={...h,x:h.x+-d,y:h.y+ +d,class:"actor"},m=T4(u,h);if(T4(u,p),e.rectData=h,e.properties?.icon){let y=e.properties.icon.trim();y.charAt(0)==="@"?lT(u,h.x+h.width-20,h.y+10,y.substr(1)):oT(u,h.x+h.width-20,h.y+10,y)}oh(r,kn(e.description))(e.description,u,h.x-d,h.y+d,h.width,h.height,{class:`actor ${eC}`},r);let g=e.height;if(m.node){let y=m.node().getBBox();e.height=y.height,g=y.height}return g},"drawActorTypeCollections"),tJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower(),u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua(),f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name;let d=h.height/2,p=d/(2.5+h.height/50),m=u.append("g"),g=u.append("g");if(m.append("path").attr("d",`M ${h.x},${h.y+d} + a ${p},${d} 0 0 0 0,${h.height} + h ${h.width-2*p} + a ${p},${d} 0 0 0 0,-${h.height} + Z + `).attr("class",f),g.append("path").attr("d",`M ${h.x},${h.y+d} + a ${p},${d} 0 0 0 0,${h.height}`).attr("stroke","#666").attr("stroke-width","1px").attr("class",f),m.attr("transform",`translate(${p}, ${-(h.height/2)})`),g.attr("transform",`translate(${h.width-p}, ${-h.height/2})`),e.rectData=h,e.properties?.icon){let x=e.properties.icon.trim(),b=h.x+h.width-20,T=h.y+10;x.charAt(0)==="@"?lT(u,b,T,x.substr(1)):oT(u,b,T,x)}oh(r,kn(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${eC}`},r);let y=e.height,v=m.select("path:last-child");if(v.node()){let x=v.node().getBBox();e.height=x.height,y=x.height}return y},"drawActorTypeQueue"),rJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+75,l=t.append("g").lower();n||(Fr++,l.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr);let u=t.append("g"),h=Xf;n?h+=` ${Kf}`:h+=` ${jf}`,u.attr("class",h),u.attr("name",e.name);let f=ua();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor";let d=e.x+e.width/2,p=i+30,m=18;u.append("defs").append("marker").attr("id","filled-head-control").attr("refX",11).attr("refY",5.8).attr("markerWidth",20).attr("markerHeight",28).attr("orient","172.5").append("path").attr("d","M 14.4 5.6 L 7.2 10.4 L 8.8 5.6 L 7.2 0.8 Z"),u.append("circle").attr("cx",d).attr("cy",p).attr("r",m).attr("fill","#eaeaf7").attr("stroke","#666").attr("stroke-width",1.2),u.append("line").attr("marker-end","url(#filled-head-control)").attr("transform",`translate(${d}, ${p-m})`);let g=u.node().getBBox();return e.height=g.height+2*(r?.sequence?.labelBoxHeight??0),oh(r,kn(e.description))(e.description,u,f.x,f.y+m+(n?5:10),f.width,f.height,{class:`actor ${Xf}`},r),e.height},"drawActorTypeControl"),nJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+75,l=t.append("g").lower(),u=t.append("g"),h=Xf;n?h+=` ${Kf}`:h+=` ${jf}`,u.attr("class",h),u.attr("name",e.name);let f=ua();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor";let d=e.x+e.width/2,p=i+(n?10:25),m=18;u.append("circle").attr("cx",d).attr("cy",p).attr("r",m).attr("width",e.width).attr("height",e.height),u.append("line").attr("x1",d-m).attr("x2",d+m).attr("y1",p+m).attr("y2",p+m).attr("stroke","#333").attr("stroke-width",2);let g=u.node().getBBox();return e.height=g.height+(r?.sequence?.labelBoxHeight??0),n||(Fr++,l.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr),oh(r,kn(e.description))(e.description,u,f.x,f.y+(n?(p-i+m-5)/2:(p+m-i)/2),f.width,f.height,{class:`actor ${Xf}`},r),n?u.attr("transform",`translate(0, ${m/2})`):u.attr("transform",`translate(0, ${m/2})`),e.height},"drawActorTypeEntity"),iJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height+2*r.boxTextMargin,l=t.append("g").lower(),u=l;n||(Fr++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",tC(`actor${Fr}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Fr,e.links!=null&&u.attr("id","root-"+Fr));let h=ua(),f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Kf}`:f+=` ${jf}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.name=e.name,h.x=e.x,h.y=i;let d=h.width/4,p=h.width/4,m=d/2,g=m/(2.5+d/50),y=u.append("g"),v=` + M ${h.x},${h.y+g} + a ${m},${g} 0 0 0 ${d},0 + a ${m},${g} 0 0 0 -${d},0 + l 0,${p-2*g} + a ${m},${g} 0 0 0 ${d},0 + l 0,-${p-2*g} +`;y.append("path").attr("d",v).attr("fill","#eaeaea").attr("stroke","#000").attr("stroke-width",1).attr("class",f),n?y.attr("transform",`translate(${d*1.5}, ${h.height/4-2*g})`):y.attr("transform",`translate(${d*1.5}, ${(h.height+g)/4})`),e.rectData=h,oh(r,kn(e.description))(e.description,u,h.x,h.y+(n?(h.height+p)/4:(h.height+g)/2),h.width,h.height,{class:`actor ${eC}`},r);let x=y.select("path:last-child");if(x.node()){let b=x.node().getBBox();e.height=b.height+(r.sequence.labelBoxHeight??0)}return e.height},"drawActorTypeDatabase"),aJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=30,u=t.append("g").lower();n||(Fr++,u.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr);let h=t.append("g"),f=Xf;n?f+=` ${Kf}`:f+=` ${jf}`,h.attr("class",f),h.attr("name",e.name);let d=ua();d.x=e.x,d.y=i,d.fill="#eaeaea",d.width=e.width,d.height=e.height,d.class="actor",h.append("line").attr("id","actor-man-torso"+Fr).attr("x1",e.x+e.width/2-l*2.5).attr("y1",i+10).attr("x2",e.x+e.width/2-15).attr("y2",i+10),h.append("line").attr("id","actor-man-arms"+Fr).attr("x1",e.x+e.width/2-l*2.5).attr("y1",i+0).attr("x2",e.x+e.width/2-l*2.5).attr("y2",i+20),h.append("circle").attr("cx",e.x+e.width/2).attr("cy",i+10).attr("r",l);let p=h.node().getBBox();return e.height=p.height+(r.sequence.labelBoxHeight??0),oh(r,kn(e.description))(e.description,h,d.x,d.y+(n?l/2-4:l/2+3),d.width,d.height,{class:`actor ${Xf}`},r),n?h.attr("transform",`translate(0,${l/2+7})`):h.attr("transform",`translate(0,${l/2+7})`),e.height},"drawActorTypeBoundary"),sJe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=t.append("g").lower();n||(Fr++,l.append("line").attr("id","actor"+Fr).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Fr);let u=t.append("g"),h=Xf;n?h+=` ${Kf}`:h+=` ${jf}`,u.attr("class",h),u.attr("name",e.name);let f=ua();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor",f.rx=3,f.ry=3,u.append("line").attr("id","actor-man-torso"+Fr).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),u.append("line").attr("id","actor-man-arms"+Fr).attr("x1",a-Yf/2).attr("y1",i+33).attr("x2",a+Yf/2).attr("y2",i+33),u.append("line").attr("x1",a-Yf/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),u.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+Yf/2-2).attr("y2",i+60);let d=u.append("circle");d.attr("cx",e.x+e.width/2),d.attr("cy",i+10),d.attr("r",15),d.attr("width",e.width),d.attr("height",e.height);let p=u.node().getBBox();return e.height=p.height,oh(r,kn(e.description))(e.description,u,f.x,f.y+35,f.width,f.height,{class:`actor ${Xf}`},r),e.height},"drawActorTypeActor"),oJe=o(async function(t,e,r,n){switch(e.type){case"actor":return await sJe(t,e,r,n);case"participant":return await JZe(t,e,r,n);case"boundary":return await aJe(t,e,r,n);case"control":return await rJe(t,e,r,n);case"entity":return await nJe(t,e,r,n);case"database":return await iJe(t,e,r,n);case"collections":return await eJe(t,e,r,n);case"queue":return await tJe(t,e,r,n)}},"drawActor"),lJe=o(function(t,e,r){let i=t.append("g");Fye(i,e),e.name&&oh(r)(e.name,i,e.x,e.y+r.boxTextMargin+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),cJe=o(function(t){return t.append("g")},"anchorElement"),uJe=o(function(t,e,r,n,i){let a=ua(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,T4(s,a)},"drawActivation"),hJe=o(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:l,messageFontFamily:u,messageFontSize:h,messageFontWeight:f}=n,d=t.append("g"),p=o(function(y,v,x,b){return d.append("line").attr("x1",y).attr("y1",v).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");p(e.startx,e.starty,e.stopx,e.starty),p(e.stopx,e.starty,e.stopx,e.stopy),p(e.startx,e.stopy,e.stopx,e.stopy),p(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(y){p(e.startx,y.y,e.stopx,y.y).style("stroke-dasharray","3, 3")});let m=t2();m.text=r,m.x=e.startx,m.y=e.starty,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.anchor="middle",m.valign="middle",m.tspan=!1,m.width=l||50,m.height=s||20,m.textMargin=a,m.class="labelText",Bye(d,m),m=$ye(),m.text=e.title,m.x=e.startx+l/2+(e.stopx-e.startx)/2,m.y=e.starty+i+a,m.anchor="middle",m.valign="middle",m.textMargin=a,m.class="loopText",m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=!0;let g=kn(m.text)?await w4(d,m,e):o0(d,m);if(e.sectionTitles!==void 0){for(let[y,v]of Object.entries(e.sectionTitles))if(v.message){m.text=v.message,m.x=e.startx+(e.stopx-e.startx)/2,m.y=e.sections[y].y+i+a,m.class="loopText",m.anchor="middle",m.valign="middle",m.tspan=!1,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=e.wrap,kn(m.text)?(e.starty=e.sections[y].y,await w4(d,m,e)):o0(d,m);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,T)=>b+T));e.sections[y].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),d},"drawLoop"),Fye=o(function(t,e){sT(t,e)},"drawBackgroundRect"),fJe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),dJe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),pJe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),mJe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),gJe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),yJe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),vJe=o(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),$ye=o(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),xJe=o(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),oh=(function(){function t(a,s,l,u,h,f,d){let p=s.append("text").attr("x",l+h/2).attr("y",u+f/2+5).style("text-anchor","middle").text(a);i(p,d)}o(t,"byText");function e(a,s,l,u,h,f,d,p){let{actorFontSize:m,actorFontFamily:g,actorFontWeight:y}=p,[v,x]=vc(m),b=a.split(tt.lineBreakRegex);for(let T=0;T{let s=l0(Me),l=a.actorKeys.reduce((d,p)=>d+=t.get(p).width+(t.get(p).margin||0),0),u=Me.boxMargin*8;l+=u,l-=2*Me.boxTextMargin,a.wrap&&(a.name=qt.wrapLabel(a.name,l-2*Me.wrapPadding,s));let h=qt.calculateTextDimensions(a.name,s);i=tt.getMax(h.height,i);let f=tt.getMax(l,h.width+2*Me.wrapPadding);if(a.margin=Me.boxTextMargin,la.textMaxHeight=i),tt.getMax(n,Me.height)}var Me,ot,TJe,l0,ay,n$,kJe,EJe,i$,Vye,Uye,rC,Gye,CJe,_Je,LJe,RJe,NJe,Hye,qye=N(()=>{"use strict";yr();zye();pt();gr();gr();r2();Xt();v0();tr();Ei();e$();Me={},ot={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:o(function(){return Math.max.apply(null,this.actors.length===0?[0]:this.actors.map(t=>t.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:o(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:o(function(t){this.boxes.push(t)},"addBox"),addActor:o(function(t){this.actors.push(t)},"addActor"),addLoop:o(function(t){this.loops.push(t)},"addLoop"),addMessage:o(function(t){this.messages.push(t)},"addMessage"),addNote:o(function(t){this.notes.push(t)},"addNote"),lastActor:o(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:o(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:o(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:o(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:o(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Uye(ge())},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=this,a=0;function s(l){return o(function(h){a++;let f=i.sequenceItems.length-a+1;i.updateVal(h,"starty",e-f*Me.boxMargin,Math.min),i.updateVal(h,"stopy",n+f*Me.boxMargin,Math.max),i.updateVal(ot.data,"startx",t-f*Me.boxMargin,Math.min),i.updateVal(ot.data,"stopx",r+f*Me.boxMargin,Math.max),l!=="activation"&&(i.updateVal(h,"startx",t-f*Me.boxMargin,Math.min),i.updateVal(h,"stopx",r+f*Me.boxMargin,Math.max),i.updateVal(ot.data,"starty",e-f*Me.boxMargin,Math.min),i.updateVal(ot.data,"stopy",n+f*Me.boxMargin,Math.max))},"updateItemBounds")}o(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:o(function(t,e,r,n){let i=tt.getMin(t,r),a=tt.getMax(t,r),s=tt.getMin(e,n),l=tt.getMax(e,n);this.updateVal(ot.data,"startx",i,Math.min),this.updateVal(ot.data,"starty",s,Math.min),this.updateVal(ot.data,"stopx",a,Math.max),this.updateVal(ot.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),newActivation:o(function(t,e,r){let n=r.get(t.from),i=rC(t.from).length||0,a=n.x+n.width/2+(i-1)*Me.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Me.activationWidth,stopy:void 0,actor:t.from,anchored:mi.anchorElement(e)})},"newActivation"),endActivation:o(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:o(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:o(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:o(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:ot.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:o(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:o(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=tt.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return{bounds:this.data,models:this.models}},"getBounds")},TJe=o(async function(t,e){ot.bumpVerticalPos(Me.boxMargin),e.height=Me.boxMargin,e.starty=ot.getVerticalPos();let r=ua();r.x=e.startx,r.y=e.starty,r.width=e.width||Me.width,r.class="note";let n=t.append("g"),i=mi.drawRect(n,r),a=t2();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Me.noteFontFamily,a.fontSize=Me.noteFontSize,a.fontWeight=Me.noteFontWeight,a.anchor=Me.noteAlign,a.textMargin=Me.noteMargin,a.valign="center";let s=kn(a.text)?await w4(n,a):o0(n,a),l=Math.round(s.map(u=>(u._groups||u)[0][0].getBBox().height).reduce((u,h)=>u+h));i.attr("height",l+2*Me.noteMargin),e.height+=l+2*Me.noteMargin,ot.bumpVerticalPos(l+2*Me.noteMargin),e.stopy=e.starty+l+2*Me.noteMargin,e.stopx=e.startx+r.width,ot.insert(e.startx,e.starty,e.stopx,e.stopy),ot.models.addNote(e)},"drawNote"),l0=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),ay=o(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),n$=o(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");o(wJe,"boundMessage");kJe=o(async function(t,e,r,n){let{startx:i,stopx:a,starty:s,message:l,type:u,sequenceIndex:h,sequenceVisible:f}=e,d=qt.calculateTextDimensions(l,l0(Me)),p=t2();p.x=i,p.y=s+10,p.width=a-i,p.class="messageText",p.dy="1em",p.text=l,p.fontFamily=Me.messageFontFamily,p.fontSize=Me.messageFontSize,p.fontWeight=Me.messageFontWeight,p.anchor=Me.messageAlign,p.valign="center",p.textMargin=Me.wrapPadding,p.tspan=!1,kn(p.text)?await w4(t,p,{startx:i,stopx:a,starty:r}):o0(t,p);let m=d.width,g;i===a?Me.rightAngles?g=t.append("path").attr("d",`M ${i},${r} H ${i+tt.getMax(Me.width/2,m/2)} V ${r+25} H ${i}`):g=t.append("path").attr("d","M "+i+","+r+" C "+(i+60)+","+(r-10)+" "+(i+60)+","+(r+30)+" "+i+","+(r+20)):(g=t.append("line"),g.attr("x1",i),g.attr("y1",r),g.attr("x2",a),g.attr("y2",r)),u===n.db.LINETYPE.DOTTED||u===n.db.LINETYPE.DOTTED_CROSS||u===n.db.LINETYPE.DOTTED_POINT||u===n.db.LINETYPE.DOTTED_OPEN||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED?(g.style("stroke-dasharray","3, 3"),g.attr("class","messageLine1")):g.attr("class","messageLine0");let y="";Me.arrowMarkerAbsolute&&(y=md(!0)),g.attr("stroke-width",2),g.attr("stroke","none"),g.style("fill","none"),(u===n.db.LINETYPE.SOLID||u===n.db.LINETYPE.DOTTED)&&g.attr("marker-end","url("https://github.com/+y+%22#arrowhead)"),(u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(g.attr("marker-start","url("https://github.com/+y+%22#arrowhead)"),g.attr("marker-end","url("https://github.com/+y+%22#arrowhead)")),(u===n.db.LINETYPE.SOLID_POINT||u===n.db.LINETYPE.DOTTED_POINT)&&g.attr("marker-end","url("https://github.com/+y+%22#filled-head)"),(u===n.db.LINETYPE.SOLID_CROSS||u===n.db.LINETYPE.DOTTED_CROSS)&&g.attr("marker-end","url("https://github.com/+y+%22#crosshead)"),(f||Me.showSequenceNumbers)&&((u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(ii&&(i=h.height),h.width+l.x>a&&(a=h.width+l.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),Uye=o(function(t){Rn(Me,t),t.fontFamily&&(Me.actorFontFamily=Me.noteFontFamily=Me.messageFontFamily=t.fontFamily),t.fontSize&&(Me.actorFontSize=Me.noteFontSize=Me.messageFontSize=t.fontSize),t.fontWeight&&(Me.actorFontWeight=Me.noteFontWeight=Me.messageFontWeight=t.fontWeight)},"setConf"),rC=o(function(t){return ot.activations.filter(function(e){return e.actor===t})},"actorActivations"),Gye=o(function(t,e){let r=e.get(t),n=rC(t),i=n.reduce(function(s,l){return tt.getMin(s,l.startx)},r.x+r.width/2-1),a=n.reduce(function(s,l){return tt.getMax(s,l.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");o(ru,"adjustLoopHeightForWrap");o(SJe,"adjustCreatedDestroyedData");CJe=o(async function(t,e,r,n){let{securityLevel:i,sequence:a}=ge();Me=a;let s;i==="sandbox"&&(s=qe("#i"+e));let l=i==="sandbox"?qe(s.nodes()[0].contentDocument.body):qe("body"),u=i==="sandbox"?s.nodes()[0].contentDocument:document;ot.init(),X.debug(n.db);let h=i==="sandbox"?l.select(`[id="${e}"]`):qe(`[id="${e}"]`),f=n.db.getActors(),d=n.db.getCreatedActors(),p=n.db.getDestroyedActors(),m=n.db.getBoxes(),g=n.db.getActorKeys(),y=n.db.getMessages(),v=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),T=await AJe(f,y,n);if(Me.height=await DJe(f,T,m),mi.insertComputerIcon(h),mi.insertDatabaseIcon(h),mi.insertClockIcon(h),x&&(ot.bumpVerticalPos(Me.boxMargin),b&&ot.bumpVerticalPos(m[0].textMaxHeight)),Me.hideUnusedParticipants===!0){let B=new Set;y.forEach(F=>{B.add(F.from),B.add(F.to)}),g=g.filter(F=>B.has(F))}EJe(h,f,d,g,0,y,!1);let S=await NJe(y,f,T,n);mi.insertArrowHead(h),mi.insertArrowCrossHead(h),mi.insertArrowFilledHead(h),mi.insertSequenceNumber(h);function w(B,F){let G=ot.endActivation(B);G.starty+18>F&&(G.starty=F-6,F+=12),mi.drawActivation(h,G,F,Me,rC(B.from).length),ot.insert(G.startx,F-10,G.stopx,F)}o(w,"activeEnd");let k=1,A=1,C=[],R=[],I=0;for(let B of y){let F,G,$;switch(B.type){case n.db.LINETYPE.NOTE:ot.resetVerticalPos(),G=B.noteModel,await TJe(h,G);break;case n.db.LINETYPE.ACTIVE_START:ot.newActivation(B,h,f);break;case n.db.LINETYPE.ACTIVE_END:w(B,ot.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.LOOP_END:F=ot.endLoop(),await mi.drawLoop(h,F,"loop",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.RECT_START:ru(S,B,Me.boxMargin,Me.boxMargin,U=>ot.newLoop(void 0,U.message));break;case n.db.LINETYPE.RECT_END:F=ot.endLoop(),R.push(F),ot.models.addLoop(F),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos());break;case n.db.LINETYPE.OPT_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.OPT_END:F=ot.endLoop(),await mi.drawLoop(h,F,"opt",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.ALT_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.ALT_ELSE:ru(S,B,Me.boxMargin+Me.boxTextMargin,Me.boxMargin,U=>ot.addSectionToLoop(U));break;case n.db.LINETYPE.ALT_END:F=ot.endLoop(),await mi.drawLoop(h,F,"alt",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U)),ot.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:ru(S,B,Me.boxMargin+Me.boxTextMargin,Me.boxMargin,U=>ot.addSectionToLoop(U));break;case n.db.LINETYPE.PAR_END:F=ot.endLoop(),await mi.drawLoop(h,F,"par",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.AUTONUMBER:k=B.message.start||k,A=B.message.step||A,B.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.CRITICAL_OPTION:ru(S,B,Me.boxMargin+Me.boxTextMargin,Me.boxMargin,U=>ot.addSectionToLoop(U));break;case n.db.LINETYPE.CRITICAL_END:F=ot.endLoop(),await mi.drawLoop(h,F,"critical",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;case n.db.LINETYPE.BREAK_START:ru(S,B,Me.boxMargin,Me.boxMargin+Me.boxTextMargin,U=>ot.newLoop(U));break;case n.db.LINETYPE.BREAK_END:F=ot.endLoop(),await mi.drawLoop(h,F,"break",Me),ot.bumpVerticalPos(F.stopy-ot.getVerticalPos()),ot.models.addLoop(F);break;default:try{$=B.msgModel,$.starty=ot.getVerticalPos(),$.sequenceIndex=k,$.sequenceVisible=n.db.showSequenceNumbers();let U=await wJe(h,$);SJe(B,$,U,I,f,d,p),C.push({messageModel:$,lineStartY:U}),ot.models.addMessage($)}catch(U){X.error("error while drawing message",U)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(B.type)&&(k=k+A),I++}X.debug("createdActors",d),X.debug("destroyedActors",p),await i$(h,f,g,!1);for(let B of C)await kJe(h,B.messageModel,B.lineStartY,n);Me.mirrorActors&&await i$(h,f,g,!0),R.forEach(B=>mi.drawBackgroundRect(h,B)),r$(h,f,g,Me);for(let B of ot.models.boxes){B.height=ot.getVerticalPos()-B.y,ot.insert(B.x,B.y,B.x+B.width,B.height);let F=Me.boxMargin*2;B.startx=B.x-F,B.starty=B.y-F*.25,B.stopx=B.startx+B.width+2*F,B.stopy=B.starty+B.height+F*.75,B.stroke="rgb(0,0,0, 0.5)",mi.drawBox(h,B,Me)}x&&ot.bumpVerticalPos(Me.boxMargin);let L=Vye(h,f,g,u),{bounds:E}=ot.getBounds();E.startx===void 0&&(E.startx=0),E.starty===void 0&&(E.starty=0),E.stopx===void 0&&(E.stopx=0),E.stopy===void 0&&(E.stopy=0);let D=E.stopy-E.starty;D2,d=o(y=>l?-y:y,"adjustValue");t.from===t.to?h=u:(t.activate&&!f&&(h+=d(Me.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(h+=d(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(u-=d(3)));let p=[n,i,a,s],m=Math.abs(u-h);t.wrap&&t.message&&(t.message=qt.wrapLabel(t.message,tt.getMax(m+2*Me.wrapPadding,Me.width),l0(Me)));let g=qt.calculateTextDimensions(t.message,l0(Me));return{width:tt.getMax(t.wrap?0:g.width+2*Me.wrapPadding,m+2*Me.wrapPadding,Me.width),height:0,startx:u,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,p),toBounds:Math.max.apply(null,p)}},"buildMessageModel"),NJe=o(async function(t,e,r,n){let i={},a=[],s,l,u;for(let h of t){switch(h.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:h.message&&(s=a.pop(),i[s.id]=s,i[h.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let d=e.get(h.from?h.from:h.to.actor),p=rC(h.from?h.from:h.to.actor).length,m=d.x+d.width/2+(p-1)*Me.activationWidth/2,g={startx:m,stopx:m+Me.activationWidth,actor:h.from,enabled:!0};ot.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let d=ot.activations.map(p=>p.actor).lastIndexOf(h.from);ot.activations.splice(d,1).splice(0,1)}break}h.placement!==void 0?(l=await LJe(h,e,n),h.noteModel=l,a.forEach(d=>{s=d,s.from=tt.getMin(s.from,l.startx),s.to=tt.getMax(s.to,l.startx+l.width),s.width=tt.getMax(s.width,Math.abs(s.from-s.to))-Me.labelBoxWidth})):(u=RJe(h,e,n),h.msgModel=u,u.startx&&u.stopx&&a.length>0&&a.forEach(d=>{if(s=d,u.startx===u.stopx){let p=e.get(h.from),m=e.get(h.to);s.from=tt.getMin(p.x-u.width/2,p.x-p.width/2,s.from),s.to=tt.getMax(m.x+u.width/2,m.x+p.width/2,s.to),s.width=tt.getMax(s.width,Math.abs(s.to-s.from))-Me.labelBoxWidth}else s.from=tt.getMin(u.startx,s.from),s.to=tt.getMax(u.stopx,s.to),s.width=tt.getMax(s.width,u.width)-Me.labelBoxWidth}))}return ot.activations=[],X.debug("Loop type widths:",i),i},"calculateLoopBounds"),Hye={bounds:ot,drawActors:i$,drawActorsPopup:Vye,setConf:Uye,draw:CJe}});var Wye={};dr(Wye,{diagram:()=>MJe});var MJe,Yye=N(()=>{"use strict";Iye();e$();Pye();Xt();qye();MJe={parser:Mye,get db(){return new J6},renderer:Hye,styles:Oye,init:o(t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,nv({sequence:{wrap:t.wrap}}))},"init")}});var a$,nC,s$=N(()=>{"use strict";a$=(function(){var t=o(function(Ie,Ne,Ce,Fe){for(Ce=Ce||{},Fe=Ie.length;Fe--;Ce[Ie[Fe]]=Ne);return Ce},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],l=[1,24],u=[1,25],h=[1,32],f=[1,33],d=[1,34],p=[1,45],m=[1,35],g=[1,36],y=[1,37],v=[1,38],x=[1,27],b=[1,28],T=[1,29],S=[1,30],w=[1,31],k=[1,44],A=[1,46],C=[1,43],R=[1,47],I=[1,9],L=[1,8,9],E=[1,58],D=[1,59],_=[1,60],O=[1,61],M=[1,62],P=[1,63],B=[1,64],F=[1,8,9,41],G=[1,76],$=[1,8,9,12,13,22,39,41,44,68,69,70,71,72,73,74,79,81],U=[1,8,9,12,13,18,20,22,39,41,44,50,60,68,69,70,71,72,73,74,79,81,86,100,102,103],j=[13,60,86,100,102,103],te=[13,60,73,74,86,100,102,103],Y=[13,60,68,69,70,71,72,86,100,102,103],oe=[1,100],J=[1,117],ue=[1,113],re=[1,109],ee=[1,115],Z=[1,110],K=[1,111],ae=[1,112],Q=[1,114],de=[1,116],ne=[22,48,60,61,82,86,87,88,89,90],Te=[1,8,9,39,41,44],q=[1,8,9,22],Ve=[1,145],pe=[1,8,9,61],Be=[1,8,9,22,48,60,61,82,86,87,88,89,90],Ye={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,classLiteralName:17,DOT:18,className:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,emptyBody:47,SPACE:48,ANNOTATION_START:49,ANNOTATION_END:50,MEMBER:51,SEPARATOR:52,relation:53,NOTE_FOR:54,noteText:55,NOTE:56,CLASSDEF:57,classList:58,stylesOpt:59,ALPHA:60,COMMA:61,direction_tb:62,direction_bt:63,direction_rl:64,direction_lr:65,relationType:66,lineType:67,AGGREGATION:68,EXTENSION:69,COMPOSITION:70,DEPENDENCY:71,LOLLIPOP:72,LINE:73,DOTTED_LINE:74,CALLBACK:75,LINK:76,LINK_TARGET:77,CLICK:78,CALLBACK_NAME:79,CALLBACK_ARGS:80,HREF:81,STYLE:82,CSSCLASS:83,style:84,styleComponent:85,NUM:86,COLON:87,UNIT:88,BRKT:89,PCT:90,commentToken:91,textToken:92,graphCodeTokens:93,textNoTagsToken:94,TAGSTART:95,TAGEND:96,"==":97,"--":98,DEFAULT:99,MINUS:100,keywords:101,UNICODE_TEXT:102,BQUOTE_STR:103,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",18:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",48:"SPACE",49:"ANNOTATION_START",50:"ANNOTATION_END",51:"MEMBER",52:"SEPARATOR",54:"NOTE_FOR",56:"NOTE",57:"CLASSDEF",60:"ALPHA",61:"COMMA",62:"direction_tb",63:"direction_bt",64:"direction_rl",65:"direction_lr",68:"AGGREGATION",69:"EXTENSION",70:"COMPOSITION",71:"DEPENDENCY",72:"LOLLIPOP",73:"LINE",74:"DOTTED_LINE",75:"CALLBACK",76:"LINK",77:"LINK_TARGET",78:"CLICK",79:"CALLBACK_NAME",80:"CALLBACK_ARGS",81:"HREF",82:"STYLE",83:"CSSCLASS",86:"NUM",87:"COLON",88:"UNIT",89:"BRKT",90:"PCT",93:"graphCodeTokens",95:"TAGSTART",96:"TAGEND",97:"==",98:"--",99:"DEFAULT",100:"MINUS",101:"keywords",102:"UNICODE_TEXT",103:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,1],[15,3],[15,2],[19,1],[19,3],[19,1],[19,2],[19,2],[19,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,3],[24,6],[43,2],[43,3],[47,0],[47,2],[47,2],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[58,1],[58,3],[32,1],[32,1],[32,1],[32,1],[53,3],[53,2],[53,2],[53,1],[66,1],[66,1],[66,1],[66,1],[66,1],[67,1],[67,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[59,1],[59,3],[84,1],[84,2],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[85,1],[91,1],[91,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[92,1],[94,1],[94,1],[94,1],[94,1],[16,1],[16,1],[16,1],[16,1],[17,1],[55,1]],performAction:o(function(Ne,Ce,Fe,fe,xe,W,he){var z=W.length-1;switch(xe){case 8:this.$=W[z-1];break;case 9:case 10:case 13:case 15:this.$=W[z];break;case 11:case 14:this.$=W[z-2]+"."+W[z];break;case 12:case 16:this.$=W[z-1]+W[z];break;case 17:case 18:this.$=W[z-1]+"~"+W[z]+"~";break;case 19:fe.addRelation(W[z]);break;case 20:W[z-1].title=fe.cleanupLabel(W[z]),fe.addRelation(W[z-1]);break;case 31:this.$=W[z].trim(),fe.setAccTitle(this.$);break;case 32:case 33:this.$=W[z].trim(),fe.setAccDescription(this.$);break;case 34:fe.addClassesToNamespace(W[z-3],W[z-1]);break;case 35:fe.addClassesToNamespace(W[z-4],W[z-1]);break;case 36:this.$=W[z],fe.addNamespace(W[z]);break;case 37:this.$=[W[z]];break;case 38:this.$=[W[z-1]];break;case 39:W[z].unshift(W[z-2]),this.$=W[z];break;case 41:fe.setCssClass(W[z-2],W[z]);break;case 42:fe.addMembers(W[z-3],W[z-1]);break;case 44:fe.setCssClass(W[z-5],W[z-3]),fe.addMembers(W[z-5],W[z-1]);break;case 45:this.$=W[z],fe.addClass(W[z]);break;case 46:this.$=W[z-1],fe.addClass(W[z-1]),fe.setClassLabel(W[z-1],W[z]);break;case 50:fe.addAnnotation(W[z],W[z-2]);break;case 51:case 64:this.$=[W[z]];break;case 52:W[z].push(W[z-1]),this.$=W[z];break;case 53:break;case 54:fe.addMember(W[z-1],fe.cleanupLabel(W[z]));break;case 55:break;case 56:break;case 57:this.$={id1:W[z-2],id2:W[z],relation:W[z-1],relationTitle1:"none",relationTitle2:"none"};break;case 58:this.$={id1:W[z-3],id2:W[z],relation:W[z-1],relationTitle1:W[z-2],relationTitle2:"none"};break;case 59:this.$={id1:W[z-3],id2:W[z],relation:W[z-2],relationTitle1:"none",relationTitle2:W[z-1]};break;case 60:this.$={id1:W[z-4],id2:W[z],relation:W[z-2],relationTitle1:W[z-3],relationTitle2:W[z-1]};break;case 61:fe.addNote(W[z],W[z-1]);break;case 62:fe.addNote(W[z]);break;case 63:this.$=W[z-2],fe.defineClass(W[z-1],W[z]);break;case 65:this.$=W[z-2].concat([W[z]]);break;case 66:fe.setDirection("TB");break;case 67:fe.setDirection("BT");break;case 68:fe.setDirection("RL");break;case 69:fe.setDirection("LR");break;case 70:this.$={type1:W[z-2],type2:W[z],lineType:W[z-1]};break;case 71:this.$={type1:"none",type2:W[z],lineType:W[z-1]};break;case 72:this.$={type1:W[z-1],type2:"none",lineType:W[z]};break;case 73:this.$={type1:"none",type2:"none",lineType:W[z]};break;case 74:this.$=fe.relationType.AGGREGATION;break;case 75:this.$=fe.relationType.EXTENSION;break;case 76:this.$=fe.relationType.COMPOSITION;break;case 77:this.$=fe.relationType.DEPENDENCY;break;case 78:this.$=fe.relationType.LOLLIPOP;break;case 79:this.$=fe.lineType.LINE;break;case 80:this.$=fe.lineType.DOTTED_LINE;break;case 81:case 87:this.$=W[z-2],fe.setClickEvent(W[z-1],W[z]);break;case 82:case 88:this.$=W[z-3],fe.setClickEvent(W[z-2],W[z-1]),fe.setTooltip(W[z-2],W[z]);break;case 83:this.$=W[z-2],fe.setLink(W[z-1],W[z]);break;case 84:this.$=W[z-3],fe.setLink(W[z-2],W[z-1],W[z]);break;case 85:this.$=W[z-3],fe.setLink(W[z-2],W[z-1]),fe.setTooltip(W[z-2],W[z]);break;case 86:this.$=W[z-4],fe.setLink(W[z-3],W[z-2],W[z]),fe.setTooltip(W[z-3],W[z-1]);break;case 89:this.$=W[z-3],fe.setClickEvent(W[z-2],W[z-1],W[z]);break;case 90:this.$=W[z-4],fe.setClickEvent(W[z-3],W[z-2],W[z-1]),fe.setTooltip(W[z-3],W[z]);break;case 91:this.$=W[z-3],fe.setLink(W[z-2],W[z]);break;case 92:this.$=W[z-4],fe.setLink(W[z-3],W[z-1],W[z]);break;case 93:this.$=W[z-4],fe.setLink(W[z-3],W[z-1]),fe.setTooltip(W[z-3],W[z]);break;case 94:this.$=W[z-5],fe.setLink(W[z-4],W[z-2],W[z]),fe.setTooltip(W[z-4],W[z-1]);break;case 95:this.$=W[z-2],fe.setCssStyle(W[z-1],W[z]);break;case 96:fe.setCssClass(W[z-1],W[z]);break;case 97:this.$=[W[z]];break;case 98:W[z-2].push(W[z]),this.$=W[z-2];break;case 100:this.$=W[z-1]+W[z];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:S,83:w,86:k,100:A,102:C,103:R},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(I,[2,5],{8:[1,48]}),{8:[1,49]},t(L,[2,19],{22:[1,50]}),t(L,[2,21]),t(L,[2,22]),t(L,[2,23]),t(L,[2,24]),t(L,[2,25]),t(L,[2,26]),t(L,[2,27]),t(L,[2,28]),t(L,[2,29]),t(L,[2,30]),{34:[1,51]},{36:[1,52]},t(L,[2,33]),t(L,[2,53],{53:53,66:56,67:57,13:[1,54],22:[1,55],68:E,69:D,70:_,71:O,72:M,73:P,74:B}),{39:[1,65]},t(F,[2,40],{39:[1,67],44:[1,66]}),t(L,[2,55]),t(L,[2,56]),{16:68,60:p,86:k,100:A,102:C},{16:39,17:40,19:69,60:p,86:k,100:A,102:C,103:R},{16:39,17:40,19:70,60:p,86:k,100:A,102:C,103:R},{16:39,17:40,19:71,60:p,86:k,100:A,102:C,103:R},{60:[1,72]},{13:[1,73]},{16:39,17:40,19:74,60:p,86:k,100:A,102:C,103:R},{13:G,55:75},{58:77,60:[1,78]},t(L,[2,66]),t(L,[2,67]),t(L,[2,68]),t(L,[2,69]),t($,[2,13],{16:39,17:40,19:80,18:[1,79],20:[1,81],60:p,86:k,100:A,102:C,103:R}),t($,[2,15],{20:[1,82]}),{15:83,16:84,17:85,60:p,86:k,100:A,102:C,103:R},{16:39,17:40,19:86,60:p,86:k,100:A,102:C,103:R},t(U,[2,123]),t(U,[2,124]),t(U,[2,125]),t(U,[2,126]),t([1,8,9,12,13,20,22,39,41,44,68,69,70,71,72,73,74,79,81],[2,127]),t(I,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,19:21,38:22,43:23,16:39,17:40,5:87,33:e,35:r,37:n,42:i,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:S,83:w,86:k,100:A,102:C,103:R}),{5:88,10:5,16:39,17:40,19:21,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,49:s,51:l,52:u,54:h,56:f,57:d,60:p,62:m,63:g,64:y,65:v,75:x,76:b,78:T,82:S,83:w,86:k,100:A,102:C,103:R},t(L,[2,20]),t(L,[2,31]),t(L,[2,32]),{13:[1,90],16:39,17:40,19:89,60:p,86:k,100:A,102:C,103:R},{53:91,66:56,67:57,68:E,69:D,70:_,71:O,72:M,73:P,74:B},t(L,[2,54]),{67:92,73:P,74:B},t(j,[2,73],{66:93,68:E,69:D,70:_,71:O,72:M}),t(te,[2,74]),t(te,[2,75]),t(te,[2,76]),t(te,[2,77]),t(te,[2,78]),t(Y,[2,79]),t(Y,[2,80]),{8:[1,95],24:96,40:94,43:23,46:a},{16:97,60:p,86:k,100:A,102:C},{41:[1,99],45:98,51:oe},{50:[1,101]},{13:[1,102]},{13:[1,103]},{79:[1,104],81:[1,105]},{22:J,48:ue,59:106,60:re,82:ee,84:107,85:108,86:Z,87:K,88:ae,89:Q,90:de},{60:[1,118]},{13:G,55:119},t(L,[2,62]),t(L,[2,128]),{22:J,48:ue,59:120,60:re,61:[1,121],82:ee,84:107,85:108,86:Z,87:K,88:ae,89:Q,90:de},t(ne,[2,64]),{16:39,17:40,19:122,60:p,86:k,100:A,102:C,103:R},t($,[2,16]),t($,[2,17]),t($,[2,18]),{39:[2,36]},{15:124,16:84,17:85,18:[1,123],39:[2,9],60:p,86:k,100:A,102:C,103:R},{39:[2,10]},t(Te,[2,45],{11:125,12:[1,126]}),t(I,[2,7]),{9:[1,127]},t(q,[2,57]),{16:39,17:40,19:128,60:p,86:k,100:A,102:C,103:R},{13:[1,130],16:39,17:40,19:129,60:p,86:k,100:A,102:C,103:R},t(j,[2,72],{66:131,68:E,69:D,70:_,71:O,72:M}),t(j,[2,71]),{41:[1,132]},{24:96,40:133,43:23,46:a},{8:[1,134],41:[2,37]},t(F,[2,41],{39:[1,135]}),{41:[1,136]},t(F,[2,43]),{41:[2,51],45:137,51:oe},{16:39,17:40,19:138,60:p,86:k,100:A,102:C,103:R},t(L,[2,81],{13:[1,139]}),t(L,[2,83],{13:[1,141],77:[1,140]}),t(L,[2,87],{13:[1,142],80:[1,143]}),{13:[1,144]},t(L,[2,95],{61:Ve}),t(pe,[2,97],{85:146,22:J,48:ue,60:re,82:ee,86:Z,87:K,88:ae,89:Q,90:de}),t(Be,[2,99]),t(Be,[2,101]),t(Be,[2,102]),t(Be,[2,103]),t(Be,[2,104]),t(Be,[2,105]),t(Be,[2,106]),t(Be,[2,107]),t(Be,[2,108]),t(Be,[2,109]),t(L,[2,96]),t(L,[2,61]),t(L,[2,63],{61:Ve}),{60:[1,147]},t($,[2,14]),{15:148,16:84,17:85,60:p,86:k,100:A,102:C,103:R},{39:[2,12]},t(Te,[2,46]),{13:[1,149]},{1:[2,4]},t(q,[2,59]),t(q,[2,58]),{16:39,17:40,19:150,60:p,86:k,100:A,102:C,103:R},t(j,[2,70]),t(L,[2,34]),{41:[1,151]},{24:96,40:152,41:[2,38],43:23,46:a},{45:153,51:oe},t(F,[2,42]),{41:[2,52]},t(L,[2,50]),t(L,[2,82]),t(L,[2,84]),t(L,[2,85],{77:[1,154]}),t(L,[2,88]),t(L,[2,89],{13:[1,155]}),t(L,[2,91],{13:[1,157],77:[1,156]}),{22:J,48:ue,60:re,82:ee,84:158,85:108,86:Z,87:K,88:ae,89:Q,90:de},t(Be,[2,100]),t(ne,[2,65]),{39:[2,11]},{14:[1,159]},t(q,[2,60]),t(L,[2,35]),{41:[2,39]},{41:[1,160]},t(L,[2,86]),t(L,[2,90]),t(L,[2,92]),t(L,[2,93],{77:[1,161]}),t(pe,[2,98],{85:146,22:J,48:ue,60:re,82:ee,86:Z,87:K,88:ae,89:Q,90:de}),t(Te,[2,8]),t(F,[2,44]),t(L,[2,94])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,36],85:[2,10],124:[2,12],127:[2,4],137:[2,52],148:[2,11],152:[2,39]},parseError:o(function(Ne,Ce){if(Ce.recoverable)this.trace(Ne);else{var Fe=new Error(Ne);throw Fe.hash=Ce,Fe}},"parseError"),parse:o(function(Ne){var Ce=this,Fe=[0],fe=[],xe=[null],W=[],he=this.table,z="",se=0,le=0,ke=0,ve=2,ye=1,Re=W.slice.call(arguments,1),_e=Object.create(this.lexer),ze={yy:{}};for(var Ke in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ke)&&(ze.yy[Ke]=this.yy[Ke]);_e.setInput(Ne,ze.yy),ze.yy.lexer=_e,ze.yy.parser=this,typeof _e.yylloc>"u"&&(_e.yylloc={});var xt=_e.yylloc;W.push(xt);var We=_e.options&&_e.options.ranges;typeof ze.yy.parseError=="function"?this.parseError=ze.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Oe(_t){Fe.length=Fe.length-2*_t,xe.length=xe.length-_t,W.length=W.length-_t}o(Oe,"popStack");function et(){var _t;return _t=fe.pop()||_e.lex()||ye,typeof _t!="number"&&(_t instanceof Array&&(fe=_t,_t=fe.pop()),_t=Ce.symbols_[_t]||_t),_t}o(et,"lex");for(var Ue,lt,Gt,vt,Lt,dt,nt={},bt,wt,yt,ft;;){if(Gt=Fe[Fe.length-1],this.defaultActions[Gt]?vt=this.defaultActions[Gt]:((Ue===null||typeof Ue>"u")&&(Ue=et()),vt=he[Gt]&&he[Gt][Ue]),typeof vt>"u"||!vt.length||!vt[0]){var Ur="";ft=[];for(bt in he[Gt])this.terminals_[bt]&&bt>ve&&ft.push("'"+this.terminals_[bt]+"'");_e.showPosition?Ur="Parse error on line "+(se+1)+`: +`+_e.showPosition()+` +Expecting `+ft.join(", ")+", got '"+(this.terminals_[Ue]||Ue)+"'":Ur="Parse error on line "+(se+1)+": Unexpected "+(Ue==ye?"end of input":"'"+(this.terminals_[Ue]||Ue)+"'"),this.parseError(Ur,{text:_e.match,token:this.terminals_[Ue]||Ue,line:_e.yylineno,loc:xt,expected:ft})}if(vt[0]instanceof Array&&vt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Gt+", token: "+Ue);switch(vt[0]){case 1:Fe.push(Ue),xe.push(_e.yytext),W.push(_e.yylloc),Fe.push(vt[1]),Ue=null,lt?(Ue=lt,lt=null):(le=_e.yyleng,z=_e.yytext,se=_e.yylineno,xt=_e.yylloc,ke>0&&ke--);break;case 2:if(wt=this.productions_[vt[1]][1],nt.$=xe[xe.length-wt],nt._$={first_line:W[W.length-(wt||1)].first_line,last_line:W[W.length-1].last_line,first_column:W[W.length-(wt||1)].first_column,last_column:W[W.length-1].last_column},We&&(nt._$.range=[W[W.length-(wt||1)].range[0],W[W.length-1].range[1]]),dt=this.performAction.apply(nt,[z,le,se,ze.yy,vt[1],xe,W].concat(Re)),typeof dt<"u")return dt;wt&&(Fe=Fe.slice(0,-1*wt*2),xe=xe.slice(0,-1*wt),W=W.slice(0,-1*wt)),Fe.push(this.productions_[vt[1]][0]),xe.push(nt.$),W.push(nt._$),yt=he[Fe[Fe.length-2]][Fe[Fe.length-1]],Fe.push(yt);break;case 3:return!0}}return!0},"parse")},He=(function(){var Ie={EOF:1,parseError:o(function(Ce,Fe){if(this.yy.parser)this.yy.parser.parseError(Ce,Fe);else throw new Error(Ce)},"parseError"),setInput:o(function(Ne,Ce){return this.yy=Ce||this.yy||{},this._input=Ne,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Ne=this._input[0];this.yytext+=Ne,this.yyleng++,this.offset++,this.match+=Ne,this.matched+=Ne;var Ce=Ne.match(/(?:\r\n?|\n).*/g);return Ce?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Ne},"input"),unput:o(function(Ne){var Ce=Ne.length,Fe=Ne.split(/(?:\r\n?|\n)/g);this._input=Ne+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ce),this.offset-=Ce;var fe=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Fe.length-1&&(this.yylineno-=Fe.length-1);var xe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Fe?(Fe.length===fe.length?this.yylloc.first_column:0)+fe[fe.length-Fe.length].length-Fe[0].length:this.yylloc.first_column-Ce},this.options.ranges&&(this.yylloc.range=[xe[0],xe[0]+this.yyleng-Ce]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Ne){this.unput(this.match.slice(Ne))},"less"),pastInput:o(function(){var Ne=this.matched.substr(0,this.matched.length-this.match.length);return(Ne.length>20?"...":"")+Ne.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Ne=this.match;return Ne.length<20&&(Ne+=this._input.substr(0,20-Ne.length)),(Ne.substr(0,20)+(Ne.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Ne=this.pastInput(),Ce=new Array(Ne.length+1).join("-");return Ne+this.upcomingInput()+` +`+Ce+"^"},"showPosition"),test_match:o(function(Ne,Ce){var Fe,fe,xe;if(this.options.backtrack_lexer&&(xe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(xe.yylloc.range=this.yylloc.range.slice(0))),fe=Ne[0].match(/(?:\r\n?|\n).*/g),fe&&(this.yylineno+=fe.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:fe?fe[fe.length-1].length-fe[fe.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Ne[0].length},this.yytext+=Ne[0],this.match+=Ne[0],this.matches=Ne,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Ne[0].length),this.matched+=Ne[0],Fe=this.performAction.call(this,this.yy,this,Ce,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Fe)return Fe;if(this._backtrack){for(var W in xe)this[W]=xe[W];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Ne,Ce,Fe,fe;this._more||(this.yytext="",this.match="");for(var xe=this._currentRules(),W=0;WCe[0].length)){if(Ce=Fe,fe=W,this.options.backtrack_lexer){if(Ne=this.test_match(Fe,xe[W]),Ne!==!1)return Ne;if(this._backtrack){Ce=!1;continue}else return!1}else if(!this.options.flex)break}return Ce?(Ne=this.test_match(Ce,xe[fe]),Ne!==!1?Ne:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ce=this.next();return Ce||this.lex()},"lex"),begin:o(function(Ce){this.conditionStack.push(Ce)},"begin"),popState:o(function(){var Ce=this.conditionStack.length-1;return Ce>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ce){return Ce=this.conditionStack.length-1-Math.abs(Ce||0),Ce>=0?this.conditionStack[Ce]:"INITIAL"},"topState"),pushState:o(function(Ce){this.begin(Ce)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ce,Fe,fe,xe){var W=xe;switch(fe){case 0:return 62;case 1:return 63;case 2:return 64;case 3:return 65;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 79;case 22:this.popState();break;case 23:return 80;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 82;case 28:return 57;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 83;case 50:return 75;case 51:return 76;case 52:return 78;case 53:return 54;case 54:return 56;case 55:return 49;case 56:return 50;case 57:return 81;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 77;case 65:return 77;case 66:return 77;case 67:return 77;case 68:return 69;case 69:return 69;case 70:return 71;case 71:return 71;case 72:return 70;case 73:return 68;case 74:return 72;case 75:return 73;case 76:return 74;case 77:return 22;case 78:return 44;case 79:return 100;case 80:return 18;case 81:return"PLUS";case 82:return 87;case 83:return 61;case 84:return 89;case 85:return 89;case 86:return 90;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 60;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 86;case 94:return 102;case 95:return 48;case 96:return 48;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return Ie})();Ye.lexer=He;function Le(){this.yy={}}return o(Le,"Parser"),Le.prototype=Ye,Ye.Parser=Le,new Le})();a$.parser=a$;nC=a$});var Kye,k4,Qye=N(()=>{"use strict";Xt();gr();Kye=["#","+","~","-",""],k4=class{static{o(this,"ClassMember")}constructor(e,r){this.memberType=r,this.visibility="",this.classifier="",this.text="";let n=sr(e,ge());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+rc(this.id);this.memberType==="method"&&(e+=`(${rc(this.parameters.trim())})`,this.returnType&&(e+=" : "+rc(this.returnType))),e=e.trim();let r=this.parseClassifier();return{displayText:e,cssStyle:r}}parseMember(e){let r="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let s=a[1]?a[1].trim():"";if(Kye.includes(s)&&(this.visibility=s),this.id=a[2],this.parameters=a[3]?a[3].trim():"",r=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",r===""){let l=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(l)&&(r=l,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let i=e.length,a=e.substring(0,1),s=e.substring(i-1);Kye.includes(a)&&(this.visibility=a),/[$*]/.exec(s)&&(r=s),this.id=e.substring(this.visibility===""?0:1,r===""?i:i-1)}this.classifier=r,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${rc(this.id)}${this.memberType==="method"?`(${rc(this.parameters)})${this.returnType?" : "+rc(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}});var iC,Zye,c0,sy,o$=N(()=>{"use strict";yr();pt();Xt();gr();tr();ci();Qye();iC="classId-",Zye=0,c0=o(t=>tt.sanitizeText(t,ge()),"sanitizeText"),sy=class{constructor(){this.relations=[];this.classes=new Map;this.styleClasses=new Map;this.notes=[];this.interfaces=[];this.namespaces=new Map;this.namespaceCounter=0;this.functions=[];this.lineType={LINE:0,DOTTED_LINE:1};this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4};this.setupToolTips=o(e=>{let r=qe(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=qe("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),qe(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=qe(a.currentTarget);if(s.attr("title")===null)return;let u=this.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.top-14+document.body.scrollTop+"px"),r.html(r.html().replace(/<br\/>/g,"
      ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),qe(a.currentTarget).classed("hover",!1)})},"setupToolTips");this.direction="TB";this.setAccTitle=Rr;this.getAccTitle=Mr;this.setAccDescription=Ir;this.getAccDescription=Or;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getConfig=o(()=>ge().class,"getConfig");this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{o(this,"ClassDB")}splitClassNameAndType(e){let r=tt.sanitizeText(e,ge()),n="",i=r;if(r.indexOf("~")>0){let a=r.split("~");i=c0(a[0]),n=c0(a[1])}return{className:i,type:n}}setClassLabel(e,r){let n=tt.sanitizeText(e,ge());r&&(r=c0(r));let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).label=r,this.classes.get(i).text=`${r}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(e){let r=tt.sanitizeText(e,ge()),{className:n,type:i}=this.splitClassNameAndType(r);if(this.classes.has(n))return;let a=tt.sanitizeText(n,ge());this.classes.set(a,{id:a,type:i,label:a,text:`${a}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:iC+a+"-"+Zye}),Zye++}addInterface(e,r){let n={id:`interface${this.interfaces.length}`,label:e,classId:r};this.interfaces.push(n)}lookUpDomId(e){let r=tt.sanitizeText(e,ge());if(this.classes.has(r))return this.classes.get(r).domId;throw new Error("Class not found: "+r)}clear(){this.relations=[],this.classes=new Map,this.notes=[],this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",Sr()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNotes(){return this.notes}addRelation(e){X.debug("Adding relation: "+JSON.stringify(e));let r=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!r.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!r.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=tt.sanitizeText(e.relationTitle1.trim(),ge()),e.relationTitle2=tt.sanitizeText(e.relationTitle2.trim(),ge()),this.relations.push(e)}addAnnotation(e,r){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(r)}addMember(e,r){this.addClass(e);let n=this.splitClassNameAndType(e).className,i=this.classes.get(n);if(typeof r=="string"){let a=r.trim();a.startsWith("<<")&&a.endsWith(">>")?i.annotations.push(c0(a.substring(2,a.length-2))):a.indexOf(")")>0?i.methods.push(new k4(a,"method")):a&&i.members.push(new k4(a,"attribute"))}}addMembers(e,r){Array.isArray(r)&&(r.reverse(),r.forEach(n=>this.addMember(e,n)))}addNote(e,r){let n={id:`note${this.notes.length}`,class:r,text:e};this.notes.push(n)}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),c0(e.trim())}setCssClass(e,r){e.split(",").forEach(n=>{let i=n;/\d/.exec(n[0])&&(i=iC+i);let a=this.classes.get(i);a&&(a.cssClasses+=" "+r)})}defineClass(e,r){for(let n of e){let i=this.styleClasses.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,i)),r&&r.forEach(a=>{if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...r.flatMap(s=>s.split(",")))})}}setTooltip(e,r){e.split(",").forEach(n=>{r!==void 0&&(this.classes.get(n).tooltip=c0(r))})}getTooltip(e,r){return r&&this.namespaces.has(r)?this.namespaces.get(r).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,r,n){let i=ge();e.split(",").forEach(a=>{let s=a;/\d/.exec(a[0])&&(s=iC+s);let l=this.classes.get(s);l&&(l.link=qt.formatUrl(r,i),i.securityLevel==="sandbox"?l.linkTarget="_top":typeof n=="string"?l.linkTarget=c0(n):l.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFunc(i,r,n),this.classes.get(i).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,r,n){let i=tt.sanitizeText(e,ge());if(ge().securityLevel!=="loose"||r===void 0)return;let s=i;if(this.classes.has(s)){let l=this.lookUpDomId(s),u=[];if(typeof n=="string"){u=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let h=0;h{let h=document.querySelector(`[id="${l}"]`);h!==null&&h.addEventListener("click",()=>{qt.runFunc(r,...u)},!1)})}}bindFunctions(e){this.functions.forEach(r=>{r(e)})}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,children:{},domId:iC+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,r){if(this.namespaces.has(e))for(let n of r){let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).parent=e,this.namespaces.get(e).classes.set(i,this.classes.get(i))}}setCssStyle(e,r){let n=this.classes.get(e);if(!(!r||!n))for(let i of r)i.includes(",")?n.styles.push(...i.split(",")):n.styles.push(i)}getArrowMarker(e){let r;switch(e){case 0:r="aggregation";break;case 1:r="extension";break;case 2:r="composition";break;case 3:r="dependency";break;case 4:r="lollipop";break;default:r="none"}return r}getData(){let e=[],r=[],n=ge();for(let a of this.namespaces.keys()){let s=this.namespaces.get(a);if(s){let l={id:s.id,label:s.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:n.look};e.push(l)}}for(let a of this.classes.keys()){let s=this.classes.get(a);if(s){let l=s;l.parentId=s.parent,l.look=n.look,e.push(l)}}let i=0;for(let a of this.notes){i++;let s={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look};e.push(s);let l=this.classes.get(a.class)?.id??"";if(l){let u={id:`edgeNote${i}`,start:a.id,end:l,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};r.push(u)}}for(let a of this.interfaces){let s={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(s)}i=0;for(let a of this.relations){i++;let s={id:xc(a.id1,a.id2,{prefix:"id",counter:i}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:this.getDirection()}}}});var BJe,aC,l$=N(()=>{"use strict";yg();BJe=o(t=>`g.classGroup text { + fill: ${t.nodeBorder||t.classText}; + stroke: none; + font-family: ${t.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + +.nodeLabel, .edgeLabel { + color: ${t.classText}; +} +.edgeLabel .label rect { + fill: ${t.mainBkg}; +} +.label text { + fill: ${t.classText}; +} + +.labelBkg { + background: ${t.mainBkg}; +} +.edgeLabel .label span { + background: ${t.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.classGroup line { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${t.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; + line-height: initial; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} + ${zc()} +`,"getStyles"),aC=BJe});var FJe,$Je,zJe,sC,c$=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();FJe=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),$Je=o(function(t,e){return e.db.getClasses()},"getClasses"),zJe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=ge(),l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=$c(s),l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["aggregation","extension","composition","dependency","lollipop"],l.diagramId=e,await Qo(l,u);let h=8;qt.insertTitle(u,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,h,"classDiagram",a?.useMaxWidth??!0)},"draw"),sC={getClasses:$Je,draw:zJe,getDir:FJe}});var Jye={};dr(Jye,{diagram:()=>GJe});var GJe,eve=N(()=>{"use strict";s$();o$();l$();c$();GJe={parser:nC,get db(){return new sy},renderer:sC,styles:aC,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var nve={};dr(nve,{diagram:()=>qJe});var qJe,ive=N(()=>{"use strict";s$();o$();l$();c$();qJe={parser:nC,get db(){return new sy},renderer:sC,styles:aC,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var u$,oC,h$=N(()=>{"use strict";u$=(function(){var t=o(function(F,G,$,U){for($=$||{},U=F.length;U--;$[F[U]]=G);return $},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,16],u=[1,17],h=[1,18],f=[1,19],d=[1,33],p=[1,20],m=[1,21],g=[1,22],y=[1,23],v=[1,24],x=[1,26],b=[1,27],T=[1,28],S=[1,29],w=[1,30],k=[1,31],A=[1,32],C=[1,35],R=[1,36],I=[1,37],L=[1,38],E=[1,34],D=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],_=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],O=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],M={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:o(function(G,$,U,j,te,Y,oe){var J=Y.length-1;switch(te){case 3:return j.setRootDoc(Y[J]),Y[J];break;case 4:this.$=[];break;case 5:Y[J]!="nl"&&(Y[J-1].push(Y[J]),this.$=Y[J-1]);break;case 6:case 7:this.$=Y[J];break;case 8:this.$="nl";break;case 12:this.$=Y[J];break;case 13:let Z=Y[J-1];Z.description=j.trimColon(Y[J]),this.$=Z;break;case 14:this.$={stmt:"relation",state1:Y[J-2],state2:Y[J]};break;case 15:let K=j.trimColon(Y[J]);this.$={stmt:"relation",state1:Y[J-3],state2:Y[J-1],description:K};break;case 19:this.$={stmt:"state",id:Y[J-3],type:"default",description:"",doc:Y[J-1]};break;case 20:var ue=Y[J],re=Y[J-2].trim();if(Y[J].match(":")){var ee=Y[J].split(":");ue=ee[0],re=[re,ee[1]]}this.$={stmt:"state",id:ue,type:"default",description:re};break;case 21:this.$={stmt:"state",id:Y[J-3],type:"default",description:Y[J-5],doc:Y[J-1]};break;case 22:this.$={stmt:"state",id:Y[J],type:"fork"};break;case 23:this.$={stmt:"state",id:Y[J],type:"join"};break;case 24:this.$={stmt:"state",id:Y[J],type:"choice"};break;case 25:this.$={stmt:"state",id:j.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:Y[J-1].trim(),note:{position:Y[J-2].trim(),text:Y[J].trim()}};break;case 29:this.$=Y[J].trim(),j.setAccTitle(this.$);break;case 30:case 31:this.$=Y[J].trim(),j.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:Y[J-3],url:Y[J-2],tooltip:Y[J-1]};break;case 33:this.$={stmt:"click",id:Y[J-3],url:Y[J-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:Y[J-1].trim(),classes:Y[J].trim()};break;case 36:this.$={stmt:"style",id:Y[J-1].trim(),styleClass:Y[J].trim()};break;case 37:this.$={stmt:"applyClass",id:Y[J-1].trim(),styleClass:Y[J].trim()};break;case 38:j.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:j.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:j.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:j.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:Y[J].trim(),type:"default",description:""};break;case 46:this.$={stmt:"state",id:Y[J-2].trim(),classes:[Y[J].trim()],type:"default",description:""};break;case 47:this.$={stmt:"state",id:Y[J-2].trim(),classes:[Y[J].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,7]),t(D,[2,8]),t(D,[2,9]),t(D,[2,10]),t(D,[2,11]),t(D,[2,12],{14:[1,40],15:[1,41]}),t(D,[2,16]),{18:[1,42]},t(D,[2,18],{20:[1,43]}),{23:[1,44]},t(D,[2,22]),t(D,[2,23]),t(D,[2,24]),t(D,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(D,[2,28]),{34:[1,49]},{36:[1,50]},t(D,[2,31]),{13:51,24:d,57:E},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(_,[2,44],{58:[1,56]}),t(_,[2,45],{58:[1,57]}),t(D,[2,38]),t(D,[2,39]),t(D,[2,40]),t(D,[2,41]),t(D,[2,6]),t(D,[2,13]),{13:58,24:d,57:E},t(D,[2,17]),t(O,i,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(D,[2,29]),t(D,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(D,[2,14],{14:[1,71]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,72],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(D,[2,34]),t(D,[2,35]),t(D,[2,36]),t(D,[2,37]),t(_,[2,46]),t(_,[2,47]),t(D,[2,15]),t(D,[2,19]),t(O,i,{7:78}),t(D,[2,26]),t(D,[2,27]),{5:[1,79]},{5:[1,80]},{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,81],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:k,48:A,51:C,52:R,53:I,54:L,57:E},t(D,[2,32]),t(D,[2,33]),t(D,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:o(function(G,$){if($.recoverable)this.trace(G);else{var U=new Error(G);throw U.hash=$,U}},"parseError"),parse:o(function(G){var $=this,U=[0],j=[],te=[null],Y=[],oe=this.table,J="",ue=0,re=0,ee=0,Z=2,K=1,ae=Y.slice.call(arguments,1),Q=Object.create(this.lexer),de={yy:{}};for(var ne in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ne)&&(de.yy[ne]=this.yy[ne]);Q.setInput(G,de.yy),de.yy.lexer=Q,de.yy.parser=this,typeof Q.yylloc>"u"&&(Q.yylloc={});var Te=Q.yylloc;Y.push(Te);var q=Q.options&&Q.options.ranges;typeof de.yy.parseError=="function"?this.parseError=de.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ve(z){U.length=U.length-2*z,te.length=te.length-z,Y.length=Y.length-z}o(Ve,"popStack");function pe(){var z;return z=j.pop()||Q.lex()||K,typeof z!="number"&&(z instanceof Array&&(j=z,z=j.pop()),z=$.symbols_[z]||z),z}o(pe,"lex");for(var Be,Ye,He,Le,Ie,Ne,Ce={},Fe,fe,xe,W;;){if(He=U[U.length-1],this.defaultActions[He]?Le=this.defaultActions[He]:((Be===null||typeof Be>"u")&&(Be=pe()),Le=oe[He]&&oe[He][Be]),typeof Le>"u"||!Le.length||!Le[0]){var he="";W=[];for(Fe in oe[He])this.terminals_[Fe]&&Fe>Z&&W.push("'"+this.terminals_[Fe]+"'");Q.showPosition?he="Parse error on line "+(ue+1)+`: +`+Q.showPosition()+` +Expecting `+W.join(", ")+", got '"+(this.terminals_[Be]||Be)+"'":he="Parse error on line "+(ue+1)+": Unexpected "+(Be==K?"end of input":"'"+(this.terminals_[Be]||Be)+"'"),this.parseError(he,{text:Q.match,token:this.terminals_[Be]||Be,line:Q.yylineno,loc:Te,expected:W})}if(Le[0]instanceof Array&&Le.length>1)throw new Error("Parse Error: multiple actions possible at state: "+He+", token: "+Be);switch(Le[0]){case 1:U.push(Be),te.push(Q.yytext),Y.push(Q.yylloc),U.push(Le[1]),Be=null,Ye?(Be=Ye,Ye=null):(re=Q.yyleng,J=Q.yytext,ue=Q.yylineno,Te=Q.yylloc,ee>0&&ee--);break;case 2:if(fe=this.productions_[Le[1]][1],Ce.$=te[te.length-fe],Ce._$={first_line:Y[Y.length-(fe||1)].first_line,last_line:Y[Y.length-1].last_line,first_column:Y[Y.length-(fe||1)].first_column,last_column:Y[Y.length-1].last_column},q&&(Ce._$.range=[Y[Y.length-(fe||1)].range[0],Y[Y.length-1].range[1]]),Ne=this.performAction.apply(Ce,[J,re,ue,de.yy,Le[1],te,Y].concat(ae)),typeof Ne<"u")return Ne;fe&&(U=U.slice(0,-1*fe*2),te=te.slice(0,-1*fe),Y=Y.slice(0,-1*fe)),U.push(this.productions_[Le[1]][0]),te.push(Ce.$),Y.push(Ce._$),xe=oe[U[U.length-2]][U[U.length-1]],U.push(xe);break;case 3:return!0}}return!0},"parse")},P=(function(){var F={EOF:1,parseError:o(function($,U){if(this.yy.parser)this.yy.parser.parseError($,U);else throw new Error($)},"parseError"),setInput:o(function(G,$){return this.yy=$||this.yy||{},this._input=G,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var G=this._input[0];this.yytext+=G,this.yyleng++,this.offset++,this.match+=G,this.matched+=G;var $=G.match(/(?:\r\n?|\n).*/g);return $?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),G},"input"),unput:o(function(G){var $=G.length,U=G.split(/(?:\r\n?|\n)/g);this._input=G+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-$),this.offset-=$;var j=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),U.length-1&&(this.yylineno-=U.length-1);var te=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:U?(U.length===j.length?this.yylloc.first_column:0)+j[j.length-U.length].length-U[0].length:this.yylloc.first_column-$},this.options.ranges&&(this.yylloc.range=[te[0],te[0]+this.yyleng-$]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(G){this.unput(this.match.slice(G))},"less"),pastInput:o(function(){var G=this.matched.substr(0,this.matched.length-this.match.length);return(G.length>20?"...":"")+G.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var G=this.match;return G.length<20&&(G+=this._input.substr(0,20-G.length)),(G.substr(0,20)+(G.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var G=this.pastInput(),$=new Array(G.length+1).join("-");return G+this.upcomingInput()+` +`+$+"^"},"showPosition"),test_match:o(function(G,$){var U,j,te;if(this.options.backtrack_lexer&&(te={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(te.yylloc.range=this.yylloc.range.slice(0))),j=G[0].match(/(?:\r\n?|\n).*/g),j&&(this.yylineno+=j.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:j?j[j.length-1].length-j[j.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+G[0].length},this.yytext+=G[0],this.match+=G[0],this.matches=G,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(G[0].length),this.matched+=G[0],U=this.performAction.call(this,this.yy,this,$,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),U)return U;if(this._backtrack){for(var Y in te)this[Y]=te[Y];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var G,$,U,j;this._more||(this.yytext="",this.match="");for(var te=this._currentRules(),Y=0;Y$[0].length)){if($=U,j=Y,this.options.backtrack_lexer){if(G=this.test_match(U,te[Y]),G!==!1)return G;if(this._backtrack){$=!1;continue}else return!1}else if(!this.options.flex)break}return $?(G=this.test_match($,te[j]),G!==!1?G:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var $=this.next();return $||this.lex()},"lex"),begin:o(function($){this.conditionStack.push($)},"begin"),popState:o(function(){var $=this.conditionStack.length-1;return $>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function($){return $=this.conditionStack.length-1-Math.abs($||0),$>=0?this.conditionStack[$]:"INITIAL"},"topState"),pushState:o(function($){this.begin($)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function($,U,j,te){var Y=te;switch(j){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:return 51;case 5:return 52;case 6:return 53;case 7:return 54;case 8:break;case 9:break;case 10:return 5;case 11:break;case 12:break;case 13:break;case 14:break;case 15:return this.pushState("SCALE"),17;break;case 16:return 18;case 17:this.popState();break;case 18:return this.begin("acc_title"),33;break;case 19:return this.popState(),"acc_title_value";break;case 20:return this.begin("acc_descr"),35;break;case 21:return this.popState(),"acc_descr_value";break;case 22:this.begin("acc_descr_multiline");break;case 23:this.popState();break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;break;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 27:return this.popState(),this.pushState("CLASSDEFID"),42;break;case 28:return this.popState(),43;break;case 29:return this.pushState("CLASS"),48;break;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;break;case 31:return this.popState(),50;break;case 32:return this.pushState("STYLE"),45;break;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;break;case 34:return this.popState(),47;break;case 35:return this.pushState("SCALE"),17;break;case 36:return 18;case 37:this.popState();break;case 38:this.pushState("STATE");break;case 39:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),U.yytext=U.yytext.slice(0,-10).trim(),27;break;case 42:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),25;break;case 43:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),26;break;case 44:return this.popState(),U.yytext=U.yytext.slice(0,-10).trim(),27;break;case 45:return 51;case 46:return 52;case 47:return 53;case 48:return 54;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";break;case 51:return this.popState(),"ID";break;case 52:this.popState();break;case 53:return"STATE_DESCR";case 54:return 19;case 55:this.popState();break;case 56:return this.popState(),this.pushState("struct"),20;break;case 57:break;case 58:return this.popState(),21;break;case 59:break;case 60:return this.begin("NOTE"),29;break;case 61:return this.popState(),this.pushState("NOTE_ID"),59;break;case 62:return this.popState(),this.pushState("NOTE_ID"),60;break;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 65:break;case 66:return"NOTE_TEXT";case 67:return this.popState(),"ID";break;case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 69:return this.popState(),U.yytext=U.yytext.substr(2).trim(),31;break;case 70:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),31;break;case 71:return 6;case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return U.yytext=U.yytext.trim(),14;break;case 77:return 15;case 78:return 28;case 79:return 58;case 80:return 5;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}};return F})();M.lexer=P;function B(){this.yy={}}return o(B,"Parser"),B.prototype=M,M.Parser=B,new B})();u$.parser=u$;oC=u$});var Qf,u0,E4,ove,lve,cve,h0,lC,f$,d$,p$,m$,cC,uC,uve,hve,g$,y$,fve,dve,oy,jJe,pve,v$,KJe,QJe,mve,gve,ZJe,yve,JJe,vve,x$,b$,xve,hC,bve,T$,fC=N(()=>{"use strict";Qf="state",u0="root",E4="relation",ove="classDef",lve="style",cve="applyClass",h0="default",lC="divider",f$="fill:none",d$="fill: #333",p$="text",m$="normal",cC="rect",uC="rectWithTitle",uve="stateStart",hve="stateEnd",g$="divider",y$="roundedWithTitle",fve="note",dve="noteGroup",oy="statediagram",jJe="state",pve=`${oy}-${jJe}`,v$="transition",KJe="note",QJe="note-edge",mve=`${v$} ${QJe}`,gve=`${oy}-${KJe}`,ZJe="cluster",yve=`${oy}-${ZJe}`,JJe="cluster-alt",vve=`${oy}-${JJe}`,x$="parent",b$="note",xve="state",hC="----",bve=`${hC}${b$}`,T$=`${hC}${x$}`});function w$(t="",e=0,r="",n=hC){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${xve}-${t}${i}-${e}`}function dC(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{let a=r.get(i);a&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...a.styles])}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function tet(t){return t?.classes?.join(" ")??""}function ret(t){return t?.styles??[]}var pC,Zf,eet,Tve,ly,kve,Eve=N(()=>{"use strict";Xt();pt();gr();fC();pC=new Map,Zf=0;o(w$,"stateDomId");eet=o((t,e,r,n,i,a,s,l)=>{X.trace("items",e),e.forEach(u=>{switch(u.stmt){case Qf:ly(t,u,r,n,i,a,s,l);break;case h0:ly(t,u,r,n,i,a,s,l);break;case E4:{ly(t,u.state1,r,n,i,a,s,l),ly(t,u.state2,r,n,i,a,s,l);let h={id:"edge"+Zf,start:u.state1.id,end:u.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:f$,labelStyle:"",label:tt.sanitizeText(u.description??"",ge()),arrowheadStyle:d$,labelpos:"c",labelType:p$,thickness:m$,classes:v$,look:s};i.push(h),Zf++}break}})},"setupDoc"),Tve=o((t,e="TB")=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");o(dC,"insertOrUpdateNode");o(tet,"getClassesFromDbInfo");o(ret,"getStylesFromDbInfo");ly=o((t,e,r,n,i,a,s,l)=>{let u=e.id,h=r.get(u),f=tet(h),d=ret(h),p=ge();if(X.info("dataFetcher parsedItem",e,h,d),u!=="root"){let m=cC;e.start===!0?m=uve:e.start===!1&&(m=hve),e.type!==h0&&(m=e.type),pC.get(u)||pC.set(u,{id:u,shape:m,description:tt.sanitizeText(u,p),cssClasses:`${f} ${pve}`,cssStyles:d});let g=pC.get(u);e.description&&(Array.isArray(g.description)?(g.shape=uC,g.description.push(e.description)):g.description?.length&&g.description.length>0?(g.shape=uC,g.description===u?g.description=[e.description]:g.description=[g.description,e.description]):(g.shape=cC,g.description=e.description),g.description=tt.sanitizeTextOrArray(g.description,p)),g.description?.length===1&&g.shape===uC&&(g.type==="group"?g.shape=y$:g.shape=cC),!g.type&&e.doc&&(X.info("Setting cluster for XCX",u,Tve(e)),g.type="group",g.isGroup=!0,g.dir=Tve(e),g.shape=e.type===lC?g$:y$,g.cssClasses=`${g.cssClasses} ${yve} ${a?vve:""}`);let y={labelStyle:"",shape:g.shape,label:g.description,cssClasses:g.cssClasses,cssCompiledStyles:[],cssStyles:g.cssStyles,id:u,dir:g.dir,domId:w$(u,Zf),type:g.type,isGroup:g.type==="group",padding:8,rx:10,ry:10,look:s};if(y.shape===g$&&(y.label=""),t&&t.id!=="root"&&(X.trace("Setting node ",u," to be child of its parent ",t.id),y.parentId=t.id),y.centerLabel=!0,e.note){let v={labelStyle:"",shape:fve,label:e.note.text,cssClasses:gve,cssStyles:[],cssCompiledStyles:[],id:u+bve+"-"+Zf,domId:w$(u,Zf,b$),type:g.type,isGroup:g.type==="group",padding:p.flowchart?.padding,look:s,position:e.note.position},x=u+T$,b={labelStyle:"",shape:dve,label:e.note.text,cssClasses:g.cssClasses,cssStyles:[],id:u+T$,domId:w$(u,Zf,x$),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};Zf++,b.id=x,v.parentId=x,dC(n,b,l),dC(n,v,l),dC(n,y,l);let T=u,S=v.id;e.note.position==="left of"&&(T=v.id,S=u),i.push({id:T+"-"+S,start:T,end:S,arrowhead:"none",arrowTypeEnd:"",style:f$,labelStyle:"",classes:mve,arrowheadStyle:d$,labelpos:"c",labelType:p$,thickness:m$,look:s})}else dC(n,y,l)}e.doc&&(X.trace("Adding nodes children "),eet(e,e.doc,r,n,i,!a,s,l))},"dataFetcher"),kve=o(()=>{pC.clear(),Zf=0},"reset")});var E$,net,iet,Sve,S$=N(()=>{"use strict";Xt();pt();ep();Nf();Mf();tr();fC();E$=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),net=o(function(t,e){return e.db.getClasses()},"getClasses"),iet=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=ge();n.db.extract(n.db.getRootDocV2());let l=n.db.getData(),u=Vo(e,i);l.type=n.type,l.layoutAlgorithm=s,l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["barb"],l.diagramId=e,await Qo(l,u);let h=8;try{(typeof n.db.getLinks=="function"?n.db.getLinks():new Map).forEach((d,p)=>{let m=typeof p=="string"?p:typeof p?.id=="string"?p.id:"";if(!m){X.warn("\u26A0\uFE0F Invalid or missing stateId from key:",JSON.stringify(p));return}let g=u.node()?.querySelectorAll("g"),y;if(g?.forEach(T=>{T.textContent?.trim()===m&&(y=T)}),!y){X.warn("\u26A0\uFE0F Could not find node matching text:",m);return}let v=y.parentNode;if(!v){X.warn("\u26A0\uFE0F Node has no parent, cannot wrap:",m);return}let x=document.createElementNS("http://www.w3.org/2000/svg","a"),b=d.url.replace(/^"+|"+$/g,"");if(x.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",b),x.setAttribute("target","_blank"),d.tooltip){let T=d.tooltip.replace(/^"+|"+$/g,"");x.setAttribute("title",T)}v.replaceChild(x,y),x.appendChild(y),X.info("\u{1F517} Wrapped node in
      tag for:",m,d.url)})}catch(f){X.error("\u274C Error injecting clickable links:",f)}qt.insertTitle(u,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ws(u,h,oy,a?.useMaxWidth??!0)},"draw"),Sve={getClasses:net,draw:iet,getDir:E$}});var ws,Ave,_ve,mC,al,gC=N(()=>{"use strict";Xt();pt();tr();gr();ci();Eve();S$();fC();ws={START_NODE:"[*]",START_TYPE:"start",END_NODE:"[*]",END_TYPE:"end",COLOR_KEYWORD:"color",FILL_KEYWORD:"fill",BG_FILL:"bgFill",STYLECLASS_SEP:","},Ave=o(()=>new Map,"newClassesList"),_ve=o(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),mC=o(t=>JSON.parse(JSON.stringify(t)),"clone"),al=class{constructor(e){this.version=e;this.nodes=[];this.edges=[];this.rootDoc=[];this.classes=Ave();this.documents={root:_ve()};this.currentDocument=this.documents.root;this.startEndCount=0;this.dividerCnt=0;this.links=new Map;this.getAccTitle=Mr;this.setAccTitle=Rr;this.getAccDescription=Or;this.setAccDescription=Ir;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{o(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(e){this.clear(!0);for(let i of Array.isArray(e)?e:e.doc)switch(i.stmt){case Qf:this.addState(i.id.trim(),i.type,i.doc,i.description,i.note);break;case E4:this.addRelation(i.state1,i.state2,i.description);break;case ove:this.addStyleClass(i.id.trim(),i.classes);break;case lve:this.handleStyleDef(i);break;case cve:this.setCssClass(i.id.trim(),i.styleClass);break;case"click":this.addLink(i.id,i.url,i.tooltip);break}let r=this.getStates(),n=ge();kve(),ly(void 0,this.getRootDocV2(),r,this.nodes,this.edges,!0,n.look,this.classes);for(let i of this.nodes)if(Array.isArray(i.label)){if(i.description=i.label.slice(1),i.isGroup&&i.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${i.id}]`);i.label=i.label[0]}}handleStyleDef(e){let r=e.id.trim().split(","),n=e.styleClass.split(",");for(let i of r){let a=this.getState(i);if(!a){let s=i.trim();this.addState(s),a=this.getState(s)}a&&(a.styles=n.map(s=>s.replace(/;/g,"")?.trim()))}}setRootDoc(e){X.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}docTranslator(e,r,n){if(r.stmt===E4){this.docTranslator(e,r.state1,!0),this.docTranslator(e,r.state2,!1);return}if(r.stmt===Qf&&(r.id===ws.START_NODE?(r.id=e.id+(n?"_start":"_end"),r.start=n):r.id=r.id.trim()),r.stmt!==u0&&r.stmt!==Qf||!r.doc)return;let i=[],a=[];for(let s of r.doc)if(s.type===lC){let l=mC(s);l.doc=mC(a),i.push(l),a=[]}else a.push(s);if(i.length>0&&a.length>0){let s={stmt:Qf,id:GL(),type:"divider",doc:mC(a)};i.push(mC(s)),r.doc=i}r.doc.forEach(s=>this.docTranslator(r,s,!0))}getRootDocV2(){return this.docTranslator({id:u0,stmt:u0},{id:u0,stmt:u0,doc:this.rootDoc},!0),{id:u0,doc:this.rootDoc}}addState(e,r=h0,n=void 0,i=void 0,a=void 0,s=void 0,l=void 0,u=void 0){let h=e?.trim();if(!this.currentDocument.states.has(h))X.info("Adding state ",h,i),this.currentDocument.states.set(h,{stmt:Qf,id:h,descriptions:[],type:r,doc:n,note:a,classes:[],styles:[],textStyles:[]});else{let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.doc||(f.doc=n),f.type||(f.type=r)}if(i&&(X.info("Setting state description",h,i),(Array.isArray(i)?i:[i]).forEach(d=>this.addDescription(h,d.trim()))),a){let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.note=a,f.note.text=tt.sanitizeText(f.note.text,ge())}s&&(X.info("Setting state classes",h,s),(Array.isArray(s)?s:[s]).forEach(d=>this.setCssClass(h,d.trim()))),l&&(X.info("Setting state styles",h,l),(Array.isArray(l)?l:[l]).forEach(d=>this.setStyle(h,d.trim()))),u&&(X.info("Setting state styles",h,l),(Array.isArray(u)?u:[u]).forEach(d=>this.setTextStyle(h,d.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:_ve()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=Ave(),e||(this.links=new Map,Sr())}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){X.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(e,r,n){this.links.set(e,{url:r,tooltip:n}),X.warn("Adding link",e,r,n)}getLinks(){return this.links}startIdIfNeeded(e=""){return e===ws.START_NODE?(this.startEndCount++,`${ws.START_TYPE}${this.startEndCount}`):e}startTypeIfNeeded(e="",r=h0){return e===ws.START_NODE?ws.START_TYPE:r}endIdIfNeeded(e=""){return e===ws.END_NODE?(this.startEndCount++,`${ws.END_TYPE}${this.startEndCount}`):e}endTypeIfNeeded(e="",r=h0){return e===ws.END_NODE?ws.END_TYPE:r}addRelationObjs(e,r,n=""){let i=this.startIdIfNeeded(e.id.trim()),a=this.startTypeIfNeeded(e.id.trim(),e.type),s=this.startIdIfNeeded(r.id.trim()),l=this.startTypeIfNeeded(r.id.trim(),r.type);this.addState(i,a,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(s,l,r.doc,r.description,r.note,r.classes,r.styles,r.textStyles),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:tt.sanitizeText(n,ge())})}addRelation(e,r,n){if(typeof e=="object"&&typeof r=="object")this.addRelationObjs(e,r,n);else if(typeof e=="string"&&typeof r=="string"){let i=this.startIdIfNeeded(e.trim()),a=this.startTypeIfNeeded(e),s=this.endIdIfNeeded(r.trim()),l=this.endTypeIfNeeded(r);this.addState(i,a),this.addState(s,l),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:n?tt.sanitizeText(n,ge()):void 0})}}addDescription(e,r){let n=this.currentDocument.states.get(e),i=r.startsWith(":")?r.replace(":","").trim():r;n?.descriptions?.push(tt.sanitizeText(i,ge()))}cleanupLabel(e){return e.startsWith(":")?e.slice(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(e,r=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let n=this.classes.get(e);r&&n&&r.split(ws.STYLECLASS_SEP).forEach(i=>{let a=i.replace(/([^;]*);/,"$1").trim();if(RegExp(ws.COLOR_KEYWORD).exec(i)){let l=a.replace(ws.FILL_KEYWORD,ws.BG_FILL).replace(ws.COLOR_KEYWORD,ws.FILL_KEYWORD);n.textStyles.push(l)}n.styles.push(a)})}getClasses(){return this.classes}setCssClass(e,r){e.split(",").forEach(n=>{let i=this.getState(n);if(!i){let a=n.trim();this.addState(a),i=this.getState(a)}i?.classes?.push(r)})}setStyle(e,r){this.getState(e)?.styles?.push(r)}setTextStyle(e,r){this.getState(e)?.textStyles?.push(r)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt==="dir")}getDirection(){return this.getDirectionStatement()?.value??"TB"}setDirection(e){let r=this.getDirectionStatement();r?r.value=e:this.rootDoc.unshift({stmt:"dir",value:e})}trimColon(e){return e.startsWith(":")?e.slice(1).trim():e.trim()}getData(){let e=ge();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:E$(this.getRootDocV2())}}getConfig(){return ge().state}}});var set,yC,C$=N(()=>{"use strict";set=o(t=>` +defs #statediagram-barbEnd { + fill: ${t.transitionColor}; + stroke: ${t.transitionColor}; + } +g.stateGroup text { + fill: ${t.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${t.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${t.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.stateGroup line { + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${t.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${t.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + + text { + fill: ${t.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${t.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; +} +.edgeLabel .label text { + fill: ${t.transitionLabelColor||t.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${t.transitionLabelColor||t.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${t.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node .fork-join { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node circle.state-end { + fill: ${t.innerEndBackground}; + stroke: ${t.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${t.compositeBackground||t.background}; + // stroke: ${t.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${t.stateBkg||t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${t.lineColor}; +} + +.statediagram-cluster rect { + fill: ${t.compositeTitleBackground}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${t.stateLabelColor}; + // line-height: 1; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${t.stateBorder||t.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${t.compositeBackground||t.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${t.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${t.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${t.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${t.lineColor}; + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),yC=set});var oet,cet,uet,het,Lve,fet,det,pet,met,A$,Dve,Rve,Nve=N(()=>{"use strict";yr();gC();tr();gr();Xt();pt();oet=o(t=>t.append("circle").attr("class","start-state").attr("r",ge().state.sizeUnit).attr("cx",ge().state.padding+ge().state.sizeUnit).attr("cy",ge().state.padding+ge().state.sizeUnit),"drawStartState"),cet=o(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",ge().state.textHeight).attr("class","divider").attr("x2",ge().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),uet=o((t,e)=>{let r=t.append("text").attr("x",2*ge().state.padding).attr("y",ge().state.textHeight+2*ge().state.padding).attr("font-size",ge().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",ge().state.padding).attr("y",ge().state.padding).attr("width",n.width+2*ge().state.padding).attr("height",n.height+2*ge().state.padding).attr("rx",ge().state.radius),r},"drawSimpleState"),het=o((t,e)=>{let r=o(function(p,m,g){let y=p.append("tspan").attr("x",2*ge().state.padding).text(m);g||y.attr("dy",ge().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*ge().state.padding).attr("y",ge().state.textHeight+1.3*ge().state.padding).attr("font-size",ge().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",ge().state.padding).attr("y",a+ge().state.padding*.4+ge().state.dividerMargin+ge().state.textHeight).attr("class","state-description"),l=!0,u=!0;e.descriptions.forEach(function(p){l||(r(s,p,u),u=!1),l=!1});let h=t.append("line").attr("x1",ge().state.padding).attr("y1",ge().state.padding+a+ge().state.dividerMargin/2).attr("y2",ge().state.padding+a+ge().state.dividerMargin/2).attr("class","descr-divider"),f=s.node().getBBox(),d=Math.max(f.width,i.width);return h.attr("x2",d+3*ge().state.padding),t.insert("rect",":first-child").attr("x",ge().state.padding).attr("y",ge().state.padding).attr("width",d+2*ge().state.padding).attr("height",f.height+a+2*ge().state.padding).attr("rx",ge().state.radius),t},"drawDescrState"),Lve=o((t,e,r)=>{let n=ge().state.padding,i=2*ge().state.padding,a=t.node().getBBox(),s=a.width,l=a.x,u=t.append("text").attr("x",0).attr("y",ge().state.titleShift).attr("font-size",ge().state.fontSize).attr("class","state-title").text(e.id),f=u.node().getBBox().width+i,d=Math.max(f,s);d===s&&(d=d+i);let p,m=t.node().getBBox();e.doc,p=l-n,f>s&&(p=(s-d)/2+n),Math.abs(l-m.x)s&&(p=l-(f-s)/2);let g=1-ge().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",d).attr("height",m.height+ge().state.textHeight+ge().state.titleShift+1).attr("rx","0"),u.attr("x",p+n),f<=s&&u.attr("x",l+(d-i)/2-f/2+n),t.insert("rect",":first-child").attr("x",p).attr("y",ge().state.titleShift-ge().state.textHeight-ge().state.padding).attr("width",d).attr("height",ge().state.textHeight*3).attr("rx",ge().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",ge().state.titleShift-ge().state.textHeight-ge().state.padding).attr("width",d).attr("height",m.height+3+2*ge().state.textHeight).attr("rx",ge().state.radius),t},"addTitleAndBox"),fet=o(t=>(t.append("circle").attr("class","end-state-outer").attr("r",ge().state.sizeUnit+ge().state.miniPadding).attr("cx",ge().state.padding+ge().state.sizeUnit+ge().state.miniPadding).attr("cy",ge().state.padding+ge().state.sizeUnit+ge().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",ge().state.sizeUnit).attr("cx",ge().state.padding+ge().state.sizeUnit+2).attr("cy",ge().state.padding+ge().state.sizeUnit+2)),"drawEndState"),det=o((t,e)=>{let r=ge().state.forkWidth,n=ge().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",ge().state.padding).attr("y",ge().state.padding)},"drawForkJoinState"),pet=o((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
      ");s=s.replace(/\n/g,"
      ");let l=s.split(tt.lineBreakRegex),u=1.25*ge().state.noteMargin;for(let h of l){let f=h.trim();if(f.length>0){let d=a.append("tspan");if(d.text(f),u===0){let p=d.node().getBBox();u+=p.height}i+=u,d.attr("x",e+ge().state.noteMargin),d.attr("y",r+i+1.25*ge().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),met=o((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",ge().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=pet(t,0,0,n);return r.attr("height",a+2*ge().state.noteMargin),r.attr("width",i+ge().state.noteMargin*2),r},"drawNote"),A$=o(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&oet(i),e.type==="end"&&fet(i),(e.type==="fork"||e.type==="join")&&det(i,e),e.type==="note"&&met(e.note.text,i),e.type==="divider"&&cet(i),e.type==="default"&&e.descriptions.length===0&&uet(i,e),e.type==="default"&&e.descriptions.length>0&&het(i,e);let a=i.node().getBBox();return n.width=a.width+2*ge().state.padding,n.height=a.height+2*ge().state.padding,n},"drawState"),Dve=0,Rve=o(function(t,e,r){let n=o(function(u){switch(u){case al.relationType.AGGREGATION:return"aggregation";case al.relationType.EXTENSION:return"extension";case al.relationType.COMPOSITION:return"composition";case al.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(u=>!Number.isNaN(u.y));let i=e.points,a=Cl().x(function(u){return u.x}).y(function(u){return u.y}).curve(No),s=t.append("path").attr("d",a(i)).attr("id","edge"+Dve).attr("class","transition"),l="";if(ge().state.arrowMarkerAbsolute&&(l=md(!0)),s.attr("marker-end","url("https://github.com/+l+%22#%22+n(al.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let u=t.append("g").attr("class","stateLabel"),{x:h,y:f}=qt.calcLabelPosition(e.points),d=tt.getRows(r.title),p=0,m=[],g=0,y=0;for(let b=0;b<=d.length;b++){let T=u.append("text").attr("text-anchor","middle").text(d[b]).attr("x",h).attr("y",f+p),S=T.node().getBBox();g=Math.max(g,S.width),y=Math.min(y,S.x),X.info(S.x,h,f+p),p===0&&(p=T.node().getBBox().height,X.info("Title height",p,f)),m.push(T)}let v=p*d.length;if(d.length>1){let b=(d.length-1)*p*.5;m.forEach((T,S)=>T.attr("y",f+S*p-b)),v=p*d.length}let x=u.node().getBBox();u.insert("rect",":first-child").attr("class","box").attr("x",h-g/2-ge().state.padding/2).attr("y",f-v/2-ge().state.padding/2-3.5).attr("width",g+ge().state.padding).attr("height",v+ge().state.padding),X.info(x)}Dve++},"drawEdge")});var bo,_$,get,yet,vet,xet,Mve,Ive,Ove=N(()=>{"use strict";yr();hN();qo();pt();gr();Nve();Xt();Ei();_$={},get=o(function(){},"setConf"),yet=o(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),vet=o(function(t,e,r,n){bo=ge().state;let i=ge().securityLevel,a;i==="sandbox"&&(a=qe("#i"+e));let s=i==="sandbox"?qe(a.nodes()[0].contentDocument.body):qe("body"),l=i==="sandbox"?a.nodes()[0].contentDocument:document;X.debug("Rendering diagram "+t);let u=s.select(`[id='${e}']`);yet(u);let h=n.db.getRootDoc();Mve(h,u,void 0,!1,s,l,n);let f=bo.padding,d=u.node().getBBox(),p=d.width+f*2,m=d.height+f*2,g=p*1.75;mn(u,m,g,bo.useMaxWidth),u.attr("viewBox",`${d.x-bo.padding} ${d.y-bo.padding} `+p+" "+m)},"draw"),xet=o(t=>t?t.length*bo.fontSizeFactor:1,"getLabelWidth"),Mve=o((t,e,r,n,i,a,s)=>{let l=new cn({compound:!0,multigraph:!0}),u,h=!0;for(u=0;u{let w=S.parentElement,k=0,A=0;w&&(w.parentElement&&(k=w.parentElement.getBBox().width),A=parseInt(w.getAttribute("data-x-shift"),10),Number.isNaN(A)&&(A=0)),S.setAttribute("x1",0-A+8),S.setAttribute("x2",k-A-8)})):X.debug("No Node "+b+": "+JSON.stringify(l.node(b)))});let v=y.getBBox();l.edges().forEach(function(b){b!==void 0&&l.edge(b)!==void 0&&(X.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(l.edge(b))),Rve(e,l.edge(b),l.edge(b).relation))}),v=y.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=v.width+2*bo.padding,x.height=v.height+2*bo.padding,X.debug("Doc rendered",x,l),x},"renderDoc"),Ive={setConf:get,draw:vet}});var Pve={};dr(Pve,{diagram:()=>bet});var bet,Bve=N(()=>{"use strict";h$();gC();C$();Ove();bet={parser:oC,get db(){return new al(1)},renderer:Ive,styles:yC,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var zve={};dr(zve,{diagram:()=>Eet});var Eet,Gve=N(()=>{"use strict";h$();gC();C$();S$();Eet={parser:oC,get db(){return new al(2)},renderer:Sve,styles:yC,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var D$,Hve,qve=N(()=>{"use strict";D$=(function(){var t=o(function(d,p,m,g){for(m=m||{},g=d.length;g--;m[d[g]]=p);return m},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,14],u={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:o(function(p,m,g,y,v,x,b){var T=x.length-1;switch(v){case 1:return x[T-1];case 2:this.$=[];break;case 3:x[T-1].push(x[T]),this.$=x[T-1];break;case 4:case 5:this.$=x[T];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(x[T].substr(6)),this.$=x[T].substr(6);break;case 9:this.$=x[T].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=x[T].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(x[T].substr(8)),this.$=x[T].substr(8);break;case 13:y.addTask(x[T-1],x[T]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:o(function(p,m){if(m.recoverable)this.trace(p);else{var g=new Error(p);throw g.hash=m,g}},"parseError"),parse:o(function(p){var m=this,g=[0],y=[],v=[null],x=[],b=this.table,T="",S=0,w=0,k=0,A=2,C=1,R=x.slice.call(arguments,1),I=Object.create(this.lexer),L={yy:{}};for(var E in this.yy)Object.prototype.hasOwnProperty.call(this.yy,E)&&(L.yy[E]=this.yy[E]);I.setInput(p,L.yy),L.yy.lexer=I,L.yy.parser=this,typeof I.yylloc>"u"&&(I.yylloc={});var D=I.yylloc;x.push(D);var _=I.options&&I.options.ranges;typeof L.yy.parseError=="function"?this.parseError=L.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function O(re){g.length=g.length-2*re,v.length=v.length-re,x.length=x.length-re}o(O,"popStack");function M(){var re;return re=y.pop()||I.lex()||C,typeof re!="number"&&(re instanceof Array&&(y=re,re=y.pop()),re=m.symbols_[re]||re),re}o(M,"lex");for(var P,B,F,G,$,U,j={},te,Y,oe,J;;){if(F=g[g.length-1],this.defaultActions[F]?G=this.defaultActions[F]:((P===null||typeof P>"u")&&(P=M()),G=b[F]&&b[F][P]),typeof G>"u"||!G.length||!G[0]){var ue="";J=[];for(te in b[F])this.terminals_[te]&&te>A&&J.push("'"+this.terminals_[te]+"'");I.showPosition?ue="Parse error on line "+(S+1)+`: +`+I.showPosition()+` +Expecting `+J.join(", ")+", got '"+(this.terminals_[P]||P)+"'":ue="Parse error on line "+(S+1)+": Unexpected "+(P==C?"end of input":"'"+(this.terminals_[P]||P)+"'"),this.parseError(ue,{text:I.match,token:this.terminals_[P]||P,line:I.yylineno,loc:D,expected:J})}if(G[0]instanceof Array&&G.length>1)throw new Error("Parse Error: multiple actions possible at state: "+F+", token: "+P);switch(G[0]){case 1:g.push(P),v.push(I.yytext),x.push(I.yylloc),g.push(G[1]),P=null,B?(P=B,B=null):(w=I.yyleng,T=I.yytext,S=I.yylineno,D=I.yylloc,k>0&&k--);break;case 2:if(Y=this.productions_[G[1]][1],j.$=v[v.length-Y],j._$={first_line:x[x.length-(Y||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(Y||1)].first_column,last_column:x[x.length-1].last_column},_&&(j._$.range=[x[x.length-(Y||1)].range[0],x[x.length-1].range[1]]),U=this.performAction.apply(j,[T,w,S,L.yy,G[1],v,x].concat(R)),typeof U<"u")return U;Y&&(g=g.slice(0,-1*Y*2),v=v.slice(0,-1*Y),x=x.slice(0,-1*Y)),g.push(this.productions_[G[1]][0]),v.push(j.$),x.push(j._$),oe=b[g[g.length-2]][g[g.length-1]],g.push(oe);break;case 3:return!0}}return!0},"parse")},h=(function(){var d={EOF:1,parseError:o(function(m,g){if(this.yy.parser)this.yy.parser.parseError(m,g);else throw new Error(m)},"parseError"),setInput:o(function(p,m){return this.yy=m||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var m=p.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:o(function(p){var m=p.length,g=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var v=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===y.length?this.yylloc.first_column:0)+y[y.length-g.length].length-g[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[v[0],v[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(p){this.unput(this.match.slice(p))},"less"),pastInput:o(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var p=this.pastInput(),m=new Array(p.length+1).join("-");return p+this.upcomingInput()+` +`+m+"^"},"showPosition"),test_match:o(function(p,m){var g,y,v;if(this.options.backtrack_lexer&&(v={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(v.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],g=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in v)this[x]=v[x];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,m,g,y;this._more||(this.yytext="",this.match="");for(var v=this._currentRules(),x=0;xm[0].length)){if(m=g,y=x,this.options.backtrack_lexer){if(p=this.test_match(g,v[x]),p!==!1)return p;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(p=this.test_match(m,v[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var m=this.next();return m||this.lex()},"lex"),begin:o(function(m){this.conditionStack.push(m)},"begin"),popState:o(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:o(function(m){this.begin(m)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(m,g,y,v){var x=v;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return d})();u.lexer=h;function f(){this.yy={}}return o(f,"Parser"),f.prototype=u,u.Parser=f,new f})();D$.parser=D$;Hve=D$});var cy,L$,S4,C4,Det,Let,Ret,Net,Met,Iet,Oet,Wve,Pet,R$,Yve=N(()=>{"use strict";Xt();ci();cy="",L$=[],S4=[],C4=[],Det=o(function(){L$.length=0,S4.length=0,cy="",C4.length=0,Sr()},"clear"),Let=o(function(t){cy=t,L$.push(t)},"addSection"),Ret=o(function(){return L$},"getSections"),Net=o(function(){let t=Wve(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),Iet=o(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(l=>l.trim()),s={section:cy,type:cy,people:a,task:t,score:n};C4.push(s)},"addTask"),Oet=o(function(t){let e={section:cy,type:cy,description:t,task:t,classes:[]};S4.push(e)},"addTaskOrg"),Wve=o(function(){let t=o(function(r){return C4[r].processed},"compileTask"),e=!0;for(let[r,n]of C4.entries())t(r),e=e&&n.processed;return e},"compileTasks"),Pet=o(function(){return Met()},"getActors"),R$={getConfig:o(()=>ge().journey,"getConfig"),clear:Det,setDiagramTitle:$r,getDiagramTitle:Pr,setAccTitle:Rr,getAccTitle:Mr,setAccDescription:Ir,getAccDescription:Or,addSection:Let,getSections:Ret,getTasks:Net,addTask:Iet,addTaskOrg:Oet,getActors:Pet}});var Bet,Xve,jve=N(()=>{"use strict";yg();Bet=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${t.textColor} + } + + .legend { + fill: ${t.textColor}; + font-family: ${t.fontFamily}; + } + + .label text { + fill: #333; + } + .label { + color: ${t.textColor} + } + + .face { + ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${t.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${t.fillType0?`fill: ${t.fillType0}`:""}; + } + .task-type-1, .section-type-1 { + ${t.fillType0?`fill: ${t.fillType1}`:""}; + } + .task-type-2, .section-type-2 { + ${t.fillType0?`fill: ${t.fillType2}`:""}; + } + .task-type-3, .section-type-3 { + ${t.fillType0?`fill: ${t.fillType3}`:""}; + } + .task-type-4, .section-type-4 { + ${t.fillType0?`fill: ${t.fillType4}`:""}; + } + .task-type-5, .section-type-5 { + ${t.fillType0?`fill: ${t.fillType5}`:""}; + } + .task-type-6, .section-type-6 { + ${t.fillType0?`fill: ${t.fillType6}`:""}; + } + .task-type-7, .section-type-7 { + ${t.fillType0?`fill: ${t.fillType7}`:""}; + } + + .actor-0 { + ${t.actor0?`fill: ${t.actor0}`:""}; + } + .actor-1 { + ${t.actor1?`fill: ${t.actor1}`:""}; + } + .actor-2 { + ${t.actor2?`fill: ${t.actor2}`:""}; + } + .actor-3 { + ${t.actor3?`fill: ${t.actor3}`:""}; + } + .actor-4 { + ${t.actor4?`fill: ${t.actor4}`:""}; + } + .actor-5 { + ${t.actor5?`fill: ${t.actor5}`:""}; + } + ${zc()} +`,"getStyles"),Xve=Bet});var N$,Fet,Qve,Zve,$et,zet,Kve,Get,Vet,Jve,Uet,uy,e2e=N(()=>{"use strict";yr();r2();N$=o(function(t,e){return Fd(t,e)},"drawRect"),Fet=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Sl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Sl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),Qve=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),Zve=o(function(t,e){return bj(t,e)},"drawText"),$et=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,Zve(t,e)},"drawLabel"),zet=o(function(t,e,r){let n=t.append("g"),i=ua();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,N$(n,i),Jve(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Kve=-1,Get=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Kve++,i.append("line").attr("id","task"+Kve).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),Fet(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=ua();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,N$(i,s);let l=e.x+14;e.people.forEach(u=>{let h=e.actors[u].color,f={cx:l,cy:e.y,r:7,fill:h,stroke:"#000",title:u,pos:e.actors[u].position};Qve(i,f),l+=10}),Jve(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),Vet=o(function(t,e){sT(t,e)},"drawBackgroundRect"),Jve=(function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{let a=lh[i].color,s={cx:20,cy:n,r:7,fill:a,stroke:"#000",pos:lh[i].position};uy.drawCircle(t,s);let l=t.append("text").attr("visibility","hidden").text(i),u=l.node().getBoundingClientRect().width;l.remove();let h=[];if(u<=r)h=[i];else{let f=i.split(" "),d="";l=t.append("text").attr("visibility","hidden"),f.forEach(p=>{let m=d?`${d} ${p}`:p;if(l.text(m),l.node().getBoundingClientRect().width>r){if(d&&h.push(d),d=p,l.text(p),l.node().getBoundingClientRect().width>r){let y="";for(let v of p)y+=v,l.text(y+"-"),l.node().getBoundingClientRect().width>r&&(h.push(y.slice(0,-1)+"-"),y=v);d=y}}else d=m}),d&&h.push(d),l.remove()}h.forEach((f,d)=>{let p={x:40,y:n+7+d*20,fill:"#666",text:f,textMargin:e.boxTextMargin??5},g=uy.drawText(t,p).node().getBoundingClientRect().width;g>vC&&g>e.leftMargin-g&&(vC=g)}),n+=Math.max(20,h.length*20)})}var Het,lh,vC,Hl,Jf,Wet,sl,M$,t2e,Yet,I$,r2e=N(()=>{"use strict";yr();e2e();Xt();Ei();Het=o(function(t){Object.keys(t).forEach(function(r){Hl[r]=t[r]})},"setConf"),lh={},vC=0;o(qet,"drawActorLegend");Hl=ge().journey,Jf=0,Wet=o(function(t,e,r,n){let i=ge(),a=i.journey.titleColor,s=i.journey.titleFontSize,l=i.journey.titleFontFamily,u=i.securityLevel,h;u==="sandbox"&&(h=qe("#i"+e));let f=u==="sandbox"?qe(h.nodes()[0].contentDocument.body):qe("body");sl.init();let d=f.select("#"+e);uy.initGraphics(d);let p=n.db.getTasks(),m=n.db.getDiagramTitle(),g=n.db.getActors();for(let S in lh)delete lh[S];let y=0;g.forEach(S=>{lh[S]={color:Hl.actorColours[y%Hl.actorColours.length],position:y},y++}),qet(d),Jf=Hl.leftMargin+vC,sl.insert(0,0,Jf,Object.keys(lh).length*50),Yet(d,p,0);let v=sl.getBounds();m&&d.append("text").text(m).attr("x",Jf).attr("font-size",s).attr("font-weight","bold").attr("y",25).attr("fill",a).attr("font-family",l);let x=v.stopy-v.starty+2*Hl.diagramMarginY,b=Jf+v.stopx+2*Hl.diagramMarginX;mn(d,x,b,Hl.useMaxWidth),d.append("line").attr("x1",Jf).attr("y1",Hl.height*4).attr("x2",b-Jf-4).attr("y2",Hl.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let T=m?70:0;d.attr("viewBox",`${v.startx} -25 ${b} ${x+T}`),d.attr("preserveAspectRatio","xMinYMin meet"),d.attr("height",x+T+25)},"draw"),sl={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:o(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=ge().journey,a=this,s=0;function l(u){return o(function(f){s++;let d=a.sequenceItems.length-s+1;a.updateVal(f,"starty",e-d*i.boxMargin,Math.min),a.updateVal(f,"stopy",n+d*i.boxMargin,Math.max),a.updateVal(sl.data,"startx",t-d*i.boxMargin,Math.min),a.updateVal(sl.data,"stopx",r+d*i.boxMargin,Math.max),u!=="activation"&&(a.updateVal(f,"startx",t-d*i.boxMargin,Math.min),a.updateVal(f,"stopx",r+d*i.boxMargin,Math.max),a.updateVal(sl.data,"starty",e-d*i.boxMargin,Math.min),a.updateVal(sl.data,"stopy",n+d*i.boxMargin,Math.max))},"updateItemBounds")}o(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:o(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),l=Math.max(e,n);this.updateVal(sl.data,"startx",i,Math.min),this.updateVal(sl.data,"starty",s,Math.min),this.updateVal(sl.data,"stopx",a,Math.max),this.updateVal(sl.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return this.data},"getBounds")},M$=Hl.sectionFills,t2e=Hl.sectionColours,Yet=o(function(t,e,r){let n=ge().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,l=0,u="#CCC",h="black",f=0;for(let[d,p]of e.entries()){if(i!==p.section){u=M$[l%M$.length],f=l%M$.length,h=t2e[l%t2e.length];let g=0,y=p.section;for(let x=d;x(lh[y]&&(g[y]=lh[y]),g),{});p.x=d*n.taskMargin+d*n.width+Jf,p.y=s,p.width=n.diagramMarginX,p.height=n.diagramMarginY,p.colour=h,p.fill=u,p.num=f,p.actors=m,uy.drawTask(t,p,n),sl.insert(p.x,p.y,p.x+p.width+n.taskMargin,450)}},"drawTasks"),I$={setConf:Het,draw:Wet}});var n2e={};dr(n2e,{diagram:()=>Xet});var Xet,i2e=N(()=>{"use strict";qve();Yve();jve();r2e();Xet={parser:Hve,db:R$,renderer:I$,styles:Xve,init:o(t=>{I$.setConf(t.journey),R$.clear()},"init")}});var P$,h2e,f2e=N(()=>{"use strict";P$=(function(){var t=o(function(p,m,g,y){for(g=g||{},y=p.length;y--;g[p[y]]=m);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,16],u=[1,17],h={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:o(function(m,g,y,v,x,b,T){var S=b.length-1;switch(x){case 1:return b[S-1];case 2:this.$=[];break;case 3:b[S-1].push(b[S]),this.$=b[S-1];break;case 4:case 5:this.$=b[S];break;case 6:case 7:this.$=[];break;case 8:v.getCommonDb().setDiagramTitle(b[S].substr(6)),this.$=b[S].substr(6);break;case 9:this.$=b[S].trim(),v.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[S].trim(),v.getCommonDb().setAccDescription(this.$);break;case 12:v.addSection(b[S].substr(8)),this.$=b[S].substr(8);break;case 15:v.addTask(b[S],0,""),this.$=b[S];break;case 16:v.addEvent(b[S].substr(2)),this.$=b[S];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:o(function(m,g){if(g.recoverable)this.trace(m);else{var y=new Error(m);throw y.hash=g,y}},"parseError"),parse:o(function(m){var g=this,y=[0],v=[],x=[null],b=[],T=this.table,S="",w=0,k=0,A=0,C=2,R=1,I=b.slice.call(arguments,1),L=Object.create(this.lexer),E={yy:{}};for(var D in this.yy)Object.prototype.hasOwnProperty.call(this.yy,D)&&(E.yy[D]=this.yy[D]);L.setInput(m,E.yy),E.yy.lexer=L,E.yy.parser=this,typeof L.yylloc>"u"&&(L.yylloc={});var _=L.yylloc;b.push(_);var O=L.options&&L.options.ranges;typeof E.yy.parseError=="function"?this.parseError=E.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function M(ee){y.length=y.length-2*ee,x.length=x.length-ee,b.length=b.length-ee}o(M,"popStack");function P(){var ee;return ee=v.pop()||L.lex()||R,typeof ee!="number"&&(ee instanceof Array&&(v=ee,ee=v.pop()),ee=g.symbols_[ee]||ee),ee}o(P,"lex");for(var B,F,G,$,U,j,te={},Y,oe,J,ue;;){if(G=y[y.length-1],this.defaultActions[G]?$=this.defaultActions[G]:((B===null||typeof B>"u")&&(B=P()),$=T[G]&&T[G][B]),typeof $>"u"||!$.length||!$[0]){var re="";ue=[];for(Y in T[G])this.terminals_[Y]&&Y>C&&ue.push("'"+this.terminals_[Y]+"'");L.showPosition?re="Parse error on line "+(w+1)+`: +`+L.showPosition()+` +Expecting `+ue.join(", ")+", got '"+(this.terminals_[B]||B)+"'":re="Parse error on line "+(w+1)+": Unexpected "+(B==R?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(re,{text:L.match,token:this.terminals_[B]||B,line:L.yylineno,loc:_,expected:ue})}if($[0]instanceof Array&&$.length>1)throw new Error("Parse Error: multiple actions possible at state: "+G+", token: "+B);switch($[0]){case 1:y.push(B),x.push(L.yytext),b.push(L.yylloc),y.push($[1]),B=null,F?(B=F,F=null):(k=L.yyleng,S=L.yytext,w=L.yylineno,_=L.yylloc,A>0&&A--);break;case 2:if(oe=this.productions_[$[1]][1],te.$=x[x.length-oe],te._$={first_line:b[b.length-(oe||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(oe||1)].first_column,last_column:b[b.length-1].last_column},O&&(te._$.range=[b[b.length-(oe||1)].range[0],b[b.length-1].range[1]]),j=this.performAction.apply(te,[S,k,w,E.yy,$[1],x,b].concat(I)),typeof j<"u")return j;oe&&(y=y.slice(0,-1*oe*2),x=x.slice(0,-1*oe),b=b.slice(0,-1*oe)),y.push(this.productions_[$[1]][0]),x.push(te.$),b.push(te._$),J=T[y[y.length-2]][y[y.length-1]],y.push(J);break;case 3:return!0}}return!0},"parse")},f=(function(){var p={EOF:1,parseError:o(function(g,y){if(this.yy.parser)this.yy.parser.parseError(g,y);else throw new Error(g)},"parseError"),setInput:o(function(m,g){return this.yy=g||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var g=m.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:o(function(m){var g=m.length,y=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var v=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),y.length-1&&(this.yylineno-=y.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:y?(y.length===v.length?this.yylloc.first_column:0)+v[v.length-y.length].length-y[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(m){this.unput(this.match.slice(m))},"less"),pastInput:o(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var m=this.pastInput(),g=new Array(m.length+1).join("-");return m+this.upcomingInput()+` +`+g+"^"},"showPosition"),test_match:o(function(m,g){var y,v,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),v=m[0].match(/(?:\r\n?|\n).*/g),v&&(this.yylineno+=v.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:v?v[v.length-1].length-v[v.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],y=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),y)return y;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,g,y,v;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=y,v=b,this.options.backtrack_lexer){if(m=this.test_match(y,x[b]),m!==!1)return m;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(m=this.test_match(g,x[v]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var g=this.next();return g||this.lex()},"lex"),begin:o(function(g){this.conditionStack.push(g)},"begin"),popState:o(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:o(function(g){this.begin(g)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(g,y,v,x){var b=x;switch(v){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return p})();h.lexer=f;function d(){this.yy={}}return o(d,"Parser"),d.prototype=h,h.Parser=d,new d})();P$.parser=P$;h2e=P$});var F$={};dr(F$,{addEvent:()=>T2e,addSection:()=>y2e,addTask:()=>b2e,addTaskOrg:()=>w2e,clear:()=>g2e,default:()=>ntt,getCommonDb:()=>m2e,getSections:()=>v2e,getTasks:()=>x2e});var hy,p2e,B$,xC,fy,m2e,g2e,y2e,v2e,x2e,b2e,T2e,w2e,d2e,ntt,k2e=N(()=>{"use strict";ci();hy="",p2e=0,B$=[],xC=[],fy=[],m2e=o(()=>rv,"getCommonDb"),g2e=o(function(){B$.length=0,xC.length=0,hy="",fy.length=0,Sr()},"clear"),y2e=o(function(t){hy=t,B$.push(t)},"addSection"),v2e=o(function(){return B$},"getSections"),x2e=o(function(){let t=d2e(),e=100,r=0;for(;!t&&rr.id===p2e-1).events.push(t)},"addEvent"),w2e=o(function(t){let e={section:hy,type:hy,description:t,task:t,classes:[]};xC.push(e)},"addTaskOrg"),d2e=o(function(){let t=o(function(r){return fy[r].processed},"compileTask"),e=!0;for(let[r,n]of fy.entries())t(r),e=e&&n.processed;return e},"compileTasks"),ntt={clear:g2e,getCommonDb:m2e,addSection:y2e,getSections:v2e,getTasks:x2e,addTask:b2e,addTaskOrg:w2e,addEvent:T2e}});function A2e(t,e){t.each(function(){var r=qe(this),n=r.text().split(/(\s+|
      )/).reverse(),i,a=[],s=1.1,l=r.attr("y"),u=parseFloat(r.attr("dy")),h=r.text(null).append("tspan").attr("x",0).attr("y",l).attr("dy",u+"em");for(let f=0;fe||i==="
      ")&&(a.pop(),h.text(a.join(" ").trim()),i==="
      "?a=[""]:a=[i],h=r.append("tspan").attr("x",0).attr("y",l).attr("dy",s+"em").text(i))})}var itt,bC,att,stt,S2e,ott,ltt,E2e,ctt,utt,htt,$$,C2e,ftt,dtt,ptt,mtt,ed,_2e=N(()=>{"use strict";yr();itt=12,bC=o(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),att=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Sl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Sl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),stt=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),S2e=o(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),ott=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,S2e(t,e)},"drawLabel"),ltt=o(function(t,e,r){let n=t.append("g"),i=$$();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,bC(n,i),C2e(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),E2e=-1,ctt=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");E2e++,i.append("line").attr("id","task"+E2e).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),att(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=$$();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,bC(i,s),C2e(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),utt=o(function(t,e){bC(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),htt=o(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),$$=o(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),C2e=(function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{"use strict";yr();_2e();pt();Xt();Ei();gtt=o(function(t,e,r,n){let i=ge(),a=i.timeline?.leftMargin??50;X.debug("timeline",n.db);let s=i.securityLevel,l;s==="sandbox"&&(l=qe("#i"+e));let h=(s==="sandbox"?qe(l.nodes()[0].contentDocument.body):qe("body")).select("#"+e);h.append("g");let f=n.db.getTasks(),d=n.db.getCommonDb().getDiagramTitle();X.debug("task",f),ed.initGraphics(h);let p=n.db.getSections();X.debug("sections",p);let m=0,g=0,y=0,v=0,x=50+a,b=50;v=50;let T=0,S=!0;p.forEach(function(R){let I={number:T,descr:R,section:T,width:150,padding:20,maxHeight:m},L=ed.getVirtualNodeHeight(h,I,i);X.debug("sectionHeight before draw",L),m=Math.max(m,L+20)});let w=0,k=0;X.debug("tasks.length",f.length);for(let[R,I]of f.entries()){let L={number:R,descr:I,section:I.section,width:150,padding:20,maxHeight:g},E=ed.getVirtualNodeHeight(h,L,i);X.debug("taskHeight before draw",E),g=Math.max(g,E+20),w=Math.max(w,I.events.length);let D=0;for(let _ of I.events){let O={descr:_,section:I.section,number:I.section,width:150,padding:20,maxHeight:50};D+=ed.getVirtualNodeHeight(h,O,i)}I.events.length>0&&(D+=(I.events.length-1)*10),k=Math.max(k,D)}X.debug("maxSectionHeight before draw",m),X.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(R=>{let I=f.filter(_=>_.section===R),L={number:T,descr:R,section:T,width:200*Math.max(I.length,1)-50,padding:20,maxHeight:m};X.debug("sectionNode",L);let E=h.append("g"),D=ed.drawNode(E,L,T,i);X.debug("sectionNode output",D),E.attr("transform",`translate(${x}, ${v})`),b+=m+50,I.length>0&&D2e(h,I,T,x,b,g,i,w,k,m,!1),x+=200*Math.max(I.length,1),b=v,T++}):(S=!1,D2e(h,f,T,x,b,g,i,w,k,m,!0));let A=h.node().getBBox();X.debug("bounds",A),d&&h.append("text").text(d).attr("x",A.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),y=S?m+g+150:g+100,h.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",y).attr("x2",A.width+3*a).attr("y2",y).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),ic(void 0,h,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),D2e=o(function(t,e,r,n,i,a,s,l,u,h,f){for(let d of e){let p={descr:d.task,section:r,number:r,width:150,padding:20,maxHeight:a};X.debug("taskNode",p);let m=t.append("g").attr("class","taskWrapper"),y=ed.drawNode(m,p,r,s).height;if(X.debug("taskHeight after draw",y),m.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,y),d.events){let v=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+ytt(t,d.events,r,n,i,s),i-=100,v.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+100+u+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,f&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),ytt=o(function(t,e,r,n,i,a){let s=0,l=i;i=i+100;for(let u of e){let h={descr:u,section:r,number:r,width:150,padding:20,maxHeight:50};X.debug("eventNode",h);let f=t.append("g").attr("class","eventWrapper"),p=ed.drawNode(f,h,r,a).height;s=s+p,f.attr("transform",`translate(${n}, ${i})`),i=i+10+p}return i=l,s},"drawEvents"),L2e={setConf:o(()=>{},"setConf"),draw:gtt}});var vtt,xtt,N2e,M2e=N(()=>{"use strict";eo();vtt=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${vtt(t)} + .section-root rect, .section-root path, .section-root circle { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`,"getStyles"),N2e=xtt});var I2e={};dr(I2e,{diagram:()=>btt});var btt,O2e=N(()=>{"use strict";f2e();k2e();R2e();M2e();btt={db:F$,renderer:L2e,parser:h2e,styles:N2e}});var z$,F2e,$2e=N(()=>{"use strict";z$=(function(){var t=o(function(S,w,k,A){for(k=k||{},A=S.length;A--;k[S[A]]=w);return k},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,6,13,15,16,19,22],g=[1,33],y=[1,34],v=[1,6,7,11,13,15,16,19,22],x={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:o(function(w,k,A,C,R,I,L){var E=I.length-1;switch(R){case 6:case 7:return C;case 8:C.getLogger().trace("Stop NL ");break;case 9:C.getLogger().trace("Stop EOF ");break;case 11:C.getLogger().trace("Stop NL2 ");break;case 12:C.getLogger().trace("Stop EOF2 ");break;case 15:C.getLogger().info("Node: ",I[E].id),C.addNode(I[E-1].length,I[E].id,I[E].descr,I[E].type);break;case 16:C.getLogger().trace("Icon: ",I[E]),C.decorateNode({icon:I[E]});break;case 17:case 21:C.decorateNode({class:I[E]});break;case 18:C.getLogger().trace("SPACELIST");break;case 19:C.getLogger().trace("Node: ",I[E].id),C.addNode(0,I[E].id,I[E].descr,I[E].type);break;case 20:C.decorateNode({icon:I[E]});break;case 25:C.getLogger().trace("node found ..",I[E-2]),this.$={id:I[E-1],descr:I[E-1],type:C.getType(I[E-2],I[E])};break;case 26:this.$={id:I[E],descr:I[E],type:C.nodeType.DEFAULT};break;case 27:C.getLogger().trace("node found ..",I[E-3]),this.$={id:I[E-3],descr:I[E-1],type:C.getType(I[E-2],I[E])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:h,7:f,10:23,11:d},t(p,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:l}),t(p,[2,18]),t(p,[2,19]),t(p,[2,20]),t(p,[2,21]),t(p,[2,23]),t(p,[2,24]),t(p,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:f,10:32,11:d},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(m,[2,14],{7:g,11:y}),t(v,[2,8]),t(v,[2,9]),t(v,[2,10]),t(p,[2,15]),t(p,[2,16]),t(p,[2,17]),{20:[1,35]},{21:[1,36]},t(m,[2,13],{7:g,11:y}),t(v,[2,11]),t(v,[2,12]),{21:[1,37]},t(p,[2,25]),t(p,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(w,k){if(k.recoverable)this.trace(w);else{var A=new Error(w);throw A.hash=k,A}},"parseError"),parse:o(function(w){var k=this,A=[0],C=[],R=[null],I=[],L=this.table,E="",D=0,_=0,O=0,M=2,P=1,B=I.slice.call(arguments,1),F=Object.create(this.lexer),G={yy:{}};for(var $ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$)&&(G.yy[$]=this.yy[$]);F.setInput(w,G.yy),G.yy.lexer=F,G.yy.parser=this,typeof F.yylloc>"u"&&(F.yylloc={});var U=F.yylloc;I.push(U);var j=F.options&&F.options.ranges;typeof G.yy.parseError=="function"?this.parseError=G.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function te(q){A.length=A.length-2*q,R.length=R.length-q,I.length=I.length-q}o(te,"popStack");function Y(){var q;return q=C.pop()||F.lex()||P,typeof q!="number"&&(q instanceof Array&&(C=q,q=C.pop()),q=k.symbols_[q]||q),q}o(Y,"lex");for(var oe,J,ue,re,ee,Z,K={},ae,Q,de,ne;;){if(ue=A[A.length-1],this.defaultActions[ue]?re=this.defaultActions[ue]:((oe===null||typeof oe>"u")&&(oe=Y()),re=L[ue]&&L[ue][oe]),typeof re>"u"||!re.length||!re[0]){var Te="";ne=[];for(ae in L[ue])this.terminals_[ae]&&ae>M&&ne.push("'"+this.terminals_[ae]+"'");F.showPosition?Te="Parse error on line "+(D+1)+`: +`+F.showPosition()+` +Expecting `+ne.join(", ")+", got '"+(this.terminals_[oe]||oe)+"'":Te="Parse error on line "+(D+1)+": Unexpected "+(oe==P?"end of input":"'"+(this.terminals_[oe]||oe)+"'"),this.parseError(Te,{text:F.match,token:this.terminals_[oe]||oe,line:F.yylineno,loc:U,expected:ne})}if(re[0]instanceof Array&&re.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ue+", token: "+oe);switch(re[0]){case 1:A.push(oe),R.push(F.yytext),I.push(F.yylloc),A.push(re[1]),oe=null,J?(oe=J,J=null):(_=F.yyleng,E=F.yytext,D=F.yylineno,U=F.yylloc,O>0&&O--);break;case 2:if(Q=this.productions_[re[1]][1],K.$=R[R.length-Q],K._$={first_line:I[I.length-(Q||1)].first_line,last_line:I[I.length-1].last_line,first_column:I[I.length-(Q||1)].first_column,last_column:I[I.length-1].last_column},j&&(K._$.range=[I[I.length-(Q||1)].range[0],I[I.length-1].range[1]]),Z=this.performAction.apply(K,[E,_,D,G.yy,re[1],R,I].concat(B)),typeof Z<"u")return Z;Q&&(A=A.slice(0,-1*Q*2),R=R.slice(0,-1*Q),I=I.slice(0,-1*Q)),A.push(this.productions_[re[1]][0]),R.push(K.$),I.push(K._$),de=L[A[A.length-2]][A[A.length-1]],A.push(de);break;case 3:return!0}}return!0},"parse")},b=(function(){var S={EOF:1,parseError:o(function(k,A){if(this.yy.parser)this.yy.parser.parseError(k,A);else throw new Error(k)},"parseError"),setInput:o(function(w,k){return this.yy=k||this.yy||{},this._input=w,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var w=this._input[0];this.yytext+=w,this.yyleng++,this.offset++,this.match+=w,this.matched+=w;var k=w.match(/(?:\r\n?|\n).*/g);return k?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),w},"input"),unput:o(function(w){var k=w.length,A=w.split(/(?:\r\n?|\n)/g);this._input=w+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-k),this.offset-=k;var C=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),A.length-1&&(this.yylineno-=A.length-1);var R=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:A?(A.length===C.length?this.yylloc.first_column:0)+C[C.length-A.length].length-A[0].length:this.yylloc.first_column-k},this.options.ranges&&(this.yylloc.range=[R[0],R[0]+this.yyleng-k]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(w){this.unput(this.match.slice(w))},"less"),pastInput:o(function(){var w=this.matched.substr(0,this.matched.length-this.match.length);return(w.length>20?"...":"")+w.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var w=this.match;return w.length<20&&(w+=this._input.substr(0,20-w.length)),(w.substr(0,20)+(w.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var w=this.pastInput(),k=new Array(w.length+1).join("-");return w+this.upcomingInput()+` +`+k+"^"},"showPosition"),test_match:o(function(w,k){var A,C,R;if(this.options.backtrack_lexer&&(R={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(R.yylloc.range=this.yylloc.range.slice(0))),C=w[0].match(/(?:\r\n?|\n).*/g),C&&(this.yylineno+=C.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:C?C[C.length-1].length-C[C.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+w[0].length},this.yytext+=w[0],this.match+=w[0],this.matches=w,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(w[0].length),this.matched+=w[0],A=this.performAction.call(this,this.yy,this,k,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),A)return A;if(this._backtrack){for(var I in R)this[I]=R[I];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var w,k,A,C;this._more||(this.yytext="",this.match="");for(var R=this._currentRules(),I=0;Ik[0].length)){if(k=A,C=I,this.options.backtrack_lexer){if(w=this.test_match(A,R[I]),w!==!1)return w;if(this._backtrack){k=!1;continue}else return!1}else if(!this.options.flex)break}return k?(w=this.test_match(k,R[C]),w!==!1?w:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var k=this.next();return k||this.lex()},"lex"),begin:o(function(k){this.conditionStack.push(k)},"begin"),popState:o(function(){var k=this.conditionStack.length-1;return k>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(k){return k=this.conditionStack.length-1-Math.abs(k||0),k>=0?this.conditionStack[k]:"INITIAL"},"topState"),pushState:o(function(k){this.begin(k)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(k,A,C,R){var I=R;switch(C){case 0:return k.getLogger().trace("Found comment",A.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:k.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return k.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:k.getLogger().trace("end icon"),this.popState();break;case 10:return k.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return k.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return k.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return k.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:k.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return k.getLogger().trace("description:",A.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),k.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),k.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),k.getLogger().trace("node end ...",A.yytext),"NODE_DEND";break;case 30:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),k.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),k.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),k.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return k.getLogger().trace("Long description:",A.yytext),20;break;case 36:return k.getLogger().trace("Long description:",A.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return S})();x.lexer=b;function T(){this.yy={}}return o(T,"Parser"),T.prototype=x,x.Parser=T,new T})();z$.parser=z$;F2e=z$});function z2e(t,e=0){return(Aa[t[e+0]]+Aa[t[e+1]]+Aa[t[e+2]]+Aa[t[e+3]]+"-"+Aa[t[e+4]]+Aa[t[e+5]]+"-"+Aa[t[e+6]]+Aa[t[e+7]]+"-"+Aa[t[e+8]]+Aa[t[e+9]]+"-"+Aa[t[e+10]]+Aa[t[e+11]]+Aa[t[e+12]]+Aa[t[e+13]]+Aa[t[e+14]]+Aa[t[e+15]]).toLowerCase()}var Aa,G2e=N(()=>{"use strict";Aa=[];for(let t=0;t<256;++t)Aa.push((t+256).toString(16).slice(1));o(z2e,"unsafeStringify")});function V$(){if(!G$){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");G$=crypto.getRandomValues.bind(crypto)}return G$(Ett)}var G$,Ett,V2e=N(()=>{"use strict";Ett=new Uint8Array(16);o(V$,"rng")});var Stt,U$,U2e=N(()=>{"use strict";Stt=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),U$={randomUUID:Stt}});function Ctt(t,e,r){if(U$.randomUUID&&!e&&!t)return U$.randomUUID();t=t||{};let n=t.random??t.rng?.()??V$();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,e){if(r=r||0,r<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let i=0;i<16;++i)e[r+i]=n[i];return e}return z2e(n)}var H$,H2e=N(()=>{"use strict";U2e();V2e();G2e();o(Ctt,"v4");H$=Ctt});var q2e=N(()=>{"use strict";H2e()});var ch,TC,W2e=N(()=>{"use strict";Xt();q2e();gr();pt();La();qn();ch={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},TC=class{constructor(){this.nodes=[];this.count=0;this.elements={};this.getLogger=this.getLogger.bind(this),this.nodeType=ch,this.clear(),this.getType=this.getType.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{o(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={},this.baseLevel=void 0}getParent(e){for(let r=this.nodes.length-1;r>=0;r--)if(this.nodes[r].level0?this.nodes[0]:null}addNode(e,r,n,i){X.info("addNode",e,r,n,i);let a=!1;this.nodes.length===0?(this.baseLevel=e,e=0,a=!0):this.baseLevel!==void 0&&(e=e-this.baseLevel,a=!1);let s=ge(),l=s.mindmap?.padding??ur.mindmap.padding;switch(i){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:l*=2;break}let u={id:this.count++,nodeId:sr(r,s),level:e,descr:sr(n,s),type:i,children:[],width:s.mindmap?.maxNodeWidth??ur.mindmap.maxNodeWidth,padding:l,isRoot:a},h=this.getParent(e);if(h)h.children.push(u),this.nodes.push(u);else if(a)this.nodes.push(u);else throw new Error(`There can be only one root. No parent could be found for ("${u.descr}")`)}getType(e,r){switch(X.debug("In get type",e,r),e){case"[":return this.nodeType.RECT;case"(":return r===")"?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;let r=ge(),n=this.nodes[this.nodes.length-1];e.icon&&(n.icon=sr(e.icon,r)),e.class&&(n.class=sr(e.class,r))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}assignSections(e,r){if(e.level===0?e.section=void 0:e.section=r,e.children)for(let[n,i]of e.children.entries()){let a=e.level===0?n:r;this.assignSections(i,a)}}flattenNodes(e,r){let n=["mindmap-node"];e.isRoot===!0?n.push("section-root","section--1"):e.section!==void 0&&n.push(`section-${e.section}`),e.class&&n.push(e.class);let i=n.join(" "),a=o(l=>{switch(l){case ch.CIRCLE:return"mindmapCircle";case ch.RECT:return"rect";case ch.ROUNDED_RECT:return"rounded";case ch.CLOUD:return"cloud";case ch.BANG:return"bang";case ch.HEXAGON:return"hexagon";case ch.DEFAULT:return"defaultMindmapNode";case ch.NO_BORDER:default:return"rect"}},"getShapeFromType"),s={id:e.id.toString(),domId:"node_"+e.id.toString(),label:e.descr,isGroup:!1,shape:a(e.type),width:e.width,height:e.height??0,padding:e.padding,cssClasses:i,cssStyles:[],look:"default",icon:e.icon,x:e.x,y:e.y,level:e.level,nodeId:e.nodeId,type:e.type,section:e.section};if(r.push(s),e.children)for(let l of e.children)this.flattenNodes(l,r)}generateEdges(e,r){if(e.children)for(let n of e.children){let i="edge";n.section!==void 0&&(i+=` section-edge-${n.section}`);let a=e.level+1;i+=` edge-depth-${a}`;let s={id:`edge_${e.id}_${n.id}`,start:e.id.toString(),end:n.id.toString(),type:"normal",curve:"basis",thickness:"normal",look:"default",classes:i,depth:e.level,section:n.section};r.push(s),this.generateEdges(n,r)}}getData(){let e=this.getMindmap(),r=ge(),i=eV().layout!==void 0,a=r;if(i||(a.layout="cose-bilkent"),!e)return{nodes:[],edges:[],config:a};X.debug("getData: mindmapRoot",e,r),this.assignSections(e);let s=[],l=[];this.flattenNodes(e,s),this.generateEdges(e,l),X.debug(`getData: processed ${s.length} nodes and ${l.length} edges`);let u=new Map;for(let h of s)u.set(h.id,{shape:h.shape,width:h.width,height:h.height,padding:h.padding});return{nodes:s,edges:l,config:a,rootNode:e,markers:["point"],direction:"TB",nodeSpacing:50,rankSpacing:50,shapes:Object.fromEntries(u),type:"mindmap",diagramId:"mindmap-"+H$()}}getLogger(){return X}}});var Att,Y2e,X2e=N(()=>{"use strict";pt();ep();Nf();Mf();La();Att=o(async(t,e,r,n)=>{X.debug(`Rendering mindmap diagram +`+t);let i=n.db,a=i.getData(),s=Vo(e,a.config.securityLevel);a.type=n.type,a.layoutAlgorithm=$c(a.config.layout,{fallback:"cose-bilkent"}),a.diagramId=e,i.getMindmap()&&(a.nodes.forEach(u=>{u.shape==="rounded"?(u.radius=15,u.taper=15,u.stroke="none",u.width=0,u.padding=15):u.shape==="circle"?u.padding=10:u.shape==="rect"&&(u.width=0,u.padding=10)}),await Qo(a,s),Ws(s,a.config.mindmap?.padding??ur.mindmap.padding,"mindmapDiagram",a.config.mindmap?.useMaxWidth??ur.mindmap.useMaxWidth))},"draw"),Y2e={draw:Att}});var _tt,Dtt,j2e,K2e=N(()=>{"use strict";eo();_tt=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${_tt(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .section-root span { + color: ${t.gitBranchLabel0}; + } + .section-2 span { + color: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),j2e=Dtt});var Q2e={};dr(Q2e,{diagram:()=>Ltt});var Ltt,Z2e=N(()=>{"use strict";$2e();W2e();X2e();K2e();Ltt={get db(){return new TC},renderer:Y2e,parser:F2e,styles:j2e}});var q$,txe,rxe=N(()=>{"use strict";q$=(function(){var t=o(function(A,C,R,I){for(R=R||{},I=A.length;I--;R[A[I]]=C);return R},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,31],g=[6,7,11,24],y=[1,6,13,16,17,20,23],v=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],T=[1,38],S={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(C,R,I,L,E,D,_){var O=D.length-1;switch(E){case 6:case 7:return L;case 8:L.getLogger().trace("Stop NL ");break;case 9:L.getLogger().trace("Stop EOF ");break;case 11:L.getLogger().trace("Stop NL2 ");break;case 12:L.getLogger().trace("Stop EOF2 ");break;case 15:L.getLogger().info("Node: ",D[O-1].id),L.addNode(D[O-2].length,D[O-1].id,D[O-1].descr,D[O-1].type,D[O]);break;case 16:L.getLogger().info("Node: ",D[O].id),L.addNode(D[O-1].length,D[O].id,D[O].descr,D[O].type);break;case 17:L.getLogger().trace("Icon: ",D[O]),L.decorateNode({icon:D[O]});break;case 18:case 23:L.decorateNode({class:D[O]});break;case 19:L.getLogger().trace("SPACELIST");break;case 20:L.getLogger().trace("Node: ",D[O-1].id),L.addNode(0,D[O-1].id,D[O-1].descr,D[O-1].type,D[O]);break;case 21:L.getLogger().trace("Node: ",D[O].id),L.addNode(0,D[O].id,D[O].descr,D[O].type);break;case 22:L.decorateNode({icon:D[O]});break;case 27:L.getLogger().trace("node found ..",D[O-2]),this.$={id:D[O-1],descr:D[O-1],type:L.getType(D[O-2],D[O])};break;case 28:this.$={id:D[O],descr:D[O],type:0};break;case 29:L.getLogger().trace("node found ..",D[O-3]),this.$={id:D[O-3],descr:D[O-1],type:L.getType(D[O-2],D[O])};break;case 30:this.$=D[O-1]+D[O];break;case 31:this.$=D[O];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:h,7:f,10:23,11:d},t(p,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:l}),t(p,[2,19]),t(p,[2,21],{15:30,24:m}),t(p,[2,22]),t(p,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:f,10:34,11:d},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(y,[2,14],{7:v,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(p,[2,16],{15:37,24:m}),t(p,[2,17]),t(p,[2,18]),t(p,[2,20],{24:T}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(y,[2,13],{7:v,11:x}),t(b,[2,11]),t(b,[2,12]),t(p,[2,15],{24:T}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(C,R){if(R.recoverable)this.trace(C);else{var I=new Error(C);throw I.hash=R,I}},"parseError"),parse:o(function(C){var R=this,I=[0],L=[],E=[null],D=[],_=this.table,O="",M=0,P=0,B=0,F=2,G=1,$=D.slice.call(arguments,1),U=Object.create(this.lexer),j={yy:{}};for(var te in this.yy)Object.prototype.hasOwnProperty.call(this.yy,te)&&(j.yy[te]=this.yy[te]);U.setInput(C,j.yy),j.yy.lexer=U,j.yy.parser=this,typeof U.yylloc>"u"&&(U.yylloc={});var Y=U.yylloc;D.push(Y);var oe=U.options&&U.options.ranges;typeof j.yy.parseError=="function"?this.parseError=j.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function J(Be){I.length=I.length-2*Be,E.length=E.length-Be,D.length=D.length-Be}o(J,"popStack");function ue(){var Be;return Be=L.pop()||U.lex()||G,typeof Be!="number"&&(Be instanceof Array&&(L=Be,Be=L.pop()),Be=R.symbols_[Be]||Be),Be}o(ue,"lex");for(var re,ee,Z,K,ae,Q,de={},ne,Te,q,Ve;;){if(Z=I[I.length-1],this.defaultActions[Z]?K=this.defaultActions[Z]:((re===null||typeof re>"u")&&(re=ue()),K=_[Z]&&_[Z][re]),typeof K>"u"||!K.length||!K[0]){var pe="";Ve=[];for(ne in _[Z])this.terminals_[ne]&&ne>F&&Ve.push("'"+this.terminals_[ne]+"'");U.showPosition?pe="Parse error on line "+(M+1)+`: +`+U.showPosition()+` +Expecting `+Ve.join(", ")+", got '"+(this.terminals_[re]||re)+"'":pe="Parse error on line "+(M+1)+": Unexpected "+(re==G?"end of input":"'"+(this.terminals_[re]||re)+"'"),this.parseError(pe,{text:U.match,token:this.terminals_[re]||re,line:U.yylineno,loc:Y,expected:Ve})}if(K[0]instanceof Array&&K.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Z+", token: "+re);switch(K[0]){case 1:I.push(re),E.push(U.yytext),D.push(U.yylloc),I.push(K[1]),re=null,ee?(re=ee,ee=null):(P=U.yyleng,O=U.yytext,M=U.yylineno,Y=U.yylloc,B>0&&B--);break;case 2:if(Te=this.productions_[K[1]][1],de.$=E[E.length-Te],de._$={first_line:D[D.length-(Te||1)].first_line,last_line:D[D.length-1].last_line,first_column:D[D.length-(Te||1)].first_column,last_column:D[D.length-1].last_column},oe&&(de._$.range=[D[D.length-(Te||1)].range[0],D[D.length-1].range[1]]),Q=this.performAction.apply(de,[O,P,M,j.yy,K[1],E,D].concat($)),typeof Q<"u")return Q;Te&&(I=I.slice(0,-1*Te*2),E=E.slice(0,-1*Te),D=D.slice(0,-1*Te)),I.push(this.productions_[K[1]][0]),E.push(de.$),D.push(de._$),q=_[I[I.length-2]][I[I.length-1]],I.push(q);break;case 3:return!0}}return!0},"parse")},w=(function(){var A={EOF:1,parseError:o(function(R,I){if(this.yy.parser)this.yy.parser.parseError(R,I);else throw new Error(R)},"parseError"),setInput:o(function(C,R){return this.yy=R||this.yy||{},this._input=C,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var C=this._input[0];this.yytext+=C,this.yyleng++,this.offset++,this.match+=C,this.matched+=C;var R=C.match(/(?:\r\n?|\n).*/g);return R?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),C},"input"),unput:o(function(C){var R=C.length,I=C.split(/(?:\r\n?|\n)/g);this._input=C+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-R),this.offset-=R;var L=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),I.length-1&&(this.yylineno-=I.length-1);var E=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:I?(I.length===L.length?this.yylloc.first_column:0)+L[L.length-I.length].length-I[0].length:this.yylloc.first_column-R},this.options.ranges&&(this.yylloc.range=[E[0],E[0]+this.yyleng-R]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(C){this.unput(this.match.slice(C))},"less"),pastInput:o(function(){var C=this.matched.substr(0,this.matched.length-this.match.length);return(C.length>20?"...":"")+C.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var C=this.match;return C.length<20&&(C+=this._input.substr(0,20-C.length)),(C.substr(0,20)+(C.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var C=this.pastInput(),R=new Array(C.length+1).join("-");return C+this.upcomingInput()+` +`+R+"^"},"showPosition"),test_match:o(function(C,R){var I,L,E;if(this.options.backtrack_lexer&&(E={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(E.yylloc.range=this.yylloc.range.slice(0))),L=C[0].match(/(?:\r\n?|\n).*/g),L&&(this.yylineno+=L.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:L?L[L.length-1].length-L[L.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+C[0].length},this.yytext+=C[0],this.match+=C[0],this.matches=C,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(C[0].length),this.matched+=C[0],I=this.performAction.call(this,this.yy,this,R,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),I)return I;if(this._backtrack){for(var D in E)this[D]=E[D];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var C,R,I,L;this._more||(this.yytext="",this.match="");for(var E=this._currentRules(),D=0;DR[0].length)){if(R=I,L=D,this.options.backtrack_lexer){if(C=this.test_match(I,E[D]),C!==!1)return C;if(this._backtrack){R=!1;continue}else return!1}else if(!this.options.flex)break}return R?(C=this.test_match(R,E[L]),C!==!1?C:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var R=this.next();return R||this.lex()},"lex"),begin:o(function(R){this.conditionStack.push(R)},"begin"),popState:o(function(){var R=this.conditionStack.length-1;return R>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(R){return R=this.conditionStack.length-1-Math.abs(R||0),R>=0?this.conditionStack[R]:"INITIAL"},"topState"),pushState:o(function(R){this.begin(R)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(R,I,L,E){var D=E;switch(L){case 0:return this.pushState("shapeData"),I.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let _=/\n\s*/g;return I.yytext=I.yytext.replace(_,"
      "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return R.getLogger().trace("Found comment",I.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:R.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return R.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:R.getLogger().trace("end icon"),this.popState();break;case 16:return R.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return R.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return R.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return R.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:R.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return R.getLogger().trace("description:",I.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),R.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),R.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),R.getLogger().trace("node end ...",I.yytext),"NODE_DEND";break;case 36:return this.popState(),R.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),R.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),R.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),R.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),R.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return R.getLogger().trace("Long description:",I.yytext),21;break;case 42:return R.getLogger().trace("Long description:",I.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return A})();S.lexer=w;function k(){this.yy={}}return o(k,"Parser"),k.prototype=S,S.Parser=k,new k})();q$.parser=q$;txe=q$});var ol,Y$,W$,X$,Itt,Ott,nxe,Ptt,Btt,Ui,Ftt,$tt,ztt,Gtt,Vtt,Utt,Htt,ixe,axe=N(()=>{"use strict";Xt();gr();pt();La();w2();ol=[],Y$=[],W$=0,X$={},Itt=o(()=>{ol=[],Y$=[],W$=0,X$={}},"clear"),Ott=o(t=>{if(ol.length===0)return null;let e=ol[0].level,r=null;for(let n=ol.length-1;n>=0;n--)if(ol[n].level===e&&!r&&(r=ol[n]),ol[n].levell.parentId===i.id);for(let l of s){let u={id:l.id,parentId:i.id,label:sr(l.label??"",n),isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(u)}}return{nodes:e,edges:t,other:{},config:ge()}},"getData"),Btt=o((t,e,r,n,i)=>{let a=ge(),s=a.mindmap?.padding??ur.mindmap.padding;switch(n){case Ui.ROUNDED_RECT:case Ui.RECT:case Ui.HEXAGON:s*=2}let l={id:sr(e,a)||"kbn"+W$++,level:t,label:sr(r,a),width:a.mindmap?.maxNodeWidth??ur.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let h;i.includes(` +`)?h=i+` +`:h=`{ +`+i+` +}`;let f=Kh(h,{schema:jh});if(f.shape&&(f.shape!==f.shape.toLowerCase()||f.shape.includes("_")))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);f?.shape&&f.shape==="kanbanItem"&&(l.shape=f?.shape),f?.label&&(l.label=f?.label),f?.icon&&(l.icon=f?.icon.toString()),f?.assigned&&(l.assigned=f?.assigned.toString()),f?.ticket&&(l.ticket=f?.ticket.toString()),f?.priority&&(l.priority=f?.priority)}let u=Ott(t);u?l.parentId=u.id||"kbn"+W$++:Y$.push(l),ol.push(l)},"addNode"),Ui={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Ftt=o((t,e)=>{switch(X.debug("In get type",t,e),t){case"[":return Ui.RECT;case"(":return e===")"?Ui.ROUNDED_RECT:Ui.CLOUD;case"((":return Ui.CIRCLE;case")":return Ui.CLOUD;case"))":return Ui.BANG;case"{{":return Ui.HEXAGON;default:return Ui.DEFAULT}},"getType"),$tt=o((t,e)=>{X$[t]=e},"setElementForId"),ztt=o(t=>{if(!t)return;let e=ge(),r=ol[ol.length-1];t.icon&&(r.icon=sr(t.icon,e)),t.class&&(r.cssClasses=sr(t.class,e))},"decorateNode"),Gtt=o(t=>{switch(t){case Ui.DEFAULT:return"no-border";case Ui.RECT:return"rect";case Ui.ROUNDED_RECT:return"rounded-rect";case Ui.CIRCLE:return"circle";case Ui.CLOUD:return"cloud";case Ui.BANG:return"bang";case Ui.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Vtt=o(()=>X,"getLogger"),Utt=o(t=>X$[t],"getElementById"),Htt={clear:Itt,addNode:Btt,getSections:nxe,getData:Ptt,nodeType:Ui,getType:Ftt,setElementForId:$tt,decorateNode:ztt,type2Str:Gtt,getLogger:Vtt,getElementById:Utt},ixe=Htt});var qtt,sxe,oxe=N(()=>{"use strict";Xt();pt();tu();Ei();La();cw();bw();qtt=o(async(t,e,r,n)=>{X.debug(`Rendering kanban diagram +`+t);let a=n.db.getData(),s=ge();s.htmlLabels=!1;let l=aa(e),u=l.append("g");u.attr("class","sections");let h=l.append("g");h.attr("class","items");let f=a.nodes.filter(v=>v.isGroup),d=0,p=10,m=[],g=25;for(let v of f){let x=s?.kanban?.sectionWidth||200;d=d+1,v.x=x*d+(d-1)*p/2,v.width=x,v.y=0,v.height=x*3,v.rx=5,v.ry=5,v.cssClasses=v.cssClasses+" section-"+d;let b=await Sm(u,v);g=Math.max(g,b?.labelBBox?.height),m.push(b)}let y=0;for(let v of f){let x=m[y];y=y+1;let b=s?.kanban?.sectionWidth||200,T=-b*3/2+g,S=T,w=a.nodes.filter(C=>C.parentId===v.id);for(let C of w){if(C.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");C.x=v.x,C.width=b-1.5*p;let I=(await Cm(h,C,{config:s})).node().getBBox();C.y=S+I.height/2,await P2(C),S=C.y+I.height/2+p/2}let k=x.cluster.select("rect"),A=Math.max(S-T+3*p,50)+(g-25);k.attr("height",A)}ic(void 0,l,s.mindmap?.padding??ur.kanban.padding,s.mindmap?.useMaxWidth??ur.kanban.useMaxWidth)},"draw"),sxe={draw:qtt}});var Wtt,Ytt,lxe,cxe=N(()=>{"use strict";eo();yg();Wtt=o(t=>{let e="";for(let n=0;nt.darkMode?Pt(n,i):Rt(n,i),"adjuster");for(let n=0;n` + .edge { + stroke-width: 3; + } + ${Wtt(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .cluster-label, .label { + color: ${t.textColor}; + fill: ${t.textColor}; + } + .kanban-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } + ${zc()} +`,"getStyles"),lxe=Ytt});var uxe={};dr(uxe,{diagram:()=>Xtt});var Xtt,hxe=N(()=>{"use strict";rxe();axe();oxe();cxe();Xtt={db:ixe,renderer:sxe,parser:txe,styles:lxe}});var j$,A4,pxe=N(()=>{"use strict";j$=(function(){var t=o(function(l,u,h,f){for(h=h||{},f=l.length;f--;h[l[f]]=u);return h},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:o(function(u,h,f,d,p,m,g){var y=m.length-1;switch(p){case 7:let v=d.findOrCreateNode(m[y-4].trim().replaceAll('""','"')),x=d.findOrCreateNode(m[y-2].trim().replaceAll('""','"')),b=parseFloat(m[y].trim());d.addLink(v,x,b);break;case 8:case 9:case 11:this.$=m[y];break;case 10:this.$=m[y-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:o(function(u,h){if(h.recoverable)this.trace(u);else{var f=new Error(u);throw f.hash=h,f}},"parseError"),parse:o(function(u){var h=this,f=[0],d=[],p=[null],m=[],g=this.table,y="",v=0,x=0,b=0,T=2,S=1,w=m.slice.call(arguments,1),k=Object.create(this.lexer),A={yy:{}};for(var C in this.yy)Object.prototype.hasOwnProperty.call(this.yy,C)&&(A.yy[C]=this.yy[C]);k.setInput(u,A.yy),A.yy.lexer=k,A.yy.parser=this,typeof k.yylloc>"u"&&(k.yylloc={});var R=k.yylloc;m.push(R);var I=k.options&&k.options.ranges;typeof A.yy.parseError=="function"?this.parseError=A.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function L(Y){f.length=f.length-2*Y,p.length=p.length-Y,m.length=m.length-Y}o(L,"popStack");function E(){var Y;return Y=d.pop()||k.lex()||S,typeof Y!="number"&&(Y instanceof Array&&(d=Y,Y=d.pop()),Y=h.symbols_[Y]||Y),Y}o(E,"lex");for(var D,_,O,M,P,B,F={},G,$,U,j;;){if(O=f[f.length-1],this.defaultActions[O]?M=this.defaultActions[O]:((D===null||typeof D>"u")&&(D=E()),M=g[O]&&g[O][D]),typeof M>"u"||!M.length||!M[0]){var te="";j=[];for(G in g[O])this.terminals_[G]&&G>T&&j.push("'"+this.terminals_[G]+"'");k.showPosition?te="Parse error on line "+(v+1)+`: +`+k.showPosition()+` +Expecting `+j.join(", ")+", got '"+(this.terminals_[D]||D)+"'":te="Parse error on line "+(v+1)+": Unexpected "+(D==S?"end of input":"'"+(this.terminals_[D]||D)+"'"),this.parseError(te,{text:k.match,token:this.terminals_[D]||D,line:k.yylineno,loc:R,expected:j})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+O+", token: "+D);switch(M[0]){case 1:f.push(D),p.push(k.yytext),m.push(k.yylloc),f.push(M[1]),D=null,_?(D=_,_=null):(x=k.yyleng,y=k.yytext,v=k.yylineno,R=k.yylloc,b>0&&b--);break;case 2:if($=this.productions_[M[1]][1],F.$=p[p.length-$],F._$={first_line:m[m.length-($||1)].first_line,last_line:m[m.length-1].last_line,first_column:m[m.length-($||1)].first_column,last_column:m[m.length-1].last_column},I&&(F._$.range=[m[m.length-($||1)].range[0],m[m.length-1].range[1]]),B=this.performAction.apply(F,[y,x,v,A.yy,M[1],p,m].concat(w)),typeof B<"u")return B;$&&(f=f.slice(0,-1*$*2),p=p.slice(0,-1*$),m=m.slice(0,-1*$)),f.push(this.productions_[M[1]][0]),p.push(F.$),m.push(F._$),U=g[f[f.length-2]][f[f.length-1]],f.push(U);break;case 3:return!0}}return!0},"parse")},a=(function(){var l={EOF:1,parseError:o(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:o(function(u,h){return this.yy=h||this.yy||{},this._input=u,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var u=this._input[0];this.yytext+=u,this.yyleng++,this.offset++,this.match+=u,this.matched+=u;var h=u.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),u},"input"),unput:o(function(u){var h=u.length,f=u.split(/(?:\r\n?|\n)/g);this._input=u+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===d.length?this.yylloc.first_column:0)+d[d.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(u){this.unput(this.match.slice(u))},"less"),pastInput:o(function(){var u=this.matched.substr(0,this.matched.length-this.match.length);return(u.length>20?"...":"")+u.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var u=this.match;return u.length<20&&(u+=this._input.substr(0,20-u.length)),(u.substr(0,20)+(u.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var u=this.pastInput(),h=new Array(u.length+1).join("-");return u+this.upcomingInput()+` +`+h+"^"},"showPosition"),test_match:o(function(u,h){var f,d,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),d=u[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+u[0].length},this.yytext+=u[0],this.match+=u[0],this.matches=u,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(u[0].length),this.matched+=u[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var m in p)this[m]=p[m];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var u,h,f,d;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),m=0;mh[0].length)){if(h=f,d=m,this.options.backtrack_lexer){if(u=this.test_match(f,p[m]),u!==!1)return u;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(u=this.test_match(h,p[d]),u!==!1?u:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var h=this.next();return h||this.lex()},"lex"),begin:o(function(h){this.conditionStack.push(h)},"begin"),popState:o(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:o(function(h){this.begin(h)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(h,f,d,p){var m=p;switch(d){case 0:return this.pushState("csv"),4;break;case 1:return this.pushState("csv"),4;break;case 2:return 10;case 3:return 5;case 4:return 12;case 5:return this.pushState("escaped_text"),18;break;case 6:return 20;case 7:return this.popState("escaped_text"),18;break;case 8:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:sankey\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[2,3,4,5,6,7,8],inclusive:!1},escaped_text:{rules:[7,8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8],inclusive:!0}}};return l})();i.lexer=a;function s(){this.yy={}}return o(s,"Parser"),s.prototype=i,i.Parser=s,new s})();j$.parser=j$;A4=j$});var kC,EC,wC,Ztt,K$,Jtt,Q$,ert,trt,rrt,nrt,mxe,gxe=N(()=>{"use strict";Xt();gr();ci();kC=[],EC=[],wC=new Map,Ztt=o(()=>{kC=[],EC=[],wC=new Map,Sr()},"clear"),K$=class{constructor(e,r,n=0){this.source=e;this.target=r;this.value=n}static{o(this,"SankeyLink")}},Jtt=o((t,e,r)=>{kC.push(new K$(t,e,r))},"addLink"),Q$=class{constructor(e){this.ID=e}static{o(this,"SankeyNode")}},ert=o(t=>{t=tt.sanitizeText(t,ge());let e=wC.get(t);return e===void 0&&(e=new Q$(t),wC.set(t,e),EC.push(e)),e},"findOrCreateNode"),trt=o(()=>EC,"getNodes"),rrt=o(()=>kC,"getLinks"),nrt=o(()=>({nodes:EC.map(t=>({id:t.ID})),links:kC.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),mxe={nodesMap:wC,getConfig:o(()=>ge().sankey,"getConfig"),getNodes:trt,getLinks:rrt,getGraph:nrt,addLink:Jtt,findOrCreateNode:ert,getAccTitle:Mr,setAccTitle:Rr,getAccDescription:Or,setAccDescription:Ir,getDiagramTitle:Pr,setDiagramTitle:$r,clear:Ztt}});function _4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var yxe=N(()=>{"use strict";o(_4,"max")});function dy(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var vxe=N(()=>{"use strict";o(dy,"min")});function py(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var xxe=N(()=>{"use strict";o(py,"sum")});var Z$=N(()=>{"use strict";yxe();vxe();xxe()});function irt(t){return t.target.depth}function J$(t){return t.depth}function ez(t,e){return e-1-t.height}function D4(t,e){return t.sourceLinks.length?t.depth:e-1}function tz(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?dy(t.sourceLinks,irt)-1:0}var rz=N(()=>{"use strict";Z$();o(irt,"targetDepth");o(J$,"left");o(ez,"right");o(D4,"justify");o(tz,"center")});function my(t){return function(){return t}}var bxe=N(()=>{"use strict";o(my,"constant")});function Txe(t,e){return SC(t.source,e.source)||t.index-e.index}function wxe(t,e){return SC(t.target,e.target)||t.index-e.index}function SC(t,e){return t.y0-e.y0}function nz(t){return t.value}function art(t){return t.index}function srt(t){return t.nodes}function ort(t){return t.links}function kxe(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function Exe({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function CC(){let t=0,e=0,r=1,n=1,i=24,a=8,s,l=art,u=D4,h,f,d=srt,p=ort,m=6;function g(){let O={nodes:d.apply(null,arguments),links:p.apply(null,arguments)};return y(O),v(O),x(O),b(O),w(O),Exe(O),O}o(g,"sankey"),g.update=function(O){return Exe(O),O},g.nodeId=function(O){return arguments.length?(l=typeof O=="function"?O:my(O),g):l},g.nodeAlign=function(O){return arguments.length?(u=typeof O=="function"?O:my(O),g):u},g.nodeSort=function(O){return arguments.length?(h=O,g):h},g.nodeWidth=function(O){return arguments.length?(i=+O,g):i},g.nodePadding=function(O){return arguments.length?(a=s=+O,g):a},g.nodes=function(O){return arguments.length?(d=typeof O=="function"?O:my(O),g):d},g.links=function(O){return arguments.length?(p=typeof O=="function"?O:my(O),g):p},g.linkSort=function(O){return arguments.length?(f=O,g):f},g.size=function(O){return arguments.length?(t=e=0,r=+O[0],n=+O[1],g):[r-t,n-e]},g.extent=function(O){return arguments.length?(t=+O[0][0],r=+O[1][0],e=+O[0][1],n=+O[1][1],g):[[t,e],[r,n]]},g.iterations=function(O){return arguments.length?(m=+O,g):m};function y({nodes:O,links:M}){for(let[B,F]of O.entries())F.index=B,F.sourceLinks=[],F.targetLinks=[];let P=new Map(O.map((B,F)=>[l(B,F,O),B]));for(let[B,F]of M.entries()){F.index=B;let{source:G,target:$}=F;typeof G!="object"&&(G=F.source=kxe(P,G)),typeof $!="object"&&($=F.target=kxe(P,$)),G.sourceLinks.push(F),$.targetLinks.push(F)}if(f!=null)for(let{sourceLinks:B,targetLinks:F}of O)B.sort(f),F.sort(f)}o(y,"computeNodeLinks");function v({nodes:O}){for(let M of O)M.value=M.fixedValue===void 0?Math.max(py(M.sourceLinks,nz),py(M.targetLinks,nz)):M.fixedValue}o(v,"computeNodeValues");function x({nodes:O}){let M=O.length,P=new Set(O),B=new Set,F=0;for(;P.size;){for(let G of P){G.depth=F;for(let{target:$}of G.sourceLinks)B.add($)}if(++F>M)throw new Error("circular link");P=B,B=new Set}}o(x,"computeNodeDepths");function b({nodes:O}){let M=O.length,P=new Set(O),B=new Set,F=0;for(;P.size;){for(let G of P){G.height=F;for(let{source:$}of G.targetLinks)B.add($)}if(++F>M)throw new Error("circular link");P=B,B=new Set}}o(b,"computeNodeHeights");function T({nodes:O}){let M=_4(O,F=>F.depth)+1,P=(r-t-i)/(M-1),B=new Array(M);for(let F of O){let G=Math.max(0,Math.min(M-1,Math.floor(u.call(null,F,M))));F.layer=G,F.x0=t+G*P,F.x1=F.x0+i,B[G]?B[G].push(F):B[G]=[F]}if(h)for(let F of B)F.sort(h);return B}o(T,"computeNodeLayers");function S(O){let M=dy(O,P=>(n-e-(P.length-1)*s)/py(P,nz));for(let P of O){let B=e;for(let F of P){F.y0=B,F.y1=B+F.value*M,B=F.y1+s;for(let G of F.sourceLinks)G.width=G.value*M}B=(n-B+s)/(P.length+1);for(let F=0;FP.length)-1)),S(M);for(let P=0;P0))continue;let te=(U/j-$.y0)*M;$.y0+=te,$.y1+=te,L($)}h===void 0&&G.sort(SC),C(G,P)}}o(k,"relaxLeftToRight");function A(O,M,P){for(let B=O.length,F=B-2;F>=0;--F){let G=O[F];for(let $ of G){let U=0,j=0;for(let{target:Y,value:oe}of $.sourceLinks){let J=oe*(Y.layer-$.layer);U+=_($,Y)*J,j+=J}if(!(j>0))continue;let te=(U/j-$.y0)*M;$.y0+=te,$.y1+=te,L($)}h===void 0&&G.sort(SC),C(G,P)}}o(A,"relaxRightToLeft");function C(O,M){let P=O.length>>1,B=O[P];I(O,B.y0-s,P-1,M),R(O,B.y1+s,P+1,M),I(O,n,O.length-1,M),R(O,e,0,M)}o(C,"resolveCollisions");function R(O,M,P,B){for(;P1e-6&&(F.y0+=G,F.y1+=G),M=F.y1+s}}o(R,"resolveCollisionsTopToBottom");function I(O,M,P,B){for(;P>=0;--P){let F=O[P],G=(F.y1-M)*B;G>1e-6&&(F.y0-=G,F.y1-=G),M=F.y0-s}}o(I,"resolveCollisionsBottomToTop");function L({sourceLinks:O,targetLinks:M}){if(f===void 0){for(let{source:{sourceLinks:P}}of M)P.sort(wxe);for(let{target:{targetLinks:P}}of O)P.sort(Txe)}}o(L,"reorderNodeLinks");function E(O){if(f===void 0)for(let{sourceLinks:M,targetLinks:P}of O)M.sort(wxe),P.sort(Txe)}o(E,"reorderLinks");function D(O,M){let P=O.y0-(O.sourceLinks.length-1)*s/2;for(let{target:B,width:F}of O.sourceLinks){if(B===M)break;P+=F+s}for(let{source:B,width:F}of M.targetLinks){if(B===O)break;P-=F}return P}o(D,"targetTop");function _(O,M){let P=M.y0-(M.targetLinks.length-1)*s/2;for(let{source:B,width:F}of M.targetLinks){if(B===O)break;P+=F+s}for(let{target:B,width:F}of O.sourceLinks){if(B===M)break;P-=F}return P}return o(_,"sourceTop"),g}var Sxe=N(()=>{"use strict";Z$();rz();bxe();o(Txe,"ascendingSourceBreadth");o(wxe,"ascendingTargetBreadth");o(SC,"ascendingBreadth");o(nz,"value");o(art,"defaultId");o(srt,"defaultNodes");o(ort,"defaultLinks");o(kxe,"find");o(Exe,"computeLinkBreadths");o(CC,"Sankey")});function sz(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Cxe(){return new sz}var iz,az,f0,lrt,oz,Axe=N(()=>{"use strict";iz=Math.PI,az=2*iz,f0=1e-6,lrt=az-f0;o(sz,"Path");o(Cxe,"path");sz.prototype=Cxe.prototype={constructor:sz,moveTo:o(function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},"moveTo"),closePath:o(function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},"closePath"),lineTo:o(function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},"lineTo"),quadraticCurveTo:o(function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},"quadraticCurveTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},"bezierCurveTo"),arcTo:o(function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,l=r-t,u=n-e,h=a-t,f=s-e,d=h*h+f*f;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(d>f0)if(!(Math.abs(f*l-u*h)>f0)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var p=r-a,m=n-s,g=l*l+u*u,y=p*p+m*m,v=Math.sqrt(g),x=Math.sqrt(d),b=i*Math.tan((iz-Math.acos((g+d-y)/(2*v*x)))/2),T=b/x,S=b/v;Math.abs(T-1)>f0&&(this._+="L"+(t+T*h)+","+(e+T*f)),this._+="A"+i+","+i+",0,0,"+ +(f*p>h*m)+","+(this._x1=t+S*l)+","+(this._y1=e+S*u)}},"arcTo"),arc:o(function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),l=r*Math.sin(n),u=t+s,h=e+l,f=1^a,d=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+u+","+h:(Math.abs(this._x1-u)>f0||Math.abs(this._y1-h)>f0)&&(this._+="L"+u+","+h),r&&(d<0&&(d=d%az+az),d>lrt?this._+="A"+r+","+r+",0,1,"+f+","+(t-s)+","+(e-l)+"A"+r+","+r+",0,1,"+f+","+(this._x1=u)+","+(this._y1=h):d>f0&&(this._+="A"+r+","+r+",0,"+ +(d>=iz)+","+f+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},"arc"),rect:o(function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},"rect"),toString:o(function(){return this._},"toString")};oz=Cxe});var _xe=N(()=>{"use strict";Axe()});function AC(t){return o(function(){return t},"constant")}var Dxe=N(()=>{"use strict";o(AC,"default")});function Lxe(t){return t[0]}function Rxe(t){return t[1]}var Nxe=N(()=>{"use strict";o(Lxe,"x");o(Rxe,"y")});var Mxe,Ixe=N(()=>{"use strict";Mxe=Array.prototype.slice});function crt(t){return t.source}function urt(t){return t.target}function hrt(t){var e=crt,r=urt,n=Lxe,i=Rxe,a=null;function s(){var l,u=Mxe.call(arguments),h=e.apply(this,u),f=r.apply(this,u);if(a||(a=l=oz()),t(a,+n.apply(this,(u[0]=h,u)),+i.apply(this,u),+n.apply(this,(u[0]=f,u)),+i.apply(this,u)),l)return a=null,l+""||null}return o(s,"link"),s.source=function(l){return arguments.length?(e=l,s):e},s.target=function(l){return arguments.length?(r=l,s):r},s.x=function(l){return arguments.length?(n=typeof l=="function"?l:AC(+l),s):n},s.y=function(l){return arguments.length?(i=typeof l=="function"?l:AC(+l),s):i},s.context=function(l){return arguments.length?(a=l??null,s):a},s}function frt(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function lz(){return hrt(frt)}var Oxe=N(()=>{"use strict";_xe();Ixe();Dxe();Nxe();o(crt,"linkSource");o(urt,"linkTarget");o(hrt,"link");o(frt,"curveHorizontal");o(lz,"linkHorizontal")});var Pxe=N(()=>{"use strict";Oxe()});function drt(t){return[t.source.x1,t.y0]}function prt(t){return[t.target.x0,t.y1]}function _C(){return lz().source(drt).target(prt)}var Bxe=N(()=>{"use strict";Pxe();o(drt,"horizontalSource");o(prt,"horizontalTarget");o(_C,"default")});var Fxe=N(()=>{"use strict";Sxe();rz();Bxe()});var L4,$xe=N(()=>{"use strict";L4=class t{static{o(this,"Uid")}static{this.count=0}static next(e){return new t(e+ ++t.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("https://github.com/+this.href+")"}}});var mrt,grt,zxe,Gxe=N(()=>{"use strict";Xt();yr();Fxe();Ei();$xe();mrt={left:J$,right:ez,center:tz,justify:D4},grt=o(function(t,e,r,n){let{securityLevel:i,sankey:a}=ge(),s=G3.sankey,l;i==="sandbox"&&(l=qe("#i"+e));let u=i==="sandbox"?qe(l.nodes()[0].contentDocument.body):qe("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):qe(`[id="${e}"]`),f=a?.width??s.width,d=a?.height??s.width,p=a?.useMaxWidth??s.useMaxWidth,m=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,y=a?.suffix??s.suffix,v=a?.showValues??s.showValues,x=n.db.getGraph(),b=mrt[m];CC().nodeId(I=>I.id).nodeWidth(10).nodePadding(10+(v?15:0)).nodeAlign(b).extent([[0,0],[f,d]])(x);let w=no(YD);h.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",I=>(I.uid=L4.next("node-")).id).attr("transform",function(I){return"translate("+I.x0+","+I.y0+")"}).attr("x",I=>I.x0).attr("y",I=>I.y0).append("rect").attr("height",I=>I.y1-I.y0).attr("width",I=>I.x1-I.x0).attr("fill",I=>w(I.id));let k=o(({id:I,value:L})=>v?`${I} +${g}${Math.round(L*100)/100}${y}`:I,"getText");h.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",I=>I.x0(I.y1+I.y0)/2).attr("dy",`${v?"0":"0.35"}em`).attr("text-anchor",I=>I.x0(L.uid=L4.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",L=>L.source.x1).attr("x2",L=>L.target.x0);I.append("stop").attr("offset","0%").attr("stop-color",L=>w(L.source.id)),I.append("stop").attr("offset","100%").attr("stop-color",L=>w(L.target.id))}let R;switch(C){case"gradient":R=o(I=>I.uid,"coloring");break;case"source":R=o(I=>w(I.source.id),"coloring");break;case"target":R=o(I=>w(I.target.id),"coloring");break;default:R=C}A.append("path").attr("d",_C()).attr("stroke",R).attr("stroke-width",I=>Math.max(1,I.width)),ic(void 0,h,0,p)},"draw"),zxe={draw:grt}});var Vxe,Uxe=N(()=>{"use strict";Vxe=o(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` +`).trim(),"prepareTextForParsing")});var yrt,Hxe,qxe=N(()=>{"use strict";yrt=o(t=>`.label { + font-family: ${t.fontFamily}; + }`,"getStyles"),Hxe=yrt});var Wxe={};dr(Wxe,{diagram:()=>xrt});var vrt,xrt,Yxe=N(()=>{"use strict";pxe();gxe();Gxe();Uxe();qxe();vrt=A4.parse.bind(A4);A4.parse=t=>vrt(Vxe(t));xrt={styles:Hxe,parser:A4,db:mxe,renderer:zxe}});var krt,gy,cz=N(()=>{"use strict";qn();La();tr();ci();krt=ur.packet,gy=class{constructor(){this.packet=[];this.setAccTitle=Rr;this.getAccTitle=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getAccDescription=Or;this.setAccDescription=Ir}static{o(this,"PacketDB")}getConfig(){let e=Vn({...krt,...Qt().packet});return e.showBits&&(e.paddingY+=10),e}getPacket(){return this.packet}pushWord(e){e.length>0&&this.packet.push(e)}clear(){Sr(),this.packet=[]}}});var Ert,Srt,Crt,uz,Kxe=N(()=>{"use strict";Uf();pt();r0();cz();Ert=1e4,Srt=o((t,e)=>{nl(t,e);let r=-1,n=[],i=1,{bitsPerRow:a}=e.getConfig();for(let{start:s,end:l,bits:u,label:h}of t.blocks){if(s!==void 0&&l!==void 0&&l{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*r)return[t,void 0];let n=e*r-1,i=e*r;return[{start:t.start,end:n,label:t.label,bits:n-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),uz={parser:{yy:void 0},parse:o(async t=>{let e=await bs("packet",t),r=uz.parser?.yy;if(!(r instanceof gy))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");X.debug(e),Srt(e,r)},"parse")}});var Art,_rt,Qxe,Zxe=N(()=>{"use strict";tu();Ei();Art=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:l,bitWidth:u,bitsPerRow:h}=a,f=i.getPacket(),d=i.getDiagramTitle(),p=s+l,m=p*(f.length+1)-(d?0:s),g=u*h+2,y=aa(e);y.attr("viewbox",`0 0 ${g} ${m}`),mn(y,m,g,a.useMaxWidth);for(let[v,x]of f.entries())_rt(y,x,v,a);y.append("text").text(d).attr("x",g/2).attr("y",m-p/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),_rt=o((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:l,showBits:u})=>{let h=t.append("g"),f=r*(n+a)+a;for(let d of e){let p=d.start%l*s+1,m=(d.end-d.start+1)*s-i;if(h.append("rect").attr("x",p).attr("y",f).attr("width",m).attr("height",n).attr("class","packetBlock"),h.append("text").attr("x",p+m/2).attr("y",f+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(d.label),!u)continue;let g=d.end===d.start,y=f-2;h.append("text").attr("x",p+(g?m/2:0)).attr("y",y).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(d.start),g||h.append("text").attr("x",p+m).attr("y",y).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(d.end)}},"drawWord"),Qxe={draw:Art}});var Drt,Jxe,ebe=N(()=>{"use strict";tr();Drt={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},Jxe=o(({packet:t}={})=>{let e=Vn(Drt,t);return` + .packetByte { + font-size: ${e.byteFontSize}; + } + .packetByte.start { + fill: ${e.startByteColor}; + } + .packetByte.end { + fill: ${e.endByteColor}; + } + .packetLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .packetTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + .packetBlock { + stroke: ${e.blockStrokeColor}; + stroke-width: ${e.blockStrokeWidth}; + fill: ${e.blockFillColor}; + } + `},"styles")});var tbe={};dr(tbe,{diagram:()=>Lrt});var Lrt,rbe=N(()=>{"use strict";cz();Kxe();Zxe();ebe();Lrt={parser:uz,get db(){return new gy},renderer:Qxe,styles:Jxe}});var yy,abe,d0,Mrt,Irt,sbe,Ort,Prt,Brt,Frt,$rt,zrt,Grt,p0,hz=N(()=>{"use strict";qn();La();tr();ci();yy={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},abe={axes:[],curves:[],options:yy},d0=structuredClone(abe),Mrt=ur.radar,Irt=o(()=>Vn({...Mrt,...Qt().radar}),"getConfig"),sbe=o(()=>d0.axes,"getAxes"),Ort=o(()=>d0.curves,"getCurves"),Prt=o(()=>d0.options,"getOptions"),Brt=o(t=>{d0.axes=t.map(e=>({name:e.name,label:e.label??e.name}))},"setAxes"),Frt=o(t=>{d0.curves=t.map(e=>({name:e.name,label:e.label??e.name,entries:$rt(e.entries)}))},"setCurves"),$rt=o(t=>{if(t[0].axis==null)return t.map(r=>r.value);let e=sbe();if(e.length===0)throw new Error("Axes must be populated before curves for reference entries");return e.map(r=>{let n=t.find(i=>i.axis?.$refText===r.name);if(n===void 0)throw new Error("Missing entry for axis "+r.label);return n.value})},"computeCurveEntries"),zrt=o(t=>{let e=t.reduce((r,n)=>(r[n.name]=n,r),{});d0.options={showLegend:e.showLegend?.value??yy.showLegend,ticks:e.ticks?.value??yy.ticks,max:e.max?.value??yy.max,min:e.min?.value??yy.min,graticule:e.graticule?.value??yy.graticule}},"setOptions"),Grt=o(()=>{Sr(),d0=structuredClone(abe)},"clear"),p0={getAxes:sbe,getCurves:Ort,getOptions:Prt,setAxes:Brt,setCurves:Frt,setOptions:zrt,getConfig:Irt,clear:Grt,setAccTitle:Rr,getAccTitle:Mr,setDiagramTitle:$r,getDiagramTitle:Pr,getAccDescription:Or,setAccDescription:Ir}});var Vrt,obe,lbe=N(()=>{"use strict";Uf();pt();r0();hz();Vrt=o(t=>{nl(t,p0);let{axes:e,curves:r,options:n}=t;p0.setAxes(e),p0.setCurves(r),p0.setOptions(n)},"populate"),obe={parse:o(async t=>{let e=await bs("radar",t);X.debug(e),Vrt(e)},"parse")}});function Yrt(t,e,r,n,i,a,s){let l=e.length,u=Math.min(s.width,s.height)/2;r.forEach((h,f)=>{if(h.entries.length!==l)return;let d=h.entries.map((p,m)=>{let g=2*Math.PI*m/l-Math.PI/2,y=Xrt(p,n,i,u),v=y*Math.cos(g),x=y*Math.sin(g);return{x:v,y:x}});a==="circle"?t.append("path").attr("d",jrt(d,s.curveTension)).attr("class",`radarCurve-${f}`):a==="polygon"&&t.append("polygon").attr("points",d.map(p=>`${p.x},${p.y}`).join(" ")).attr("class",`radarCurve-${f}`)})}function Xrt(t,e,r,n){let i=Math.min(Math.max(t,e),r);return n*(i-e)/(r-e)}function jrt(t,e){let r=t.length,n=`M${t[0].x},${t[0].y}`;for(let i=0;i{let h=t.append("g").attr("transform",`translate(${i}, ${a+u*s})`);h.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${u}`),h.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(l.label)})}var Urt,Hrt,qrt,Wrt,cbe,ube=N(()=>{"use strict";tu();Urt=o((t,e,r,n)=>{let i=n.db,a=i.getAxes(),s=i.getCurves(),l=i.getOptions(),u=i.getConfig(),h=i.getDiagramTitle(),f=aa(e),d=Hrt(f,u),p=l.max??Math.max(...s.map(y=>Math.max(...y.entries))),m=l.min,g=Math.min(u.width,u.height)/2;qrt(d,a,g,l.ticks,l.graticule),Wrt(d,a,g,u),Yrt(d,a,s,m,p,l.graticule,u),Krt(d,s,l.showLegend,u),d.append("text").attr("class","radarTitle").text(h).attr("x",0).attr("y",-u.height/2-u.marginTop)},"draw"),Hrt=o((t,e)=>{let r=e.width+e.marginLeft+e.marginRight,n=e.height+e.marginTop+e.marginBottom,i={x:e.marginLeft+e.width/2,y:e.marginTop+e.height/2};return t.attr("viewbox",`0 0 ${r} ${n}`).attr("width",r).attr("height",n),t.append("g").attr("transform",`translate(${i.x}, ${i.y})`)},"drawFrame"),qrt=o((t,e,r,n,i)=>{if(i==="circle")for(let a=0;a{let d=2*f*Math.PI/a-Math.PI/2,p=l*Math.cos(d),m=l*Math.sin(d);return`${p},${m}`}).join(" ");t.append("polygon").attr("points",u).attr("class","radarGraticule")}}},"drawGraticule"),Wrt=o((t,e,r,n)=>{let i=e.length;for(let a=0;a{"use strict";tr();Oy();qn();Qrt=o((t,e)=>{let r="";for(let n=0;n{let e=mh(),r=Qt(),n=Vn(e,r.themeVariables),i=Vn(n.radar,t);return{themeVariables:n,radarOptions:i}},"buildRadarStyleOptions"),hbe=o(({radar:t}={})=>{let{themeVariables:e,radarOptions:r}=Zrt(t);return` + .radarTitle { + font-size: ${e.fontSize}; + color: ${e.titleColor}; + dominant-baseline: hanging; + text-anchor: middle; + } + .radarAxisLine { + stroke: ${r.axisColor}; + stroke-width: ${r.axisStrokeWidth}; + } + .radarAxisLabel { + dominant-baseline: middle; + text-anchor: middle; + font-size: ${r.axisLabelFontSize}px; + color: ${r.axisColor}; + } + .radarGraticule { + fill: ${r.graticuleColor}; + fill-opacity: ${r.graticuleOpacity}; + stroke: ${r.graticuleColor}; + stroke-width: ${r.graticuleStrokeWidth}; + } + .radarLegendText { + text-anchor: start; + font-size: ${r.legendFontSize}px; + dominant-baseline: hanging; + } + ${Qrt(e,r)} + `},"styles")});var dbe={};dr(dbe,{diagram:()=>Jrt});var Jrt,pbe=N(()=>{"use strict";hz();lbe();ube();fbe();Jrt={parser:obe,db:p0,renderer:cbe,styles:hbe}});var fz,ybe,vbe=N(()=>{"use strict";fz=(function(){var t=o(function(T,S,w,k){for(w=w||{},k=T.length;k--;w[T[k]]=S);return w},"o"),e=[1,15],r=[1,7],n=[1,13],i=[1,14],a=[1,19],s=[1,16],l=[1,17],u=[1,18],h=[8,30],f=[8,10,21,28,29,30,31,39,43,46],d=[1,23],p=[1,24],m=[8,10,15,16,21,28,29,30,31,39,43,46],g=[8,10,15,16,21,27,28,29,30,31,39,43,46],y=[1,49],v={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,NODE_ID:31,nodeShapeNLabel:32,dirList:33,DIR:34,NODE_DSTART:35,NODE_DEND:36,BLOCK_ARROW_START:37,BLOCK_ARROW_END:38,classDef:39,CLASSDEF_ID:40,CLASSDEF_STYLEOPTS:41,DEFAULT:42,class:43,CLASSENTITY_IDS:44,STYLECLASS:45,style:46,STYLE_ENTITY_IDS:47,STYLE_DEFINITION_DATA:48,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"NODE_ID",34:"DIR",35:"NODE_DSTART",36:"NODE_DEND",37:"BLOCK_ARROW_START",38:"BLOCK_ARROW_END",39:"classDef",40:"CLASSDEF_ID",41:"CLASSDEF_STYLEOPTS",42:"DEFAULT",43:"class",44:"CLASSENTITY_IDS",45:"STYLECLASS",46:"style",47:"STYLE_ENTITY_IDS",48:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[33,1],[33,2],[32,3],[32,4],[23,3],[23,3],[24,3],[25,3]],performAction:o(function(S,w,k,A,C,R,I){var L=R.length-1;switch(C){case 4:A.getLogger().debug("Rule: separator (NL) ");break;case 5:A.getLogger().debug("Rule: separator (Space) ");break;case 6:A.getLogger().debug("Rule: separator (EOF) ");break;case 7:A.getLogger().debug("Rule: hierarchy: ",R[L-1]),A.setHierarchy(R[L-1]);break;case 8:A.getLogger().debug("Stop NL ");break;case 9:A.getLogger().debug("Stop EOF ");break;case 10:A.getLogger().debug("Stop NL2 ");break;case 11:A.getLogger().debug("Stop EOF2 ");break;case 12:A.getLogger().debug("Rule: statement: ",R[L]),typeof R[L].length=="number"?this.$=R[L]:this.$=[R[L]];break;case 13:A.getLogger().debug("Rule: statement #2: ",R[L-1]),this.$=[R[L-1]].concat(R[L]);break;case 14:A.getLogger().debug("Rule: link: ",R[L],S),this.$={edgeTypeStr:R[L],label:""};break;case 15:A.getLogger().debug("Rule: LABEL link: ",R[L-3],R[L-1],R[L]),this.$={edgeTypeStr:R[L],label:R[L-1]};break;case 18:let E=parseInt(R[L]),D=A.generateId();this.$={id:D,type:"space",label:"",width:E,children:[]};break;case 23:A.getLogger().debug("Rule: (nodeStatement link node) ",R[L-2],R[L-1],R[L]," typestr: ",R[L-1].edgeTypeStr);let _=A.edgeStrToEdgeData(R[L-1].edgeTypeStr);this.$=[{id:R[L-2].id,label:R[L-2].label,type:R[L-2].type,directions:R[L-2].directions},{id:R[L-2].id+"-"+R[L].id,start:R[L-2].id,end:R[L].id,label:R[L-1].label,type:"edge",directions:R[L].directions,arrowTypeEnd:_,arrowTypeStart:"arrow_open"},{id:R[L].id,label:R[L].label,type:A.typeStr2Type(R[L].typeStr),directions:R[L].directions}];break;case 24:A.getLogger().debug("Rule: nodeStatement (abc88 node size) ",R[L-1],R[L]),this.$={id:R[L-1].id,label:R[L-1].label,type:A.typeStr2Type(R[L-1].typeStr),directions:R[L-1].directions,widthInColumns:parseInt(R[L],10)};break;case 25:A.getLogger().debug("Rule: nodeStatement (node) ",R[L]),this.$={id:R[L].id,label:R[L].label,type:A.typeStr2Type(R[L].typeStr),directions:R[L].directions,widthInColumns:1};break;case 26:A.getLogger().debug("APA123",this?this:"na"),A.getLogger().debug("COLUMNS: ",R[L]),this.$={type:"column-setting",columns:R[L]==="auto"?-1:parseInt(R[L])};break;case 27:A.getLogger().debug("Rule: id-block statement : ",R[L-2],R[L-1]);let O=A.generateId();this.$={...R[L-2],type:"composite",children:R[L-1]};break;case 28:A.getLogger().debug("Rule: blockStatement : ",R[L-2],R[L-1],R[L]);let M=A.generateId();this.$={id:M,type:"composite",label:"",children:R[L-1]};break;case 29:A.getLogger().debug("Rule: node (NODE_ID separator): ",R[L]),this.$={id:R[L]};break;case 30:A.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",R[L-1],R[L]),this.$={id:R[L-1],label:R[L].label,typeStr:R[L].typeStr,directions:R[L].directions};break;case 31:A.getLogger().debug("Rule: dirList: ",R[L]),this.$=[R[L]];break;case 32:A.getLogger().debug("Rule: dirList: ",R[L-1],R[L]),this.$=[R[L-1]].concat(R[L]);break;case 33:A.getLogger().debug("Rule: nodeShapeNLabel: ",R[L-2],R[L-1],R[L]),this.$={typeStr:R[L-2]+R[L],label:R[L-1]};break;case 34:A.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",R[L-3],R[L-2]," #3:",R[L-1],R[L]),this.$={typeStr:R[L-3]+R[L],label:R[L-2],directions:R[L-1]};break;case 35:case 36:this.$={type:"classDef",id:R[L-1].trim(),css:R[L].trim()};break;case 37:this.$={type:"applyClass",id:R[L-1].trim(),styleClass:R[L].trim()};break;case 38:this.$={type:"applyStyles",id:R[L-1].trim(),stylesStr:R[L].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{10:e,11:3,13:4,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{8:[1,20]},t(h,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,10:e,21:r,28:n,29:i,31:a,39:s,43:l,46:u}),t(f,[2,16],{14:22,15:d,16:p}),t(f,[2,17]),t(f,[2,18]),t(f,[2,19]),t(f,[2,20]),t(f,[2,21]),t(f,[2,22]),t(m,[2,25],{27:[1,25]}),t(f,[2,26]),{19:26,26:12,31:a},{10:e,11:27,13:4,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{40:[1,28],42:[1,29]},{44:[1,30]},{47:[1,31]},t(g,[2,29],{32:32,35:[1,33],37:[1,34]}),{1:[2,7]},t(h,[2,13]),{26:35,31:a},{31:[2,14]},{17:[1,36]},t(m,[2,24]),{10:e,11:37,13:4,14:22,15:d,16:p,19:5,20:6,21:r,22:8,23:9,24:10,25:11,26:12,28:n,29:i,31:a,39:s,43:l,46:u},{30:[1,38]},{41:[1,39]},{41:[1,40]},{45:[1,41]},{48:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(m,[2,23]),{18:[1,45]},{30:[1,46]},t(f,[2,28]),t(f,[2,35]),t(f,[2,36]),t(f,[2,37]),t(f,[2,38]),{36:[1,47]},{33:48,34:y},{15:[1,50]},t(f,[2,27]),t(g,[2,33]),{38:[1,51]},{33:52,34:y,38:[2,31]},{31:[2,15]},t(g,[2,34]),{38:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:o(function(S,w){if(w.recoverable)this.trace(S);else{var k=new Error(S);throw k.hash=w,k}},"parseError"),parse:o(function(S){var w=this,k=[0],A=[],C=[null],R=[],I=this.table,L="",E=0,D=0,_=0,O=2,M=1,P=R.slice.call(arguments,1),B=Object.create(this.lexer),F={yy:{}};for(var G in this.yy)Object.prototype.hasOwnProperty.call(this.yy,G)&&(F.yy[G]=this.yy[G]);B.setInput(S,F.yy),F.yy.lexer=B,F.yy.parser=this,typeof B.yylloc>"u"&&(B.yylloc={});var $=B.yylloc;R.push($);var U=B.options&&B.options.ranges;typeof F.yy.parseError=="function"?this.parseError=F.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function j(Te){k.length=k.length-2*Te,C.length=C.length-Te,R.length=R.length-Te}o(j,"popStack");function te(){var Te;return Te=A.pop()||B.lex()||M,typeof Te!="number"&&(Te instanceof Array&&(A=Te,Te=A.pop()),Te=w.symbols_[Te]||Te),Te}o(te,"lex");for(var Y,oe,J,ue,re,ee,Z={},K,ae,Q,de;;){if(J=k[k.length-1],this.defaultActions[J]?ue=this.defaultActions[J]:((Y===null||typeof Y>"u")&&(Y=te()),ue=I[J]&&I[J][Y]),typeof ue>"u"||!ue.length||!ue[0]){var ne="";de=[];for(K in I[J])this.terminals_[K]&&K>O&&de.push("'"+this.terminals_[K]+"'");B.showPosition?ne="Parse error on line "+(E+1)+`: +`+B.showPosition()+` +Expecting `+de.join(", ")+", got '"+(this.terminals_[Y]||Y)+"'":ne="Parse error on line "+(E+1)+": Unexpected "+(Y==M?"end of input":"'"+(this.terminals_[Y]||Y)+"'"),this.parseError(ne,{text:B.match,token:this.terminals_[Y]||Y,line:B.yylineno,loc:$,expected:de})}if(ue[0]instanceof Array&&ue.length>1)throw new Error("Parse Error: multiple actions possible at state: "+J+", token: "+Y);switch(ue[0]){case 1:k.push(Y),C.push(B.yytext),R.push(B.yylloc),k.push(ue[1]),Y=null,oe?(Y=oe,oe=null):(D=B.yyleng,L=B.yytext,E=B.yylineno,$=B.yylloc,_>0&&_--);break;case 2:if(ae=this.productions_[ue[1]][1],Z.$=C[C.length-ae],Z._$={first_line:R[R.length-(ae||1)].first_line,last_line:R[R.length-1].last_line,first_column:R[R.length-(ae||1)].first_column,last_column:R[R.length-1].last_column},U&&(Z._$.range=[R[R.length-(ae||1)].range[0],R[R.length-1].range[1]]),ee=this.performAction.apply(Z,[L,D,E,F.yy,ue[1],C,R].concat(P)),typeof ee<"u")return ee;ae&&(k=k.slice(0,-1*ae*2),C=C.slice(0,-1*ae),R=R.slice(0,-1*ae)),k.push(this.productions_[ue[1]][0]),C.push(Z.$),R.push(Z._$),Q=I[k[k.length-2]][k[k.length-1]],k.push(Q);break;case 3:return!0}}return!0},"parse")},x=(function(){var T={EOF:1,parseError:o(function(w,k){if(this.yy.parser)this.yy.parser.parseError(w,k);else throw new Error(w)},"parseError"),setInput:o(function(S,w){return this.yy=w||this.yy||{},this._input=S,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var S=this._input[0];this.yytext+=S,this.yyleng++,this.offset++,this.match+=S,this.matched+=S;var w=S.match(/(?:\r\n?|\n).*/g);return w?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),S},"input"),unput:o(function(S){var w=S.length,k=S.split(/(?:\r\n?|\n)/g);this._input=S+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-w),this.offset-=w;var A=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),k.length-1&&(this.yylineno-=k.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:k?(k.length===A.length?this.yylloc.first_column:0)+A[A.length-k.length].length-k[0].length:this.yylloc.first_column-w},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-w]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(S){this.unput(this.match.slice(S))},"less"),pastInput:o(function(){var S=this.matched.substr(0,this.matched.length-this.match.length);return(S.length>20?"...":"")+S.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var S=this.match;return S.length<20&&(S+=this._input.substr(0,20-S.length)),(S.substr(0,20)+(S.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var S=this.pastInput(),w=new Array(S.length+1).join("-");return S+this.upcomingInput()+` +`+w+"^"},"showPosition"),test_match:o(function(S,w){var k,A,C;if(this.options.backtrack_lexer&&(C={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(C.yylloc.range=this.yylloc.range.slice(0))),A=S[0].match(/(?:\r\n?|\n).*/g),A&&(this.yylineno+=A.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:A?A[A.length-1].length-A[A.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+S[0].length},this.yytext+=S[0],this.match+=S[0],this.matches=S,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(S[0].length),this.matched+=S[0],k=this.performAction.call(this,this.yy,this,w,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),k)return k;if(this._backtrack){for(var R in C)this[R]=C[R];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var S,w,k,A;this._more||(this.yytext="",this.match="");for(var C=this._currentRules(),R=0;Rw[0].length)){if(w=k,A=R,this.options.backtrack_lexer){if(S=this.test_match(k,C[R]),S!==!1)return S;if(this._backtrack){w=!1;continue}else return!1}else if(!this.options.flex)break}return w?(S=this.test_match(w,C[A]),S!==!1?S:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var w=this.next();return w||this.lex()},"lex"),begin:o(function(w){this.conditionStack.push(w)},"begin"),popState:o(function(){var w=this.conditionStack.length-1;return w>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(w){return w=this.conditionStack.length-1-Math.abs(w||0),w>=0?this.conditionStack[w]:"INITIAL"},"topState"),pushState:o(function(w){this.begin(w)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(w,k,A,C){var R=C;switch(A){case 0:return w.getLogger().debug("Found block-beta"),10;break;case 1:return w.getLogger().debug("Found id-block"),29;break;case 2:return w.getLogger().debug("Found block"),10;break;case 3:w.getLogger().debug(".",k.yytext);break;case 4:w.getLogger().debug("_",k.yytext);break;case 5:return 5;case 6:return k.yytext=-1,28;break;case 7:return k.yytext=k.yytext.replace(/columns\s+/,""),w.getLogger().debug("COLUMNS (LEX)",k.yytext),28;break;case 8:this.pushState("md_string");break;case 9:return"MD_STR";case 10:this.popState();break;case 11:this.pushState("string");break;case 12:w.getLogger().debug("LEX: POPPING STR:",k.yytext),this.popState();break;case 13:return w.getLogger().debug("LEX: STR end:",k.yytext),"STR";break;case 14:return k.yytext=k.yytext.replace(/space\:/,""),w.getLogger().debug("SPACE NUM (LEX)",k.yytext),21;break;case 15:return k.yytext="1",w.getLogger().debug("COLUMNS (LEX)",k.yytext),21;break;case 16:return 42;case 17:return"LINKSTYLE";case 18:return"INTERPOLATE";case 19:return this.pushState("CLASSDEF"),39;break;case 20:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 21:return this.popState(),this.pushState("CLASSDEFID"),40;break;case 22:return this.popState(),41;break;case 23:return this.pushState("CLASS"),43;break;case 24:return this.popState(),this.pushState("CLASS_STYLE"),44;break;case 25:return this.popState(),45;break;case 26:return this.pushState("STYLE_STMNT"),46;break;case 27:return this.popState(),this.pushState("STYLE_DEFINITION"),47;break;case 28:return this.popState(),48;break;case 29:return this.pushState("acc_title"),"acc_title";break;case 30:return this.popState(),"acc_title_value";break;case 31:return this.pushState("acc_descr"),"acc_descr";break;case 32:return this.popState(),"acc_descr_value";break;case 33:this.pushState("acc_descr_multiline");break;case 34:this.popState();break;case 35:return"acc_descr_multiline_value";case 36:return 30;case 37:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 38:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),w.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 40:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 41:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),w.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 43:return this.popState(),w.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 44:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 45:return this.popState(),w.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 46:return this.popState(),w.getLogger().debug("Lex: ("),"NODE_DEND";break;case 47:return this.popState(),w.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 48:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 49:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),w.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 51:return this.popState(),w.getLogger().debug("Lex: )"),"NODE_DEND";break;case 52:return this.popState(),w.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 53:return this.popState(),w.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 54:return w.getLogger().debug("Lexa: -)"),this.pushState("NODE"),35;break;case 55:return w.getLogger().debug("Lexa: (-"),this.pushState("NODE"),35;break;case 56:return w.getLogger().debug("Lexa: ))"),this.pushState("NODE"),35;break;case 57:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 58:return w.getLogger().debug("Lex: ((("),this.pushState("NODE"),35;break;case 59:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 60:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 61:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 62:return w.getLogger().debug("Lexc: >"),this.pushState("NODE"),35;break;case 63:return w.getLogger().debug("Lexa: (["),this.pushState("NODE"),35;break;case 64:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),35;break;case 65:return this.pushState("NODE"),35;break;case 66:return this.pushState("NODE"),35;break;case 67:return this.pushState("NODE"),35;break;case 68:return this.pushState("NODE"),35;break;case 69:return this.pushState("NODE"),35;break;case 70:return this.pushState("NODE"),35;break;case 71:return this.pushState("NODE"),35;break;case 72:return w.getLogger().debug("Lexa: ["),this.pushState("NODE"),35;break;case 73:return this.pushState("BLOCK_ARROW"),w.getLogger().debug("LEX ARR START"),37;break;case 74:return w.getLogger().debug("Lex: NODE_ID",k.yytext),31;break;case 75:return w.getLogger().debug("Lex: EOF",k.yytext),8;break;case 76:this.pushState("md_string");break;case 77:this.pushState("md_string");break;case 78:return"NODE_DESCR";case 79:this.popState();break;case 80:w.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 81:w.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 82:return w.getLogger().debug("LEX: NODE_DESCR:",k.yytext),"NODE_DESCR";break;case 83:w.getLogger().debug("LEX POPPING"),this.popState();break;case 84:w.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 85:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (right): dir:",k.yytext),"DIR";break;case 86:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (left):",k.yytext),"DIR";break;case 87:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (x):",k.yytext),"DIR";break;case 88:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (y):",k.yytext),"DIR";break;case 89:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (up):",k.yytext),"DIR";break;case 90:return k.yytext=k.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (down):",k.yytext),"DIR";break;case 91:return k.yytext="]>",w.getLogger().debug("Lex (ARROW_DIR end):",k.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 92:return w.getLogger().debug("Lex: LINK","#"+k.yytext+"#"),15;break;case 93:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 94:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 95:return w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 96:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 97:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 98:return w.getLogger().debug("Lex: START_LINK",k.yytext),this.pushState("LLABEL"),16;break;case 99:this.pushState("md_string");break;case 100:return w.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 101:return this.popState(),w.getLogger().debug("Lex: LINK","#"+k.yytext+"#"),15;break;case 102:return this.popState(),w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 103:return this.popState(),w.getLogger().debug("Lex: LINK",k.yytext),15;break;case 104:return w.getLogger().debug("Lex: COLON",k.yytext),k.yytext=k.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block:)/,/^(?:block\b)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[28],inclusive:!1},STYLE_STMNT:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[22],inclusive:!1},CLASSDEF:{rules:[20,21],inclusive:!1},CLASS_STYLE:{rules:[25],inclusive:!1},CLASS:{rules:[24],inclusive:!1},LLABEL:{rules:[99,100,101,102,103],inclusive:!1},ARROW_DIR:{rules:[85,86,87,88,89,90,91],inclusive:!1},BLOCK_ARROW:{rules:[76,81,84],inclusive:!1},NODE:{rules:[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,77,80],inclusive:!1},md_string:{rules:[9,10,78,79],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[12,13,82,83],inclusive:!1},acc_descr_multiline:{rules:[34,35],inclusive:!1},acc_descr:{rules:[32],inclusive:!1},acc_title:{rules:[30],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,11,14,15,16,17,18,19,23,26,29,31,33,36,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,92,93,94,95,96,97,98,104],inclusive:!0}}};return T})();v.lexer=x;function b(){this.yy={}}return o(b,"Parser"),b.prototype=v,v.Parser=b,new b})();fz.parser=fz;ybe=fz});function cnt(t){switch(X.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return X.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function unt(t){switch(X.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function hnt(t){switch(t.replace(/^[\s-]+|[\s-]+$/g,"")){case"x":return"arrow_cross";case"o":return"arrow_circle";case">":return"arrow_point";default:return""}}var ql,pz,dz,xbe,bbe,rnt,wbe,nnt,DC,int,ant,snt,ont,kbe,mz,R4,lnt,Tbe,fnt,dnt,pnt,mnt,gnt,ynt,vnt,xnt,bnt,Tnt,wnt,Ebe,Sbe=N(()=>{"use strict";hR();qn();Xt();pt();gr();ci();ql=new Map,pz=[],dz=new Map,xbe="color",bbe="fill",rnt="bgFill",wbe=",",nnt=ge(),DC=new Map,int=o(t=>tt.sanitizeText(t,nnt),"sanitizeText"),ant=o(function(t,e=""){let r=DC.get(t);r||(r={id:t,styles:[],textStyles:[]},DC.set(t,r)),e?.split(wbe).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(xbe).exec(n)){let s=i.replace(bbe,rnt).replace(xbe,bbe);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),snt=o(function(t,e=""){let r=ql.get(t);e!=null&&(r.styles=e.split(wbe))},"addStyle2Node"),ont=o(function(t,e){t.split(",").forEach(function(r){let n=ql.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},ql.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),kbe=o((t,e)=>{let r=t.flat(),n=[],a=r.find(s=>s?.type==="column-setting")?.columns??-1;for(let s of r){if(typeof a=="number"&&a>0&&s.type!=="column-setting"&&typeof s.widthInColumns=="number"&&s.widthInColumns>a&&X.warn(`Block ${s.id} width ${s.widthInColumns} exceeds configured column width ${a}`),s.label&&(s.label=int(s.label)),s.type==="classDef"){ant(s.id,s.css);continue}if(s.type==="applyClass"){ont(s.id,s?.styleClass??"");continue}if(s.type==="applyStyles"){s?.stylesStr&&snt(s.id,s?.stylesStr);continue}if(s.type==="column-setting")e.columns=s.columns??-1;else if(s.type==="edge"){let l=(dz.get(s.id)??0)+1;dz.set(s.id,l),s.id=l+"-"+s.id,pz.push(s)}else{s.label||(s.type==="composite"?s.label="":s.label=s.id);let l=ql.get(s.id);if(l===void 0?ql.set(s.id,s):(s.type!=="na"&&(l.type=s.type),s.label!==s.id&&(l.label=s.label)),s.children&&kbe(s.children,s),s.type==="space"){let u=s.width??1;for(let h=0;h{X.debug("Clear called"),Sr(),R4={id:"root",type:"composite",children:[],columns:-1},ql=new Map([["root",R4]]),mz=[],DC=new Map,pz=[],dz=new Map},"clear");o(cnt,"typeStr2Type");o(unt,"edgeTypeStr2Type");o(hnt,"edgeStrToEdgeData");Tbe=0,fnt=o(()=>(Tbe++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Tbe),"generateId"),dnt=o(t=>{R4.children=t,kbe(t,R4),mz=R4.children},"setHierarchy"),pnt=o(t=>{let e=ql.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),mnt=o(()=>[...ql.values()],"getBlocksFlat"),gnt=o(()=>mz||[],"getBlocks"),ynt=o(()=>pz,"getEdges"),vnt=o(t=>ql.get(t),"getBlock"),xnt=o(t=>{ql.set(t.id,t)},"setBlock"),bnt=o(()=>X,"getLogger"),Tnt=o(function(){return DC},"getClasses"),wnt={getConfig:o(()=>Qt().block,"getConfig"),typeStr2Type:cnt,edgeTypeStr2Type:unt,edgeStrToEdgeData:hnt,getLogger:bnt,getBlocksFlat:mnt,getBlocks:gnt,getEdges:ynt,setHierarchy:dnt,getBlock:vnt,setBlock:xnt,getColumns:pnt,getClasses:Tnt,clear:lnt,generateId:fnt},Ebe=wnt});var LC,knt,Cbe,Abe=N(()=>{"use strict";eo();yg();LC=o((t,e)=>{let r=ld,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Ka(n,i,a,e)},"fade"),knt=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span,p { + color: ${t.titleColor}; + } + + + + .label text,span,p { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${LC(t.edgeLabelBackground,.5)}; + // background-color: + } + + .node .cluster { + // fill: ${LC(t.mainBkg,.5)}; + fill: ${LC(t.clusterBkg,.5)}; + stroke: ${LC(t.clusterBorder,.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span,p { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + ${zc()} +`,"getStyles"),Cbe=knt});var Ent,Snt,Cnt,Ant,_nt,Dnt,Lnt,Rnt,Nnt,Mnt,Int,_be,Dbe=N(()=>{"use strict";pt();Ent=o((t,e,r,n)=>{e.forEach(i=>{Int[i](t,r,n)})},"insertMarkers"),Snt=o((t,e,r)=>{X.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Cnt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),Ant=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),_nt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),Dnt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),Lnt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Rnt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),Nnt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Mnt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Int={extension:Snt,composition:Cnt,aggregation:Ant,dependency:_nt,lollipop:Dnt,point:Lnt,circle:Rnt,cross:Nnt,barb:Mnt},_be=Ent});function Ont(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function gz(t,e,r=0,n=0){X.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"siblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let m of t.children)gz(m,e);let s=Pnt(t);i=s.width,a=s.height,X.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let m of t.children)m.size&&(X.debug(`abc95 Setting size of children of ${t.id} id=${m.id} ${i} ${a} ${JSON.stringify(m.size)}`),m.size.width=i*(m.widthInColumns??1)+Ti*((m.widthInColumns??1)-1),m.size.height=a,m.size.x=0,m.size.y=0,X.debug(`abc95 updating size of ${t.id} children child:${m.id} maxWidth:${i} maxHeight:${a}`));for(let m of t.children)gz(m,e,i,a);let l=t.columns??-1,u=0;for(let m of t.children)u+=m.widthInColumns??1;let h=t.children.length;l>0&&l0?Math.min(t.children.length,l):t.children.length;if(m>0){let g=(d-m*Ti-Ti)/m;X.debug("abc95 (growing to fit) width",t.id,d,t.size?.width,g);for(let y of t.children)y.size&&(y.size.width=g)}}t.size={width:d,height:p,x:0,y:0}}X.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function Lbe(t,e){X.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(X.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*Ti;X.debug("widthOfChildren 88",i,"posX");let a=0;X.debug("abc91 block?.size?.x",t.id,t?.size?.x);let s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-Ti,l=0;for(let u of t.children){let h=t;if(!u.size)continue;let{width:f,height:d}=u.size,{px:p,py:m}=Ont(r,a);if(m!=l&&(l=m,s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-Ti,X.debug("New row in layout for block",t.id," and child ",u.id,l)),X.debug(`abc89 layout blocks (child) id: ${u.id} Pos: ${a} (px, py) ${p},${m} (${h?.size?.x},${h?.size?.y}) parent: ${h.id} width: ${f}${Ti}`),h.size){let y=f/2;u.size.x=s+Ti+y,X.debug(`abc91 layout blocks (calc) px, pyid:${u.id} startingPos=X${s} new startingPosX${u.size.x} ${y} padding=${Ti} width=${f} halfWidth=${y} => x:${u.size.x} y:${u.size.y} ${u.widthInColumns} (width * (child?.w || 1)) / 2 ${f*(u?.widthInColumns??1)/2}`),s=u.size.x+y,u.size.y=h.size.y-h.size.height/2+m*(d+Ti)+d/2+Ti,X.debug(`abc88 layout blocks (calc) px, pyid:${u.id}startingPosX${s}${Ti}${y}=>x:${u.size.x}y:${u.size.y}${u.widthInColumns}(width * (child?.w || 1)) / 2${f*(u?.widthInColumns??1)/2}`)}u.children&&Lbe(u,e);let g=u?.widthInColumns??1;r>0&&(g=Math.min(g,r-a%r)),a+=g,X.debug("abc88 columnsPos",u,a)}}X.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function Rbe(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:l,height:u}=t.size;a-l/2n&&(n=a+l/2),s+u/2>i&&(i=s+u/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=Rbe(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function Nbe(t){let e=t.getBlock("root");if(!e)return;gz(e,t,0,0),Lbe(e,t),X.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=Rbe(e),s=a-n,l=i-r;return{x:r,y:n,width:l,height:s}}var Ti,Pnt,Mbe=N(()=>{"use strict";pt();Xt();Ti=ge()?.block?.padding??8;o(Ont,"calculateBlockPosition");Pnt=o(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:l}=n.size??{width:0,height:0,x:0,y:0};X.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",l,n.type),n.type!=="space"&&(i>e&&(e=i/(t.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");o(gz,"setBlockSizes");o(Lbe,"layoutBlocks");o(Rbe,"findBounds");o(Nbe,"layout")});function Ibe(t,e){e&&t.attr("style",e)}function Bnt(t,e){let r=qe(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),n=r.append("xhtml:div"),i=t.label,a=t.isNode?"nodeLabel":"edgeLabel",s=n.append("span");return s.html(sr(i,e)),Ibe(s,t.labelStyle),s.attr("class",a),Ibe(n,t.labelStyle),n.style("display","inline-block"),n.style("white-space","nowrap"),n.attr("xmlns","http://www.w3.org/1999/xhtml"),r.node()}var Fnt,ks,RC=N(()=>{"use strict";yr();Xt();gr();pt();zo();tr();o(Ibe,"applyStyle");o(Bnt,"addHtmlLabel");Fnt=o(async(t,e,r,n)=>{let i=t||"";typeof i=="object"&&(i=i[0]);let a=ge();if(vr(a.flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
      "),X.debug("vertexText"+i);let s=await k9(Ji(i)),l={isNode:n,label:s,labelStyle:e.replace("fill:","color:")};return Bnt(l,a)}else{let s=document.createElementNS("http://www.w3.org/2000/svg","text");s.setAttribute("style",e.replace("color:","fill:"));let l=[];typeof i=="string"?l=i.split(/\\n|\n|/gi):Array.isArray(i)?l=i:l=[];for(let u of l){let h=document.createElementNS("http://www.w3.org/2000/svg","tspan");h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),h.setAttribute("dy","1em"),h.setAttribute("x","0"),r?h.setAttribute("class","title-row"):h.setAttribute("class","row"),h.textContent=u.trim(),s.appendChild(h)}return s}},"createLabel"),ks=Fnt});var Pbe,$nt,Obe,Bbe=N(()=>{"use strict";pt();Pbe=o((t,e,r,n,i)=>{e.arrowTypeStart&&Obe(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&Obe(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),$nt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},Obe=o((t,e,r,n,i,a)=>{let s=$nt[r];if(!s){X.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(https://github.com/$%7Bn%7D#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function NC(t,e){ge().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}var yz,Wa,$be,zbe,znt,Gnt,Fbe,Gbe,Vbe=N(()=>{"use strict";pt();RC();zo();yr();Xt();tr();gr();X9();O2();Bbe();yz={},Wa={},$be=o(async(t,e)=>{let r=ge(),n=vr(r.flowchart.htmlLabels),i=e.labelType==="markdown"?di(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:!0},r):await ks(e.label,e.labelStyle),a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label");s.node().appendChild(i);let l=i.getBBox();if(n){let h=i.children[0],f=qe(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),yz[e.id]=a,e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=await ks(e.startLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].startLeft=f,NC(u,e.startLabelLeft)}if(e.startLabelRight){let h=await ks(e.startLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].startRight=f,NC(u,e.startLabelRight)}if(e.endLabelLeft){let h=await ks(e.endLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].endLeft=f,NC(u,e.endLabelLeft)}if(e.endLabelRight){let h=await ks(e.endLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Wa[e.id]||(Wa[e.id]={}),Wa[e.id].endRight=f,NC(u,e.endLabelRight)}return i},"insertEdgeLabel");o(NC,"setTerminalWidth");zbe=o((t,e)=>{X.debug("Moving label abc88 ",t.id,t.label,yz[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=ge(),{subGraphTitleTotalMargin:i}=Pu(n);if(t.label){let a=yz[t.id],s=t.x,l=t.y;if(r){let u=qt.calcLabelPosition(r);X.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=Wa[t.id].startLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=Wa[t.id].startRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=Wa[t.id].endLeft,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=Wa[t.id].endRight,s=t.x,l=t.y;if(r){let u=qt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),znt=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),Gnt=o((t,e,r)=>{X.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{X.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!znt(e,a)&&!i){let s=Gnt(e,n,a),l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),Gbe=o(function(t,e,r,n,i,a,s){let l=r.points;X.debug("abc88 InsertEdge: edge=",r,"e=",e);let u=!1,h=a.node(e.v);var f=a.node(e.w);f?.intersect&&h?.intersect&&(l=l.slice(1,r.points.length-1),l.unshift(h.intersect(l[0])),l.push(f.intersect(l[l.length-1]))),r.toCluster&&(X.debug("to cluster abc88",n[r.toCluster]),l=Fbe(r.points,n[r.toCluster].node),u=!0),r.fromCluster&&(X.debug("from cluster abc88",n[r.fromCluster]),l=Fbe(l.reverse(),n[r.fromCluster].node).reverse(),u=!0);let d=l.filter(S=>!Number.isNaN(S.y)),p=No;r.curve&&(i==="graph"||i==="flowchart")&&(p=r.curve);let{x:m,y:g}=hw(r),y=Cl().x(m).y(g).curve(p),v;switch(r.thickness){case"normal":v="edge-thickness-normal";break;case"thick":v="edge-thickness-thick";break;case"invisible":v="edge-thickness-thick";break;default:v=""}switch(r.pattern){case"solid":v+=" edge-pattern-solid";break;case"dotted":v+=" edge-pattern-dotted";break;case"dashed":v+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",y(d)).attr("id",r.id).attr("class"," "+v+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(ge().flowchart.arrowMarkerAbsolute||ge().state.arrowMarkerAbsolute)&&(b=md(!0)),Pbe(x,r,b,s,i);let T={};return u&&(T.updatedPath=l),T.originalPath=r.points,T},"insertEdge")});var Vnt,Ube,Hbe=N(()=>{"use strict";Vnt=o(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),Ube=o((t,e,r)=>{let n=Vnt(t),i=2,a=e.height+2*r.padding,s=a/i,l=e.width+2*s+r.padding,u=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:l/2,y:2*u},{x:l-s,y:0},{x:l,y:0},{x:l,y:-a/3},{x:l+2*u,y:-a/2},{x:l,y:-2*a/3},{x:l,y:-a},{x:l-s,y:-a},{x:l/2,y:-a-2*u},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*u,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:l-s,y:-a},{x:l,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:l,y:-s},{x:l,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:l,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:l,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:l,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:l,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:l,y:0},{x:0,y:-s},{x:l,y:-a}]:n.has("left")&&n.has("down")?[{x:l,y:0},{x:0,y:0},{x:l,y:-a}]:n.has("right")?[{x:s,y:-u},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a+u}]:n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u}]:n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:[{x:0,y:0}]},"getArrowPoints")});function Unt(t,e){return t.intersect(e)}var qbe,Wbe=N(()=>{"use strict";o(Unt,"intersectNode");qbe=Unt});function Hnt(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(Hnt,"intersectEllipse");MC=Hnt});function qnt(t,e,r){return MC(t,e,e,r)}var Ybe,Xbe=N(()=>{"use strict";vz();o(qnt,"intersectCircle");Ybe=qnt});function Wnt(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&jbe(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&jbe(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function jbe(t,e){return t*e>0}var Kbe,Qbe=N(()=>{"use strict";o(Wnt,"intersectLine");o(jbe,"sameSign");Kbe=Wnt});function Ynt(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),l=Math.min(l,g.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));for(var u=n-t.width/2-s,h=i-t.height/2-l,f=0;f1&&a.sort(function(g,y){var v=g.x-r.x,x=g.y-r.y,b=Math.sqrt(v*v+x*x),T=y.x-r.x,S=y.y-r.y,w=Math.sqrt(T*T+S*S);return b{"use strict";Qbe();Zbe=Ynt;o(Ynt,"intersectPolygon")});var Xnt,e4e,t4e=N(()=>{"use strict";Xnt=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),e4e=Xnt});var $n,xz=N(()=>{"use strict";Wbe();Xbe();vz();Jbe();t4e();$n={node:qbe,circle:Ybe,ellipse:MC,polygon:Zbe,rect:e4e}});function Wl(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Li,ti,bz=N(()=>{"use strict";RC();zo();Xt();yr();gr();tr();Li=o(async(t,e,r,n)=>{let i=ge(),a,s=e.useHtmlLabels||vr(i.flowchart.htmlLabels);r?a=r:a="node default";let l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),u=l.insert("g").attr("class","label").attr("style",e.labelStyle),h;e.labelText===void 0?h="":h=typeof e.labelText=="string"?e.labelText:e.labelText[0];let f=u.node(),d;e.labelType==="markdown"?d=di(u,sr(Ji(h),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):d=f.appendChild(await ks(sr(Ji(h),i),e.labelStyle,!1,n));let p=d.getBBox(),m=e.padding/2;if(vr(i.flowchart.htmlLabels)){let g=d.children[0],y=qe(d),v=g.getElementsByTagName("img");if(v){let x=h.replace(/]*>/g,"").trim()==="";await Promise.all([...v].map(b=>new Promise(T=>{function S(){if(b.style.display="flex",b.style.flexDirection="column",x){let w=i.fontSize?i.fontSize:window.getComputedStyle(document.body).fontSize,A=parseInt(w,10)*5+"px";b.style.minWidth=A,b.style.maxWidth=A}else b.style.width="100%";T(b)}o(S,"setupImage"),setTimeout(()=>{b.complete&&S()}),b.addEventListener("error",S),b.addEventListener("load",S)})))}p=g.getBoundingClientRect(),y.attr("width",p.width),y.attr("height",p.height)}return s?u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):u.attr("transform","translate(0, "+-p.height/2+")"),e.centerLabel&&u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),u.insert("rect",":first-child"),{shapeSvg:l,bbox:p,halfPadding:m,label:u}},"labelHelper"),ti=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");o(Wl,"insertPolygonShape")});var jnt,r4e,n4e=N(()=>{"use strict";bz();pt();Xt();xz();jnt=o(async(t,e)=>{e.useHtmlLabels||ge().flowchart.htmlLabels||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await Li(t,e,"node "+e.classes,!0);X.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),ti(e,s),e.intersect=function(l){return $n.rect(e,l)},n},"note"),r4e=jnt});function Tz(t,e,r,n){let i=[],a=o(l=>{i.push(l,0)},"addBorder"),s=o(l=>{i.push(0,l)},"skipBorder");e.includes("t")?(X.debug("add top border"),a(r)):s(r),e.includes("r")?(X.debug("add right border"),a(n)):s(n),e.includes("b")?(X.debug("add bottom border"),a(r)):s(r),e.includes("l")?(X.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}var i4e,To,a4e,Knt,Qnt,Znt,Jnt,eit,tit,rit,nit,iit,ait,sit,oit,lit,cit,uit,hit,fit,dit,pit,s4e,mit,git,o4e,IC,wz,l4e,c4e=N(()=>{"use strict";yr();Xt();gr();pt();Hbe();RC();xz();n4e();bz();i4e=o(t=>t?" "+t:"","formatClass"),To=o((t,e)=>`${e||"node default"}${i4e(t.classes)} ${i4e(t.class)}`,"getClassesFromNode"),a4e=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,l=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];X.info("Question main (Circle)");let u=Wl(r,s,s,l);return u.attr("style",e.style),ti(e,u),e.intersect=function(h){return X.warn("Intersect called"),$n.polygon(e,l,h)},r},"question"),Knt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return $n.circle(e,14,s)},r},"choice"),Qnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,l=n.width+2*s+e.padding,u=[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],h=Wl(r,l,a,u);return h.attr("style",e.style),ti(e,h),e.intersect=function(f){return $n.polygon(e,u,f)},r},"hexagon"),Znt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,l=n.width+2*s+e.padding,u=Ube(e.directions,n,e),h=Wl(r,l,a,u);return h.attr("style",e.style),ti(e,h),e.intersect=function(f){return $n.polygon(e,u,f)},r},"block_arrow"),Jnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Wl(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(u){return $n.polygon(e,s,u)},r},"rect_left_inv_arrow"),eit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"lean_right"),tit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"lean_left"),rit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"trapezoid"),nit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"inv_trapezoid"),iit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"rect_right_inv_arrow"),ait=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),l=n.height+s+e.padding,u="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+l+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-l,h=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",u).attr("transform","translate("+-i/2+","+-(l/2+s)+")");return ti(e,h),e.intersect=function(f){let d=$n.rect(e,f),p=d.x-e.x;if(a!=0&&(Math.abs(p)e.height/2-s)){let m=s*s*(1-p*p/(a*a));m!=0&&(m=Math.sqrt(m)),m=s-m,f.y-e.y>0&&(m=-m),d.y+=m}return d},r},"cylinder"),sit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(Tz(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{X.warn(`Unknown node property ${d}`)})}return ti(e,a),e.intersect=function(f){return $n.rect(e,f)},r},"rect"),oit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(Tz(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{X.warn(`Unknown node property ${d}`)})}return ti(e,a),e.intersect=function(f){return $n.rect(e,f)},r},"composite"),lit=o(async(t,e)=>{let{shapeSvg:r}=await Li(t,e,"label",!0);X.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(Tz(n,e.props.borders,i,a),s.delete("borders")),s.forEach(l=>{X.warn(`Unknown node property ${l}`)})}return ti(e,n),e.intersect=function(s){return $n.rect(e,s)},r},"labelRect");o(Tz,"applyNodePropertyBorders");cit=o(async(t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),l=e.labelText.flat?e.labelText.flat():e.labelText,u="";typeof l=="object"?u=l[0]:u=l,X.info("Label text abc79",u,l,typeof l=="object");let h=s.node().appendChild(await ks(u,e.labelStyle,!0,!0)),f={width:0,height:0};if(vr(ge().flowchart.htmlLabels)){let y=h.children[0],v=qe(h);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}X.info("Text 2",l);let d=l.slice(1,l.length),p=h.getBBox(),m=s.node().appendChild(await ks(d.join?d.join("
      "):d,e.labelStyle,!0,!0));if(vr(ge().flowchart.htmlLabels)){let y=m.children[0],v=qe(m);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}let g=e.padding/2;return qe(m).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+g+5)+")"),qe(h).attr("transform","translate( "+(f.width{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return ti(e,s),e.intersect=function(l){return $n.rect(e,l)},r},"stadium"),hit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,To(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),X.info("Circle main"),ti(e,a),e.intersect=function(s){return X.info("Circle intersect",e,n.width/2+i,s),$n.circle(e,n.width/2+i,s)},r},"circle"),fit=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Li(t,e,To(e,void 0),!0),a=5,s=r.insert("g",":first-child"),l=s.insert("circle"),u=s.insert("circle");return s.attr("class",e.class),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),u.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),X.info("DoubleCircle main"),ti(e,l),e.intersect=function(h){return X.info("DoubleCircle intersect",e,n.width/2+i+a,h),$n.circle(e,n.width/2+i+a,h)},r},"doublecircle"),dit=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Li(t,e,To(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],l=Wl(r,i,a,s);return l.attr("style",e.style),ti(e,l),e.intersect=function(u){return $n.polygon(e,s,u)},r},"subroutine"),pit=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),ti(e,n),e.intersect=function(i){return $n.circle(e,7,i)},r},"start"),s4e=o((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return ti(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(l){return $n.rect(e,l)},n},"forkJoin"),mit=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),ti(e,i),e.intersect=function(a){return $n.circle(e,7,a)},r},"end"),git=o(async(t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=s.insert("rect",":first-child"),u=s.insert("line"),h=s.insert("line"),f=0,d=n,p=s.insert("g").attr("class","label"),m=0,g=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",v=p.node().appendChild(await ks(y,e.labelStyle,!0,!0)),x=v.getBBox();if(vr(ge().flowchart.htmlLabels)){let C=v.children[0],R=qe(v);x=C.getBoundingClientRect(),R.attr("width",x.width),R.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+n,f+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(ge().flowchart.htmlLabels?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let T=p.node().appendChild(await ks(b,e.labelStyle,!0,!0));qe(T).attr("class","classTitle");let S=T.getBBox();if(vr(ge().flowchart.htmlLabels)){let C=T.children[0],R=qe(T);S=C.getBoundingClientRect(),R.attr("width",S.width),R.attr("height",S.height)}d+=S.height+n,S.width>f&&(f=S.width);let w=[];e.classData.members.forEach(async C=>{let R=C.getDisplayDetails(),I=R.displayText;ge().flowchart.htmlLabels&&(I=I.replace(//g,">"));let L=p.node().appendChild(await ks(I,R.cssStyle?R.cssStyle:e.labelStyle,!0,!0)),E=L.getBBox();if(vr(ge().flowchart.htmlLabels)){let D=L.children[0],_=qe(L);E=D.getBoundingClientRect(),_.attr("width",E.width),_.attr("height",E.height)}E.width>f&&(f=E.width),d+=E.height+n,w.push(L)}),d+=i;let k=[];if(e.classData.methods.forEach(async C=>{let R=C.getDisplayDetails(),I=R.displayText;ge().flowchart.htmlLabels&&(I=I.replace(//g,">"));let L=p.node().appendChild(await ks(I,R.cssStyle?R.cssStyle:e.labelStyle,!0,!0)),E=L.getBBox();if(vr(ge().flowchart.htmlLabels)){let D=L.children[0],_=qe(L);E=D.getBoundingClientRect(),_.attr("width",E.width),_.attr("height",E.height)}E.width>f&&(f=E.width),d+=E.height+n,k.push(L)}),d+=i,g){let C=(f-x.width)/2;qe(v).attr("transform","translate( "+(-1*f/2+C)+", "+-1*d/2+")"),m=x.height+n}let A=(f-S.width)/2;return qe(T).attr("transform","translate( "+(-1*f/2+A)+", "+(-1*d/2+m)+")"),m+=S.height+n,u.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,w.forEach(C=>{qe(C).attr("transform","translate( "+-f/2+", "+(-1*d/2+m+i/2)+")");let R=C?.getBBox();m+=(R?.height??0)+n}),m+=i,h.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,k.forEach(C=>{qe(C).attr("transform","translate( "+-f/2+", "+(-1*d/2+m)+")");let R=C?.getBBox();m+=(R?.height??0)+n}),l.attr("style",e.style).attr("class","outer title-state").attr("x",-f/2-r).attr("y",-(d/2)-r).attr("width",f+e.padding).attr("height",d+e.padding),ti(e,l),e.intersect=function(C){return $n.rect(e,C)},s},"class_box"),o4e={rhombus:a4e,composite:oit,question:a4e,rect:sit,labelRect:lit,rectWithTitle:cit,choice:Knt,circle:hit,doublecircle:fit,stadium:uit,hexagon:Qnt,block_arrow:Znt,rect_left_inv_arrow:Jnt,lean_right:eit,lean_left:tit,trapezoid:rit,inv_trapezoid:nit,rect_right_inv_arrow:iit,cylinder:ait,start:pit,end:mit,note:r4e,subroutine:dit,fork:s4e,join:s4e,class_box:git},IC={},wz=o(async(t,e,r)=>{let n,i;if(e.link){let a;ge().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await o4e[e.shape](n,e,r)}else i=await o4e[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),IC[e.id]=n,e.haveCallback&&IC[e.id].attr("class",IC[e.id].attr("class")+" clickable"),n},"insertNode"),l4e=o(t=>{let e=IC[t.id];X.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function u4e(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",l;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",l=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let u=zL(n?.styles??[]),h=n.label,f=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:u.labelStyle,shape:s,labelText:h,rx:a,ry:a,class:i,style:u.style,id:n.id,directions:n.directions,width:f.width,height:f.height,x:f.x,y:f.y,positioned:r,intersect:void 0,type:n.type,padding:l??Qt()?.block?.padding??0}}async function yit(t,e,r){let n=u4e(e,r,!1);if(n.type==="group")return;let i=Qt(),a=await wz(t,n,{config:i}),s=a.node().getBBox(),l=r.getBlock(n.id);l.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(l),a.remove()}async function vit(t,e,r){let n=u4e(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=Qt();await wz(t,n,{config:a}),e.intersect=n?.intersect,l4e(n)}}async function kz(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await kz(t,i.children,r,n)}async function h4e(t,e,r){await kz(t,e,r,yit)}async function f4e(t,e,r){await kz(t,e,r,vit)}async function d4e(t,e,r,n,i){let a=new cn({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let l=n.getBlock(s.start),u=n.getBlock(s.end);if(l?.size&&u?.size){let h=l.size,f=u.size,d=[{x:h.x,y:h.y},{x:h.x+(f.x-h.x)/2,y:h.y+(f.y-h.y)/2},{x:f.x,y:f.y}];Gbe(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await $be(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),zbe({...s,x:d[1].x,y:d[1].y},{originalPath:d}))}}}var p4e=N(()=>{"use strict";qo();qn();Vbe();c4e();tr();o(u4e,"getNodeFromBlock");o(yit,"calculateBlockSize");o(vit,"insertBlockPositioned");o(kz,"performOperations");o(h4e,"calculateBlockSizes");o(f4e,"insertBlocks");o(d4e,"insertEdges")});var xit,bit,m4e,g4e=N(()=>{"use strict";yr();qn();Dbe();pt();Ei();Mbe();p4e();xit=o(function(t,e){return e.db.getClasses()},"getClasses"),bit=o(async function(t,e,r,n){let{securityLevel:i,block:a}=Qt(),s=n.db,l;i==="sandbox"&&(l=qe("#i"+e));let u=i==="sandbox"?qe(l.nodes()[0].contentDocument.body):qe("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):qe(`[id="${e}"]`);_be(h,["point","circle","cross"],n.type,e);let d=s.getBlocks(),p=s.getBlocksFlat(),m=s.getEdges(),g=h.insert("g").attr("class","block");await h4e(g,d,s);let y=Nbe(s);if(await f4e(g,d,s),await d4e(g,m,p,s,e),y){let v=y,x=Math.max(1,Math.round(.125*(v.width/v.height))),b=v.height+x+10,T=v.width+10,{useMaxWidth:S}=a;mn(h,b,T,!!S),X.debug("Here Bounds",y,v),h.attr("viewBox",`${v.x-5} ${v.y-5} ${v.width+10} ${v.height+10}`)}},"draw"),m4e={draw:bit,getClasses:xit}});var y4e={};dr(y4e,{diagram:()=>Tit});var Tit,v4e=N(()=>{"use strict";vbe();Sbe();Abe();g4e();Tit={parser:ybe,db:Ebe,renderer:m4e,styles:Cbe}});var Ez,Sz,N4,T4e,Cz,Ya,nu,M4,w4e,Sit,I4,k4e,E4e,S4e,C4e,A4e,OC,td,PC=N(()=>{"use strict";Ez={L:"left",R:"right",T:"top",B:"bottom"},Sz={L:o(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:o(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:o(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:o(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},N4={L:o((t,e)=>t-e+2,"L"),R:o((t,e)=>t-2,"R"),T:o((t,e)=>t-e+2,"T"),B:o((t,e)=>t-2,"B")},T4e=o(function(t){return Ya(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),Cz=o(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),Ya=o(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),nu=o(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),M4=o(function(t,e){let r=Ya(t)&&nu(e),n=nu(t)&&Ya(e);return r||n},"isArchitectureDirectionXY"),w4e=o(function(t){let e=t[0],r=t[1],n=Ya(e)&&nu(r),i=nu(e)&&Ya(r);return n||i},"isArchitecturePairXY"),Sit=o(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),I4=o(function(t,e){let r=`${t}${e}`;return Sit(r)?r:void 0},"getArchitectureDirectionPair"),k4e=o(function([t,e],r){let n=r[0],i=r[1];return Ya(n)?nu(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:Ya(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),E4e=o(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),S4e=o(function(t,e){return M4(t,e)?"bend":Ya(t)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),C4e=o(function(t){return t.type==="service"},"isArchitectureService"),A4e=o(function(t){return t.type==="junction"},"isArchitectureJunction"),OC=o(t=>t.data(),"edgeData"),td=o(t=>t.data(),"nodeData")});var Cit,vy,Az=N(()=>{"use strict";qn();La();tr();ci();PC();Cit=ur.architecture,vy=class{constructor(){this.nodes={};this.groups={};this.edges=[];this.registeredIds={};this.elements={};this.setAccTitle=Rr;this.getAccTitle=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getAccDescription=Or;this.setAccDescription=Ir;this.clear()}static{o(this,"ArchitectureDB")}clear(){this.nodes={},this.groups={},this.edges=[],this.registeredIds={},this.dataStructures=void 0,this.elements={},Sr()}addService({id:e,icon:r,in:n,title:i,iconText:a}){if(this.registeredIds[e]!==void 0)throw new Error(`The service id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw new Error(`The service [${e}] cannot be placed within itself`);if(this.registeredIds[n]===void 0)throw new Error(`The service [${e}]'s parent does not exist. Please make sure the parent is created before this service`);if(this.registeredIds[n]==="node")throw new Error(`The service [${e}]'s parent is not a group`)}this.registeredIds[e]="node",this.nodes[e]={id:e,type:"service",icon:r,iconText:a,title:i,edges:[],in:n}}getServices(){return Object.values(this.nodes).filter(C4e)}addJunction({id:e,in:r}){this.registeredIds[e]="node",this.nodes[e]={id:e,type:"junction",edges:[],in:r}}getJunctions(){return Object.values(this.nodes).filter(A4e)}getNodes(){return Object.values(this.nodes)}getNode(e){return this.nodes[e]??null}addGroup({id:e,icon:r,in:n,title:i}){if(this.registeredIds?.[e]!==void 0)throw new Error(`The group id [${e}] is already in use by another ${this.registeredIds[e]}`);if(n!==void 0){if(e===n)throw new Error(`The group [${e}] cannot be placed within itself`);if(this.registeredIds?.[n]===void 0)throw new Error(`The group [${e}]'s parent does not exist. Please make sure the parent is created before this group`);if(this.registeredIds?.[n]==="node")throw new Error(`The group [${e}]'s parent is not a group`)}this.registeredIds[e]="group",this.groups[e]={id:e,icon:r,title:i,in:n}}getGroups(){return Object.values(this.groups)}addEdge({lhsId:e,rhsId:r,lhsDir:n,rhsDir:i,lhsInto:a,rhsInto:s,lhsGroup:l,rhsGroup:u,title:h}){if(!Cz(n))throw new Error(`Invalid direction given for left hand side of edge ${e}--${r}. Expected (L,R,T,B) got ${String(n)}`);if(!Cz(i))throw new Error(`Invalid direction given for right hand side of edge ${e}--${r}. Expected (L,R,T,B) got ${String(i)}`);if(this.nodes[e]===void 0&&this.groups[e]===void 0)throw new Error(`The left-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(this.nodes[r]===void 0&&this.groups[r]===void 0)throw new Error(`The right-hand id [${r}] does not yet exist. Please create the service/group before declaring an edge to it.`);let f=this.nodes[e].in,d=this.nodes[r].in;if(l&&f&&d&&f==d)throw new Error(`The left-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(u&&f&&d&&f==d)throw new Error(`The right-hand id [${r}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let p={lhsId:e,lhsDir:n,lhsInto:a,lhsGroup:l,rhsId:r,rhsDir:i,rhsInto:s,rhsGroup:u,title:h};this.edges.push(p),this.nodes[e]&&this.nodes[r]&&(this.nodes[e].edges.push(this.edges[this.edges.length-1]),this.nodes[r].edges.push(this.edges[this.edges.length-1]))}getEdges(){return this.edges}getDataStructures(){if(this.dataStructures===void 0){let e={},r=Object.entries(this.nodes).reduce((u,[h,f])=>(u[h]=f.edges.reduce((d,p)=>{let m=this.getNode(p.lhsId)?.in,g=this.getNode(p.rhsId)?.in;if(m&&g&&m!==g){let y=S4e(p.lhsDir,p.rhsDir);y!=="bend"&&(e[m]??={},e[m][g]=y,e[g]??={},e[g][m]=y)}if(p.lhsId===h){let y=I4(p.lhsDir,p.rhsDir);y&&(d[y]=p.rhsId)}else{let y=I4(p.rhsDir,p.lhsDir);y&&(d[y]=p.lhsId)}return d},{}),u),{}),n=Object.keys(r)[0],i={[n]:1},a=Object.keys(r).reduce((u,h)=>h===n?u:{...u,[h]:1},{}),s=o(u=>{let h={[u]:[0,0]},f=[u];for(;f.length>0;){let d=f.shift();if(d){i[d]=1,delete a[d];let p=r[d],[m,g]=h[d];Object.entries(p).forEach(([y,v])=>{i[v]||(h[v]=k4e([m,g],y),f.push(v))})}}return h},"BFS"),l=[s(n)];for(;Object.keys(a).length>0;)l.push(s(Object.keys(a)[0]));this.dataStructures={adjList:r,spatialMaps:l,groupAlignments:e}}return this.dataStructures}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}getConfig(){return Vn({...Cit,...Qt().architecture})}getConfigField(e){return this.getConfig()[e]}}});var Ait,_z,_4e=N(()=>{"use strict";Uf();pt();r0();Az();Ait=o((t,e)=>{nl(t,e),t.groups.map(r=>e.addGroup(r)),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(r=>e.addEdge(r))},"populateDb"),_z={parser:{yy:void 0},parse:o(async t=>{let e=await bs("architecture",t);X.debug(e);let r=_z.parser?.yy;if(!(r instanceof vy))throw new Error("parser.parser?.yy was not a ArchitectureDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Ait(e,r)},"parse")}});var _it,D4e,L4e=N(()=>{"use strict";_it=o(t=>` + .edge { + stroke-width: ${t.archEdgeWidth}; + stroke: ${t.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${t.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${t.archGroupBorderColor}; + stroke-width: ${t.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`,"getStyles"),D4e=_it});var Lz=Da((O4,Dz)=>{"use strict";o((function(e,r){typeof O4=="object"&&typeof Dz=="object"?Dz.exports=r():typeof define=="function"&&define.amd?define([],r):typeof O4=="object"?O4.layoutBase=r():e.layoutBase=r()}),"webpackUniversalModuleDefinition")(O4,function(){return(function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)})([(function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s}),(function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(5);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp?(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(p+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(m+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>m?(this.rect.y-=(this.labelHeight-m)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(m+this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h}),(function(t,e,r){"use strict";var n=r(0);function i(){}o(i,"FDLayoutConstants");for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i}),(function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n}),(function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&k>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(k,1);var S=x.source.owner.getEdges().indexOf(x);if(S==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(S,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),S=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,S,w,k,A,C=this.nodes,R=C.length,I=0;IT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var R=0;v.forEach(function(I){I.owner==g&&R++}),R==this.nodes.length&&(this.isConnected=!0)}},t.exports=p}),(function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=C,!1;if(hf)return l[0]=p,l[1]=h,l[2]=k,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,E=!0):(l[0]=g,l[1]=m,E=!0):_===M&&(u>f?(l[0]=p,l[1]=m,E=!0):(l[0]=x,l[1]=v,E=!0)),-O===M?f>u?(l[2]=A,l[3]=C,D=!0):(l[2]=k,l[3]=w,D=!0):O===M&&(f>u?(l[2]=S,l[3]=w,D=!0):(l[2]=R,l[3]=C,D=!0)),E&&D)return!1;if(u>f?h>d?(P=this.getCardinalDirection(_,M,4),B=this.getCardinalDirection(O,M,2)):(P=this.getCardinalDirection(-_,M,3),B=this.getCardinalDirection(-O,M,1)):h>d?(P=this.getCardinalDirection(-_,M,1),B=this.getCardinalDirection(-O,M,3)):(P=this.getCardinalDirection(_,M,2),B=this.getCardinalDirection(O,M,4)),!E)switch(P){case 1:G=m,F=u+-T/M,l[0]=F,l[1]=G;break;case 2:F=x,G=h+b*M,l[0]=F,l[1]=G;break;case 3:G=v,F=u+T/M,l[0]=F,l[1]=G;break;case 4:F=y,G=h+-b*M,l[0]=F,l[1]=G;break}if(!D)switch(B){case 1:U=w,$=f+-L/M,l[2]=$,l[3]=U;break;case 2:$=R,U=d+I*M,l[2]=$,l[3]=U;break;case 3:U=C,$=f+L/M,l[2]=$,l[3]=U;break;case 4:$=A,U=d+-I*M,l[2]=$,l[3]=U;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,S=void 0,w=void 0,k=void 0,A=void 0,C=void 0,R=void 0;return T=p-f,w=h-d,A=d*f-h*p,S=v-g,k=m-y,C=y*g-m*v,R=T*k-S*w,R===0?null:(x=(w*C-k*A)/R,b=(S*A-T*C)/R,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l=0){var v=(-m+Math.sqrt(m*m-4*p*g))/(2*p),x=(-m-Math.sqrt(m*m-4*p*g))/(2*p),b=null;return v>=0&&v<=1?[v]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i}),(function(t,e,r){"use strict";function n(){}o(n,"IMath"),n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n}),(function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i}),(function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var k=T[0];T.splice(0,1),b.add(k);for(var A=k.getEdges(),x=0;x-1&&w.splice(L,1)}b=new Set,S=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(C,1);var R=S.getNeighborsList();R.forEach(function(E){if(y.indexOf(E)<0){var D=v.get(E),_=D-1;_==1&&k.push(E),v.set(E,_)}})}y=y.concat(k),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p}),(function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n}),(function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i}),(function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var S=0;Sh},"_defaultCompareFunction")}]),l})();t.exports=s}),(function(t,e,r){"use strict";function n(){}o(n,"SVD"),n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=(function(dt){for(var nt=[];dt-- >0;)nt.push(0);return nt})(Math.min(this.m+1,this.n)),this.U=(function(dt){var nt=o(function bt(wt){if(wt.length==0)return 0;for(var yt=[],ft=0;ft0;)nt.push(0);return nt})(this.n),l=(function(dt){for(var nt=[];dt-- >0;)nt.push(0);return nt})(this.m),u=!0,h=!0,f=Math.min(this.m-1,this.n),d=Math.max(0,Math.min(this.n-2,this.m)),p=0;p=0;M--)if(this.s[M]!==0){for(var P=M+1;P=0;te--){if((function(dt,nt){return dt&&nt})(te0;){var Q=void 0,de=void 0;for(Q=D-2;Q>=-1&&Q!==-1;Q--)if(Math.abs(s[Q])<=ae+K*(Math.abs(this.s[Q])+Math.abs(this.s[Q+1]))){s[Q]=0;break}if(Q===D-2)de=4;else{var ne=void 0;for(ne=D-1;ne>=Q&&ne!==Q;ne--){var Te=(ne!==D?Math.abs(s[ne]):0)+(ne!==Q+1?Math.abs(s[ne-1]):0);if(Math.abs(this.s[ne])<=ae+K*Te){this.s[ne]=0;break}}ne===Q?de=3:ne===D-1?de=1:(de=2,Q=ne)}switch(Q++,de){case 1:{var q=s[D-2];s[D-2]=0;for(var Ve=D-2;Ve>=Q;Ve--){var pe=n.hypot(this.s[Ve],q),Be=this.s[Ve]/pe,Ye=q/pe;if(this.s[Ve]=pe,Ve!==Q&&(q=-Ye*s[Ve-1],s[Ve-1]=Be*s[Ve-1]),h)for(var He=0;He=this.s[Q+1]);){var lt=this.s[Q];if(this.s[Q]=this.s[Q+1],this.s[Q+1]=lt,h&&QMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n}),(function(t,e,r){"use strict";var n=(function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o((function(e,r){typeof P4=="object"&&typeof Rz=="object"?Rz.exports=r(Lz()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof P4=="object"?P4.coseBase=r(Lz()):e.coseBase=r(e.layoutBase)}),"webpackUniversalModuleDefinition")(P4,function(t){return(()=>{"use strict";var e={45:((a,s,l)=>{var u={};u.layoutBase=l(551),u.CoSEConstants=l(806),u.CoSEEdge=l(767),u.CoSEGraph=l(880),u.CoSEGraphManager=l(578),u.CoSELayout=l(765),u.CoSENode=l(991),u.ConstraintHandler=l(902),a.exports=u}),806:((a,s,l)=>{var u=l(551).FDLayoutConstants;function h(){}o(h,"CoSEConstants");for(var f in u)h[f]=u[f];h.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,h.DEFAULT_RADIAL_SEPARATION=u.DEFAULT_EDGE_LENGTH,h.DEFAULT_COMPONENT_SEPERATION=60,h.TILE=!0,h.TILING_PADDING_VERTICAL=10,h.TILING_PADDING_HORIZONTAL=10,h.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,h.ENFORCE_CONSTRAINTS=!0,h.APPLY_LAYOUT=!0,h.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,h.TREE_REDUCTION_ON_INCREMENTAL=!0,h.PURE_INCREMENTAL=h.DEFAULT_INCREMENTAL,a.exports=h}),767:((a,s,l)=>{var u=l(551).FDLayoutEdge;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEEdge"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),880:((a,s,l)=>{var u=l(551).LGraph;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEGraph"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),578:((a,s,l)=>{var u=l(551).LGraphManager;function h(d){u.call(this,d)}o(h,"CoSEGraphManager"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h}),765:((a,s,l)=>{var u=l(551).FDLayout,h=l(578),f=l(880),d=l(991),p=l(767),m=l(806),g=l(902),y=l(551).FDLayoutConstants,v=l(551).LayoutConstants,x=l(551).Point,b=l(551).PointD,T=l(551).DimensionD,S=l(551).Layout,w=l(551).Integer,k=l(551).IGeometry,A=l(551).LGraph,C=l(551).Transform,R=l(551).LinkedList;function I(){u.call(this),this.toBeTiled={},this.constraints={}}o(I,"CoSELayout"),I.prototype=Object.create(u.prototype);for(var L in u)I[L]=u[L];I.prototype.newGraphManager=function(){var E=new h(this);return this.graphManager=E,E},I.prototype.newGraph=function(E){return new f(null,this.graphManager,E)},I.prototype.newNode=function(E){return new d(this.graphManager,E)},I.prototype.newEdge=function(E){return new p(null,null,E)},I.prototype.initParameters=function(){u.prototype.initParameters.call(this,arguments),this.isSubLayout||(m.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=m.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=m.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=y.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=y.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=y.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},I.prototype.initSpringEmbedder=function(){u.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/y.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},I.prototype.layout=function(){var E=v.DEFAULT_CREATE_BENDS_AS_NEEDED;return E&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},I.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(m.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var D=new Set(this.getAllNodes()),_=this.nodesWithGravity.filter(function(P){return D.has(P)});this.graphManager.setAllNodesToApplyGravitation(_)}}else{var E=this.getFlatForest();if(E.length>0)this.positionNodesRadially(E);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var D=new Set(this.getAllNodes()),_=this.nodesWithGravity.filter(function(O){return D.has(O)});this.graphManager.setAllNodesToApplyGravitation(_),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),m.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},I.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%y.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var E=new Set(this.getAllNodes()),D=this.nodesWithGravity.filter(function(M){return E.has(M)});this.graphManager.setAllNodesToApplyGravitation(D),this.graphManager.updateBounds(),this.updateGrid(),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var _=!this.isTreeGrowing&&!this.isGrowthFinished,O=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(_,O),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},I.prototype.getPositionsData=function(){for(var E=this.graphManager.getAllNodes(),D={},_=0;_0&&this.updateDisplacements();for(var _=0;_0&&(O.fixedNodeWeight=P)}}if(this.constraints.relativePlacementConstraint){var B=new Map,F=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(J){E.fixedNodesOnHorizontal.add(J),E.fixedNodesOnVertical.add(J)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var G=this.constraints.alignmentConstraint.vertical,_=0;_=2*J.length/3;ee--)ue=Math.floor(Math.random()*(ee+1)),re=J[ee],J[ee]=J[ue],J[ue]=re;return J},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(J){if(J.left){var ue=B.has(J.left)?B.get(J.left):J.left,re=B.has(J.right)?B.get(J.right):J.right;E.nodesInRelativeHorizontal.includes(ue)||(E.nodesInRelativeHorizontal.push(ue),E.nodeToRelativeConstraintMapHorizontal.set(ue,[]),E.dummyToNodeForVerticalAlignment.has(ue)?E.nodeToTempPositionMapHorizontal.set(ue,E.idToNodeMap.get(E.dummyToNodeForVerticalAlignment.get(ue)[0]).getCenterX()):E.nodeToTempPositionMapHorizontal.set(ue,E.idToNodeMap.get(ue).getCenterX())),E.nodesInRelativeHorizontal.includes(re)||(E.nodesInRelativeHorizontal.push(re),E.nodeToRelativeConstraintMapHorizontal.set(re,[]),E.dummyToNodeForVerticalAlignment.has(re)?E.nodeToTempPositionMapHorizontal.set(re,E.idToNodeMap.get(E.dummyToNodeForVerticalAlignment.get(re)[0]).getCenterX()):E.nodeToTempPositionMapHorizontal.set(re,E.idToNodeMap.get(re).getCenterX())),E.nodeToRelativeConstraintMapHorizontal.get(ue).push({right:re,gap:J.gap}),E.nodeToRelativeConstraintMapHorizontal.get(re).push({left:ue,gap:J.gap})}else{var ee=F.has(J.top)?F.get(J.top):J.top,Z=F.has(J.bottom)?F.get(J.bottom):J.bottom;E.nodesInRelativeVertical.includes(ee)||(E.nodesInRelativeVertical.push(ee),E.nodeToRelativeConstraintMapVertical.set(ee,[]),E.dummyToNodeForHorizontalAlignment.has(ee)?E.nodeToTempPositionMapVertical.set(ee,E.idToNodeMap.get(E.dummyToNodeForHorizontalAlignment.get(ee)[0]).getCenterY()):E.nodeToTempPositionMapVertical.set(ee,E.idToNodeMap.get(ee).getCenterY())),E.nodesInRelativeVertical.includes(Z)||(E.nodesInRelativeVertical.push(Z),E.nodeToRelativeConstraintMapVertical.set(Z,[]),E.dummyToNodeForHorizontalAlignment.has(Z)?E.nodeToTempPositionMapVertical.set(Z,E.idToNodeMap.get(E.dummyToNodeForHorizontalAlignment.get(Z)[0]).getCenterY()):E.nodeToTempPositionMapVertical.set(Z,E.idToNodeMap.get(Z).getCenterY())),E.nodeToRelativeConstraintMapVertical.get(ee).push({bottom:Z,gap:J.gap}),E.nodeToRelativeConstraintMapVertical.get(Z).push({top:ee,gap:J.gap})}});else{var U=new Map,j=new Map;this.constraints.relativePlacementConstraint.forEach(function(J){if(J.left){var ue=B.has(J.left)?B.get(J.left):J.left,re=B.has(J.right)?B.get(J.right):J.right;U.has(ue)?U.get(ue).push(re):U.set(ue,[re]),U.has(re)?U.get(re).push(ue):U.set(re,[ue])}else{var ee=F.has(J.top)?F.get(J.top):J.top,Z=F.has(J.bottom)?F.get(J.bottom):J.bottom;j.has(ee)?j.get(ee).push(Z):j.set(ee,[Z]),j.has(Z)?j.get(Z).push(ee):j.set(Z,[ee])}});var te=o(function(ue,re){var ee=[],Z=[],K=new R,ae=new Set,Q=0;return ue.forEach(function(de,ne){if(!ae.has(ne)){ee[Q]=[],Z[Q]=!1;var Te=ne;for(K.push(Te),ae.add(Te),ee[Q].push(Te);K.length!=0;){Te=K.shift(),re.has(Te)&&(Z[Q]=!0);var q=ue.get(Te);q.forEach(function(Ve){ae.has(Ve)||(K.push(Ve),ae.add(Ve),ee[Q].push(Ve))})}Q++}}),{components:ee,isFixed:Z}},"constructComponents"),Y=te(U,E.fixedNodesOnHorizontal);this.componentsOnHorizontal=Y.components,this.fixedComponentsOnHorizontal=Y.isFixed;var oe=te(j,E.fixedNodesOnVertical);this.componentsOnVertical=oe.components,this.fixedComponentsOnVertical=oe.isFixed}}},I.prototype.updateDisplacements=function(){var E=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(oe){var J=E.idToNodeMap.get(oe.nodeId);J.displacementX=0,J.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var D=this.constraints.alignmentConstraint.vertical,_=0;_1){var F;for(F=0;FO&&(O=Math.floor(B.y)),P=Math.floor(B.x+m.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(v.WORLD_CENTER_X-B.x/2,v.WORLD_CENTER_Y-B.y/2))},I.radialLayout=function(E,D,_){var O=Math.max(this.maxDiagonalInTree(E),m.DEFAULT_RADIAL_SEPARATION);I.branchRadialLayout(D,null,0,359,0,O);var M=A.calculateBounds(E),P=new C;P.setDeviceOrgX(M.getMinX()),P.setDeviceOrgY(M.getMinY()),P.setWorldOrgX(_.x),P.setWorldOrgY(_.y);for(var B=0;B1;){var ee=re[0];re.splice(0,1);var Z=te.indexOf(ee);Z>=0&&te.splice(Z,1),J--,Y--}D!=null?ue=(te.indexOf(re[0])+1)%J:ue=0;for(var K=Math.abs(O-_)/Y,ae=ue;oe!=Y;ae=++ae%J){var Q=te[ae].getOtherEnd(E);if(Q!=D){var de=(_+oe*K)%360,ne=(de+K)%360;I.branchRadialLayout(Q,E,de,ne,M+P,P),oe++}}},I.maxDiagonalInTree=function(E){for(var D=w.MIN_VALUE,_=0;_D&&(D=M)}return D},I.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},I.prototype.groupZeroDegreeMembers=function(){var E=this,D={};this.memberGroups={},this.idToDummyNode={};for(var _=[],O=this.graphManager.getAllNodes(),M=0;M"u"&&(D[F]=[]),D[F]=D[F].concat(P)}Object.keys(D).forEach(function(G){if(D[G].length>1){var $="DummyCompound_"+G;E.memberGroups[$]=D[G];var U=D[G][0].getParent(),j=new d(E.graphManager);j.id=$,j.paddingLeft=U.paddingLeft||0,j.paddingRight=U.paddingRight||0,j.paddingBottom=U.paddingBottom||0,j.paddingTop=U.paddingTop||0,E.idToDummyNode[$]=j;var te=E.getGraphManager().add(E.newGraph(),j),Y=U.getChild();Y.add(j);for(var oe=0;oeM?(O.rect.x-=(O.labelWidth-M)/2,O.setWidth(O.labelWidth),O.labelMarginLeft=(O.labelWidth-M)/2):O.labelPosHorizontal=="right"&&O.setWidth(M+O.labelWidth)),O.labelHeight&&(O.labelPosVertical=="top"?(O.rect.y-=O.labelHeight,O.setHeight(P+O.labelHeight),O.labelMarginTop=O.labelHeight):O.labelPosVertical=="center"&&O.labelHeight>P?(O.rect.y-=(O.labelHeight-P)/2,O.setHeight(O.labelHeight),O.labelMarginTop=(O.labelHeight-P)/2):O.labelPosVertical=="bottom"&&O.setHeight(P+O.labelHeight))}})},I.prototype.repopulateCompounds=function(){for(var E=this.compoundOrder.length-1;E>=0;E--){var D=this.compoundOrder[E],_=D.id,O=D.paddingLeft,M=D.paddingTop,P=D.labelMarginLeft,B=D.labelMarginTop;this.adjustLocations(this.tiledMemberPack[_],D.rect.x,D.rect.y,O,M,P,B)}},I.prototype.repopulateZeroDegreeMembers=function(){var E=this,D=this.tiledZeroDegreePack;Object.keys(D).forEach(function(_){var O=E.idToDummyNode[_],M=O.paddingLeft,P=O.paddingTop,B=O.labelMarginLeft,F=O.labelMarginTop;E.adjustLocations(D[_],O.rect.x,O.rect.y,M,P,B,F)})},I.prototype.getToBeTiled=function(E){var D=E.id;if(this.toBeTiled[D]!=null)return this.toBeTiled[D];var _=E.getChild();if(_==null)return this.toBeTiled[D]=!1,!1;for(var O=_.getNodes(),M=0;M0)return this.toBeTiled[D]=!1,!1;if(P.getChild()==null){this.toBeTiled[P.id]=!1;continue}if(!this.getToBeTiled(P))return this.toBeTiled[D]=!1,!1}return this.toBeTiled[D]=!0,!0},I.prototype.getNodeDegree=function(E){for(var D=E.id,_=E.getEdges(),O=0,M=0;M<_.length;M++){var P=_[M];P.getSource().id!==P.getTarget().id&&(O=O+1)}return O},I.prototype.getNodeDegreeWithChildren=function(E){var D=this.getNodeDegree(E);if(E.getChild()==null)return D;for(var _=E.getChild().getNodes(),O=0;O<_.length;O++){var M=_[O];D+=this.getNodeDegreeWithChildren(M)}return D},I.prototype.performDFSOnCompounds=function(){this.compoundOrder=[],this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes())},I.prototype.fillCompexOrderByDFS=function(E){for(var D=0;DU&&(U=te.rect.height)}_+=U+E.verticalPadding}},I.prototype.tileCompoundMembers=function(E,D){var _=this;this.tiledMemberPack=[],Object.keys(E).forEach(function(O){var M=D[O];if(_.tiledMemberPack[O]=_.tileNodes(E[O],M.paddingLeft+M.paddingRight),M.rect.width=_.tiledMemberPack[O].width,M.rect.height=_.tiledMemberPack[O].height,M.setCenter(_.tiledMemberPack[O].centerX,_.tiledMemberPack[O].centerY),M.labelMarginLeft=0,M.labelMarginTop=0,m.NODE_DIMENSIONS_INCLUDE_LABELS){var P=M.rect.width,B=M.rect.height;M.labelWidth&&(M.labelPosHorizontal=="left"?(M.rect.x-=M.labelWidth,M.setWidth(P+M.labelWidth),M.labelMarginLeft=M.labelWidth):M.labelPosHorizontal=="center"&&M.labelWidth>P?(M.rect.x-=(M.labelWidth-P)/2,M.setWidth(M.labelWidth),M.labelMarginLeft=(M.labelWidth-P)/2):M.labelPosHorizontal=="right"&&M.setWidth(P+M.labelWidth)),M.labelHeight&&(M.labelPosVertical=="top"?(M.rect.y-=M.labelHeight,M.setHeight(B+M.labelHeight),M.labelMarginTop=M.labelHeight):M.labelPosVertical=="center"&&M.labelHeight>B?(M.rect.y-=(M.labelHeight-B)/2,M.setHeight(M.labelHeight),M.labelMarginTop=(M.labelHeight-B)/2):M.labelPosVertical=="bottom"&&M.setHeight(B+M.labelHeight))}})},I.prototype.tileNodes=function(E,D){var _=this.tileNodesByFavoringDim(E,D,!0),O=this.tileNodesByFavoringDim(E,D,!1),M=this.getOrgRatio(_),P=this.getOrgRatio(O),B;return PF&&(F=oe.getWidth())});var G=P/M,$=B/M,U=Math.pow(_-O,2)+4*(G+O)*($+_)*M,j=(O-_+Math.sqrt(U))/(2*(G+O)),te;D?(te=Math.ceil(j),te==j&&te++):te=Math.floor(j);var Y=te*(G+O)-O;return F>Y&&(Y=F),Y+=O*2,Y},I.prototype.tileNodesByFavoringDim=function(E,D,_){var O=m.TILING_PADDING_VERTICAL,M=m.TILING_PADDING_HORIZONTAL,P=m.TILING_COMPARE_BY,B={rows:[],rowWidth:[],rowHeight:[],width:0,height:D,verticalPadding:O,horizontalPadding:M,centerX:0,centerY:0};P&&(B.idealRowWidth=this.calcIdealRowWidth(E,_));var F=o(function(J){return J.rect.width*J.rect.height},"getNodeArea"),G=o(function(J,ue){return F(ue)-F(J)},"areaCompareFcn");E.sort(function(oe,J){var ue=G;return B.idealRowWidth?(ue=P,ue(oe.id,J.id)):ue(oe,J)});for(var $=0,U=0,j=0;j0&&(B+=E.horizontalPadding),E.rowWidth[_]=B,E.width0&&(F+=E.verticalPadding);var G=0;F>E.rowHeight[_]&&(G=E.rowHeight[_],E.rowHeight[_]=F,G=E.rowHeight[_]-G),E.height+=G,E.rows[_].push(D)},I.prototype.getShortestRowIndex=function(E){for(var D=-1,_=Number.MAX_VALUE,O=0;O_&&(D=O,_=E.rowWidth[O]);return D},I.prototype.canAddHorizontal=function(E,D,_){if(E.idealRowWidth){var O=E.rows.length-1,M=E.rowWidth[O];return M+D+E.horizontalPadding<=E.idealRowWidth}var P=this.getShortestRowIndex(E);if(P<0)return!0;var B=E.rowWidth[P];if(B+E.horizontalPadding+D<=E.width)return!0;var F=0;E.rowHeight[P]<_&&P>0&&(F=_+E.verticalPadding-E.rowHeight[P]);var G;E.width-B>=D+E.horizontalPadding?G=(E.height+F)/(B+D+E.horizontalPadding):G=(E.height+F)/E.width,F=_+E.verticalPadding;var $;return E.widthP&&D!=_){O.splice(-1,1),E.rows[_].push(M),E.rowWidth[D]=E.rowWidth[D]-P,E.rowWidth[_]=E.rowWidth[_]+P,E.width=E.rowWidth[instance.getLongestRowIndex(E)];for(var B=Number.MIN_VALUE,F=0;FB&&(B=O[F].height);D>0&&(B+=E.verticalPadding);var G=E.rowHeight[D]+E.rowHeight[_];E.rowHeight[D]=B,E.rowHeight[_]0)for(var Y=M;Y<=P;Y++)te[0]+=this.grid[Y][B-1].length+this.grid[Y][B].length-1;if(P0)for(var Y=B;Y<=F;Y++)te[3]+=this.grid[M-1][Y].length+this.grid[M][Y].length-1;for(var oe=w.MAX_VALUE,J,ue,re=0;re{var u=l(551).FDLayoutNode,h=l(551).IMath;function f(p,m,g,y){u.call(this,p,m,g,y)}o(f,"CoSENode"),f.prototype=Object.create(u.prototype);for(var d in u)f[d]=u[d];f.prototype.calculateDisplacement=function(){var p=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementX=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementX)),Math.abs(this.displacementY)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementY=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},f.prototype.propogateDisplacementToChildren=function(p,m){for(var g=this.getChild().getNodes(),y,v=0;v{function u(g){if(Array.isArray(g)){for(var y=0,v=Array(g.length);y0){var et=0;Oe.forEach(function(lt){he=="horizontal"?(ye.set(lt,x.has(lt)?b[x.get(lt)]:se.get(lt)),et+=ye.get(lt)):(ye.set(lt,x.has(lt)?T[x.get(lt)]:se.get(lt)),et+=ye.get(lt))}),et=et/Oe.length,We.forEach(function(lt){z.has(lt)||ye.set(lt,et)})}else{var Ue=0;We.forEach(function(lt){he=="horizontal"?Ue+=x.has(lt)?b[x.get(lt)]:se.get(lt):Ue+=x.has(lt)?T[x.get(lt)]:se.get(lt)}),Ue=Ue/We.length,We.forEach(function(lt){ye.set(lt,Ue)})}});for(var ze=o(function(){var Oe=_e.shift(),et=W.get(Oe);et.forEach(function(Ue){if(ye.get(Ue.id)lt&&(lt=yt),ftGt&&(Gt=ft)}}catch(Ct){Lt=!0,dt=Ct}finally{try{!vt&&nt.return&&nt.return()}finally{if(Lt)throw dt}}var Ur=(et+lt)/2-(Ue+Gt)/2,_t=!0,bn=!1,Br=void 0;try{for(var cr=We[Symbol.iterator](),ar;!(_t=(ar=cr.next()).done);_t=!0){var _r=ar.value;ye.set(_r,ye.get(_r)+Ur)}}catch(Ct){bn=!0,Br=Ct}finally{try{!_t&&cr.return&&cr.return()}finally{if(bn)throw Br}}})}return ye},"findAppropriatePositionForRelativePlacement"),L=o(function(W){var he=0,z=0,se=0,le=0;if(W.forEach(function(Re){Re.left?b[x.get(Re.left)]-b[x.get(Re.right)]>=0?he++:z++:T[x.get(Re.top)]-T[x.get(Re.bottom)]>=0?se++:le++}),he>z&&se>le)for(var ke=0;kez)for(var ve=0;vele)for(var ye=0;ye1)y.fixedNodeConstraint.forEach(function(xe,W){O[W]=[xe.position.x,xe.position.y],M[W]=[b[x.get(xe.nodeId)],T[x.get(xe.nodeId)]]}),P=!0;else if(y.alignmentConstraint)(function(){var xe=0;if(y.alignmentConstraint.vertical){for(var W=y.alignmentConstraint.vertical,he=o(function(ye){var Re=new Set;W[ye].forEach(function(Ke){Re.add(Ke)});var _e=new Set([].concat(u(Re)).filter(function(Ke){return F.has(Ke)})),ze=void 0;_e.size>0?ze=b[x.get(_e.values().next().value)]:ze=R(Re).x,W[ye].forEach(function(Ke){O[xe]=[ze,T[x.get(Ke)]],M[xe]=[b[x.get(Ke)],T[x.get(Ke)]],xe++})},"_loop2"),z=0;z0?ze=b[x.get(_e.values().next().value)]:ze=R(Re).y,se[ye].forEach(function(Ke){O[xe]=[b[x.get(Ke)],ze],M[xe]=[b[x.get(Ke)],T[x.get(Ke)]],xe++})},"_loop3"),ke=0;kej&&(j=U[Y].length,te=Y);if(j<$.size/2)L(y.relativePlacementConstraint),P=!1,B=!1;else{var oe=new Map,J=new Map,ue=[];U[te].forEach(function(xe){G.get(xe).forEach(function(W){W.direction=="horizontal"?(oe.has(xe)?oe.get(xe).push(W):oe.set(xe,[W]),oe.has(W.id)||oe.set(W.id,[]),ue.push({left:xe,right:W.id})):(J.has(xe)?J.get(xe).push(W):J.set(xe,[W]),J.has(W.id)||J.set(W.id,[]),ue.push({top:xe,bottom:W.id}))})}),L(ue),B=!1;var re=I(oe,"horizontal"),ee=I(J,"vertical");U[te].forEach(function(xe,W){M[W]=[b[x.get(xe)],T[x.get(xe)]],O[W]=[],re.has(xe)?O[W][0]=re.get(xe):O[W][0]=b[x.get(xe)],ee.has(xe)?O[W][1]=ee.get(xe):O[W][1]=T[x.get(xe)]}),P=!0}}if(P){for(var Z=void 0,K=d.transpose(O),ae=d.transpose(M),Q=0;Q0){var Be={x:0,y:0};y.fixedNodeConstraint.forEach(function(xe,W){var he={x:b[x.get(xe.nodeId)],y:T[x.get(xe.nodeId)]},z=xe.position,se=C(z,he);Be.x+=se.x,Be.y+=se.y}),Be.x/=y.fixedNodeConstraint.length,Be.y/=y.fixedNodeConstraint.length,b.forEach(function(xe,W){b[W]+=Be.x}),T.forEach(function(xe,W){T[W]+=Be.y}),y.fixedNodeConstraint.forEach(function(xe){b[x.get(xe.nodeId)]=xe.position.x,T[x.get(xe.nodeId)]=xe.position.y})}if(y.alignmentConstraint){if(y.alignmentConstraint.vertical)for(var Ye=y.alignmentConstraint.vertical,He=o(function(W){var he=new Set;Ye[W].forEach(function(le){he.add(le)});var z=new Set([].concat(u(he)).filter(function(le){return F.has(le)})),se=void 0;z.size>0?se=b[x.get(z.values().next().value)]:se=R(he).x,he.forEach(function(le){F.has(le)||(b[x.get(le)]=se)})},"_loop4"),Le=0;Le0?se=T[x.get(z.values().next().value)]:se=R(he).y,he.forEach(function(le){F.has(le)||(T[x.get(le)]=se)})},"_loop5"),Ce=0;Ce{a.exports=t})},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(45);return i})()})});var R4e=Da((B4,Mz)=>{"use strict";o((function(e,r){typeof B4=="object"&&typeof Mz=="object"?Mz.exports=r(Nz()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof B4=="object"?B4.cytoscapeFcose=r(Nz()):e.cytoscapeFcose=r(e.coseBase)}),"webpackUniversalModuleDefinition")(B4,function(t){return(()=>{"use strict";var e={658:(a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var l=arguments.length,u=Array(l>1?l-1:0),h=1;h{var u=(function(){function d(p,m){var g=[],y=!0,v=!1,x=void 0;try{for(var b=p[Symbol.iterator](),T;!(y=(T=b.next()).done)&&(g.push(T.value),!(m&&g.length===m));y=!0);}catch(S){v=!0,x=S}finally{try{!y&&b.return&&b.return()}finally{if(v)throw x}}return g}return o(d,"sliceIterator"),function(p,m){if(Array.isArray(p))return p;if(Symbol.iterator in Object(p))return d(p,m);throw new TypeError("Invalid attempt to destructure non-iterable instance")}})(),h=l(140).layoutBase.LinkedList,f={};f.getTopMostNodes=function(d){for(var p={},m=0;m0&&P.merge($)});for(var B=0;B1){T=x[0],S=T.connectedEdges().length,x.forEach(function(M){M.connectedEdges().length0&&g.set("dummy"+(g.size+1),A),C},f.relocateComponent=function(d,p,m){if(!m.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(m.quality=="draft"){var b=!0,T=!1,S=void 0;try{for(var w=p.nodeIndexes[Symbol.iterator](),k;!(b=(k=w.next()).done);b=!0){var A=k.value,C=u(A,2),R=C[0],I=C[1],L=m.cy.getElementById(R);if(L){var E=L.boundingBox(),D=p.xCoords[I]-E.w/2,_=p.xCoords[I]+E.w/2,O=p.yCoords[I]-E.h/2,M=p.yCoords[I]+E.h/2;Dy&&(y=_),Ox&&(x=M)}}}catch($){T=!0,S=$}finally{try{!b&&w.return&&w.return()}finally{if(T)throw S}}var P=d.x-(y+g)/2,B=d.y-(x+v)/2;p.xCoords=p.xCoords.map(function($){return $+P}),p.yCoords=p.yCoords.map(function($){return $+B})}else{Object.keys(p).forEach(function($){var U=p[$],j=U.getRect().x,te=U.getRect().x+U.getRect().width,Y=U.getRect().y,oe=U.getRect().y+U.getRect().height;jy&&(y=te),Yx&&(x=oe)});var F=d.x-(y+g)/2,G=d.y-(x+v)/2;Object.keys(p).forEach(function($){var U=p[$];U.setCenter(U.getCenterX()+F,U.getCenterY()+G)})}}},f.calcBoundingBox=function(d,p,m,g){for(var y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,T=void 0,S=void 0,w=void 0,k=void 0,A=d.descendants().not(":parent"),C=A.length,R=0;RT&&(y=T),vw&&(x=w),b{var u=l(548),h=l(140).CoSELayout,f=l(140).CoSENode,d=l(140).layoutBase.PointD,p=l(140).layoutBase.DimensionD,m=l(140).layoutBase.LayoutConstants,g=l(140).layoutBase.FDLayoutConstants,y=l(140).CoSEConstants,v=o(function(b,T){var S=b.cy,w=b.eles,k=w.nodes(),A=w.edges(),C=void 0,R=void 0,I=void 0,L={};b.randomize&&(C=T.nodeIndexes,R=T.xCoords,I=T.yCoords);var E=o(function($){return typeof $=="function"},"isFn"),D=o(function($,U){return E($)?$(U):$},"optFn"),_=u.calcParentsWithoutChildren(S,w),O=o(function G($,U,j,te){for(var Y=U.length,oe=0;oe0){var K=void 0;K=j.getGraphManager().add(j.newGraph(),re),G(K,ue,j,te)}}},"processChildrenList"),M=o(function($,U,j){for(var te=0,Y=0,oe=0;oe0?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=te/Y:E(b.idealEdgeLength)?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,y.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,y.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},"processEdges"),P=o(function($,U){U.fixedNodeConstraint&&($.constraints.fixedNodeConstraint=U.fixedNodeConstraint),U.alignmentConstraint&&($.constraints.alignmentConstraint=U.alignmentConstraint),U.relativePlacementConstraint&&($.constraints.relativePlacementConstraint=U.relativePlacementConstraint)},"processConstraints");b.nestingFactor!=null&&(y.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(y.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(y.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(y.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(y.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(y.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?m.QUALITY=2:m.QUALITY=0,y.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=m.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!b.randomize,y.ANIMATE=g.ANIMATE=m.ANIMATE=b.animate,y.TILE=b.tile,y.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,y.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!0,y.PURE_INCREMENTAL=!b.randomize,m.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!1),b.step=="enforced"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!1),b.step=="cose"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?y.TREE_REDUCTION_ON_INCREMENTAL=!1:y.TREE_REDUCTION_ON_INCREMENTAL=!0;var B=new h,F=B.newGraphManager();return O(F.addRoot(),u.getTopMostNodes(k),B,b),M(B,F,A),P(B,b),B.runLayout(),L},"coseLayout");a.exports={coseLayout:v}}),212:((a,s,l)=>{var u=(function(){function b(T,S){for(var w=0;w0)if(M){var F=d.getTopMostNodes(w.eles.nodes());if(E=d.connectComponents(k,w.eles,F),E.forEach(function(Te){var q=Te.boundingBox();D.push({x:q.x1+q.w/2,y:q.y1+q.h/2})}),w.randomize&&E.forEach(function(Te){w.eles=Te,C.push(m(w))}),w.quality=="default"||w.quality=="proof"){var G=k.collection();if(w.tile){var $=new Map,U=[],j=[],te=0,Y={nodeIndexes:$,xCoords:U,yCoords:j},oe=[];if(E.forEach(function(Te,q){Te.edges().length==0&&(Te.nodes().forEach(function(Ve,pe){G.merge(Te.nodes()[pe]),Ve.isParent()||(Y.nodeIndexes.set(Te.nodes()[pe].id(),te++),Y.xCoords.push(Te.nodes()[0].position().x),Y.yCoords.push(Te.nodes()[0].position().y))}),oe.push(q))}),G.length>1){var J=G.boundingBox();D.push({x:J.x1+J.w/2,y:J.y1+J.h/2}),E.push(G),C.push(Y);for(var ue=oe.length-1;ue>=0;ue--)E.splice(oe[ue],1),C.splice(oe[ue],1),D.splice(oe[ue],1)}}E.forEach(function(Te,q){w.eles=Te,L.push(y(w,C[q])),d.relocateComponent(D[q],L[q],w)})}else E.forEach(function(Te,q){d.relocateComponent(D[q],C[q],w)});var re=new Set;if(E.length>1){var ee=[],Z=A.filter(function(Te){return Te.css("display")=="none"});E.forEach(function(Te,q){var Ve=void 0;if(w.quality=="draft"&&(Ve=C[q].nodeIndexes),Te.nodes().not(Z).length>0){var pe={};pe.edges=[],pe.nodes=[];var Be=void 0;Te.nodes().not(Z).forEach(function(Ye){if(w.quality=="draft")if(!Ye.isParent())Be=Ve.get(Ye.id()),pe.nodes.push({x:C[q].xCoords[Be]-Ye.boundingbox().w/2,y:C[q].yCoords[Be]-Ye.boundingbox().h/2,width:Ye.boundingbox().w,height:Ye.boundingbox().h});else{var He=d.calcBoundingBox(Ye,C[q].xCoords,C[q].yCoords,Ve);pe.nodes.push({x:He.topLeftX,y:He.topLeftY,width:He.width,height:He.height})}else L[q][Ye.id()]&&pe.nodes.push({x:L[q][Ye.id()].getLeft(),y:L[q][Ye.id()].getTop(),width:L[q][Ye.id()].getWidth(),height:L[q][Ye.id()].getHeight()})}),Te.edges().forEach(function(Ye){var He=Ye.source(),Le=Ye.target();if(He.css("display")!="none"&&Le.css("display")!="none")if(w.quality=="draft"){var Ie=Ve.get(He.id()),Ne=Ve.get(Le.id()),Ce=[],Fe=[];if(He.isParent()){var fe=d.calcBoundingBox(He,C[q].xCoords,C[q].yCoords,Ve);Ce.push(fe.topLeftX+fe.width/2),Ce.push(fe.topLeftY+fe.height/2)}else Ce.push(C[q].xCoords[Ie]),Ce.push(C[q].yCoords[Ie]);if(Le.isParent()){var xe=d.calcBoundingBox(Le,C[q].xCoords,C[q].yCoords,Ve);Fe.push(xe.topLeftX+xe.width/2),Fe.push(xe.topLeftY+xe.height/2)}else Fe.push(C[q].xCoords[Ne]),Fe.push(C[q].yCoords[Ne]);pe.edges.push({startX:Ce[0],startY:Ce[1],endX:Fe[0],endY:Fe[1]})}else L[q][He.id()]&&L[q][Le.id()]&&pe.edges.push({startX:L[q][He.id()].getCenterX(),startY:L[q][He.id()].getCenterY(),endX:L[q][Le.id()].getCenterX(),endY:L[q][Le.id()].getCenterY()})}),pe.nodes.length>0&&(ee.push(pe),re.add(q))}});var K=O.packComponents(ee,w.randomize).shifts;if(w.quality=="draft")C.forEach(function(Te,q){var Ve=Te.xCoords.map(function(Be){return Be+K[q].dx}),pe=Te.yCoords.map(function(Be){return Be+K[q].dy});Te.xCoords=Ve,Te.yCoords=pe});else{var ae=0;re.forEach(function(Te){Object.keys(L[Te]).forEach(function(q){var Ve=L[Te][q];Ve.setCenter(Ve.getCenterX()+K[ae].dx,Ve.getCenterY()+K[ae].dy)}),ae++})}}}else{var P=w.eles.boundingBox();if(D.push({x:P.x1+P.w/2,y:P.y1+P.h/2}),w.randomize){var B=m(w);C.push(B)}w.quality=="default"||w.quality=="proof"?(L.push(y(w,C[0])),d.relocateComponent(D[0],L[0],w)):d.relocateComponent(D[0],C[0],w)}var Q=o(function(q,Ve){if(w.quality=="default"||w.quality=="proof"){typeof q=="number"&&(q=Ve);var pe=void 0,Be=void 0,Ye=q.data("id");return L.forEach(function(Le){Ye in Le&&(pe={x:Le[Ye].getRect().getCenterX(),y:Le[Ye].getRect().getCenterY()},Be=Le[Ye])}),w.nodeDimensionsIncludeLabels&&(Be.labelWidth&&(Be.labelPosHorizontal=="left"?pe.x+=Be.labelWidth/2:Be.labelPosHorizontal=="right"&&(pe.x-=Be.labelWidth/2)),Be.labelHeight&&(Be.labelPosVertical=="top"?pe.y+=Be.labelHeight/2:Be.labelPosVertical=="bottom"&&(pe.y-=Be.labelHeight/2))),pe==null&&(pe={x:q.position("x"),y:q.position("y")}),{x:pe.x,y:pe.y}}else{var He=void 0;return C.forEach(function(Le){var Ie=Le.nodeIndexes.get(q.id());Ie!=null&&(He={x:Le.xCoords[Ie],y:Le.yCoords[Ie]})}),He==null&&(He={x:q.position("x"),y:q.position("y")}),{x:He.x,y:He.y}}},"getPositions");if(w.quality=="default"||w.quality=="proof"||w.randomize){var de=d.calcParentsWithoutChildren(k,A),ne=A.filter(function(Te){return Te.css("display")=="none"});w.eles=A.not(ne),A.nodes().not(":parent").not(ne).layoutPositions(S,w,Q),de.length>0&&de.forEach(function(Te){Te.position(Q(Te))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),b})();a.exports=x}),657:((a,s,l)=>{var u=l(548),h=l(140).layoutBase.Matrix,f=l(140).layoutBase.SVD,d=o(function(m){var g=m.cy,y=m.eles,v=y.nodes(),x=y.nodes(":parent"),b=new Map,T=new Map,S=new Map,w=[],k=[],A=[],C=[],R=[],I=[],L=[],E=[],D=void 0,_=void 0,O=1e8,M=1e-9,P=m.piTol,B=m.samplingType,F=m.nodeSeparation,G=void 0,$=o(function(){for(var he=0,z=0,se=!1;z=ke;){ye=le[ke++];for(var We=w[ye],Oe=0;Oeze&&(ze=R[Ue],Ke=Ue)}return Ke},"BFS"),j=o(function(he){var z=void 0;if(he){z=Math.floor(Math.random()*_),D=z;for(var le=0;le<_;le++)R[le]=O;for(var ke=0;ke=1)break;ze=_e}for(var We=0;We<_;We++)ke[We]=se[We];for(Re=0,ze=M;;){Re++;for(var Oe=0;Oe<_;Oe++)ve[Oe]=le[Oe];if(ve=h.minusOp(ve,h.multCons(ke,h.dotProduct(ke,ve))),le=h.multGamma(h.multL(h.multGamma(ve),I,E)),z=h.dotProduct(ve,le),le=h.normalize(le),_e=h.dotProduct(ve,le),Ke=Math.abs(_e/ze),Ke<=1+P&&Ke>=1)break;ze=_e}for(var et=0;et<_;et++)ve[et]=le[et];k=h.multCons(ke,Math.sqrt(Math.abs(he))),A=h.multCons(ve,Math.sqrt(Math.abs(z)))},"powerIteration");u.connectComponents(g,y,u.getTopMostNodes(v),b),x.forEach(function(W){u.connectComponents(g,y,u.getTopMostNodes(W.descendants().intersection(y)),b)});for(var oe=0,J=0;J0&&(z.isParent()?w[he].push(S.get(z.id())):w[he].push(z.id()))})});var de=o(function(he){var z=T.get(he),se=void 0;b.get(he).forEach(function(le){g.getElementById(le).isParent()?se=S.get(le):se=le,w[z].push(se),w[T.get(se)].push(he)})},"_loop"),ne=!0,Te=!1,q=void 0;try{for(var Ve=b.keys()[Symbol.iterator](),pe;!(ne=(pe=Ve.next()).done);ne=!0){var Be=pe.value;de(Be)}}catch(W){Te=!0,q=W}finally{try{!ne&&Ve.return&&Ve.return()}finally{if(Te)throw q}}_=T.size;var Ye=void 0;if(_>2){G=_{var u=l(212),h=o(function(d){d&&d("layout","fcose",u)},"register");typeof cytoscape<"u"&&h(cytoscape),a.exports=h}),140:(a=>{a.exports=t})},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(579);return i})()})});var xy,m0,Iz=N(()=>{"use strict";nc();xy=o(t=>`${t}`,"wrapIcon"),m0={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:xy('')},server:{body:xy('')},disk:{body:xy('')},internet:{body:xy('')},cloud:{body:xy('')},unknown:AA,blank:{body:xy("")}}}});var N4e,M4e,I4e,O4e,P4e=N(()=>{"use strict";Xt();zo();nc();gr();Iz();PC();tr();N4e=o(async function(t,e,r){let n=r.getConfigField("padding"),i=r.getConfigField("iconSize"),a=i/2,s=i/6,l=s/2;await Promise.all(e.edges().map(async u=>{let{source:h,sourceDir:f,sourceArrow:d,sourceGroup:p,target:m,targetDir:g,targetArrow:y,targetGroup:v,label:x}=OC(u),{x:b,y:T}=u[0].sourceEndpoint(),{x:S,y:w}=u[0].midpoint(),{x:k,y:A}=u[0].targetEndpoint(),C=n+4;if(p&&(Ya(f)?b+=f==="L"?-C:C:T+=f==="T"?-C:C+18),v&&(Ya(g)?k+=g==="L"?-C:C:A+=g==="T"?-C:C+18),!p&&r.getNode(h)?.type==="junction"&&(Ya(f)?b+=f==="L"?a:-a:T+=f==="T"?a:-a),!v&&r.getNode(m)?.type==="junction"&&(Ya(g)?k+=g==="L"?a:-a:A+=g==="T"?a:-a),u[0]._private.rscratch){let R=t.insert("g");if(R.insert("path").attr("d",`M ${b},${T} L ${S},${w} L${k},${A} `).attr("class","edge").attr("id",xc(h,m,{prefix:"L"})),d){let I=Ya(f)?N4[f](b,s):b-l,L=nu(f)?N4[f](T,s):T-l;R.insert("polygon").attr("points",Sz[f](s)).attr("transform",`translate(${I},${L})`).attr("class","arrow")}if(y){let I=Ya(g)?N4[g](k,s):k-l,L=nu(g)?N4[g](A,s):A-l;R.insert("polygon").attr("points",Sz[g](s)).attr("transform",`translate(${I},${L})`).attr("class","arrow")}if(x){let I=M4(f,g)?"XY":Ya(f)?"X":"Y",L=0;I==="X"?L=Math.abs(b-k):I==="Y"?L=Math.abs(T-A)/1.5:L=Math.abs(b-k)/2;let E=R.append("g");if(await di(E,x,{useHtmlLabels:!1,width:L,classes:"architecture-service-label"},ge()),E.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),I==="X")E.attr("transform","translate("+S+", "+w+")");else if(I==="Y")E.attr("transform","translate("+S+", "+w+") rotate(-90)");else if(I==="XY"){let D=I4(f,g);if(D&&w4e(D)){let _=E.node().getBoundingClientRect(),[O,M]=E4e(D);E.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*O*M*45})`);let P=E.node().getBoundingClientRect();E.attr("transform",` + translate(${S}, ${w-_.height/2}) + translate(${O*P.width/2}, ${M*P.height/2}) + rotate(${-1*O*M*45}, 0, ${_.height/2}) + `)}}}}}))},"drawEdges"),M4e=o(async function(t,e,r){let i=r.getConfigField("padding")*.75,a=r.getConfigField("fontSize"),l=r.getConfigField("iconSize")/2;await Promise.all(e.nodes().map(async u=>{let h=td(u);if(h.type==="group"){let{h:f,w:d,x1:p,y1:m}=u.boundingBox(),g=t.append("rect");g.attr("id",`group-${h.id}`).attr("x",p+l).attr("y",m+l).attr("width",d).attr("height",f).attr("class","node-bkg");let y=t.append("g"),v=p,x=m;if(h.icon){let b=y.append("g");b.html(`${await _s(h.icon,{height:i,width:i,fallbackPrefix:m0.prefix})}`),b.attr("transform","translate("+(v+l+1)+", "+(x+l+1)+")"),v+=i,x+=a/2-1-2}if(h.label){let b=y.append("g");await di(b,h.label,{useHtmlLabels:!1,width:d,classes:"architecture-service-label"},ge()),b.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),b.attr("transform","translate("+(v+l+4)+", "+(x+l+2)+")")}r.setElementForId(h.id,g)}}))},"drawGroups"),I4e=o(async function(t,e,r){let n=ge();for(let i of r){let a=e.append("g"),s=t.getConfigField("iconSize");if(i.title){let f=a.append("g");await di(f,i.title,{useHtmlLabels:!1,width:s*1.5,classes:"architecture-service-label"},n),f.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),f.attr("transform","translate("+s/2+", "+s+")")}let l=a.append("g");if(i.icon)l.html(`${await _s(i.icon,{height:s,width:s,fallbackPrefix:m0.prefix})}`);else if(i.iconText){l.html(`${await _s("blank",{height:s,width:s,fallbackPrefix:m0.prefix})}`);let p=l.append("g").append("foreignObject").attr("width",s).attr("height",s).append("div").attr("class","node-icon-text").attr("style",`height: ${s}px;`).append("div").html(sr(i.iconText,n)),m=parseInt(window.getComputedStyle(p.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;p.attr("style",`-webkit-line-clamp: ${Math.floor((s-2)/m)};`)}else l.append("path").attr("class","node-bkg").attr("id","node-"+i.id).attr("d",`M0 ${s} v${-s} q0,-5 5,-5 h${s} q5,0 5,5 v${s} H0 Z`);a.attr("id",`service-${i.id}`).attr("class","architecture-service");let{width:u,height:h}=a.node().getBBox();i.width=u,i.height=h,t.setElementForId(i.id,a)}return 0},"drawServices"),O4e=o(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=t.getConfigField("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:l,height:u}=i._groups[0][0].getBBox();i.width=l,i.height=u,t.setElementForId(n.id,i)})},"drawJunctions")});function Dit(t,e,r){t.forEach(n=>{e.add({group:"nodes",data:{type:"service",id:n.id,icon:n.icon,label:n.title,parent:n.in,width:r.getConfigField("iconSize"),height:r.getConfigField("iconSize")},classes:"node-service"})})}function Lit(t,e,r){t.forEach(n=>{e.add({group:"nodes",data:{type:"junction",id:n.id,parent:n.in,width:r.getConfigField("iconSize"),height:r.getConfigField("iconSize")},classes:"node-junction"})})}function Rit(t,e){e.nodes().map(r=>{let n=td(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function Nit(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function Mit(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:l,lhsDir:u,rhsDir:h,rhsGroup:f,title:d}=r,p=M4(r.lhsDir,r.rhsDir)?"segments":"straight",m={id:`${n}-${i}`,label:d,source:n,sourceDir:u,sourceArrow:a,sourceGroup:s,sourceEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%",target:i,targetDir:h,targetArrow:l,targetGroup:f,targetEndpoint:h==="L"?"0 50%":h==="R"?"100% 50%":h==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:m,classes:p})})}function Iit(t,e,r){let n=o((l,u)=>Object.entries(l).reduce((h,[f,d])=>{let p=0,m=Object.entries(d);if(m.length===1)return h[f]=m[0][1],h;for(let g=0;g{let u={},h={};return Object.entries(l).forEach(([f,[d,p]])=>{let m=t.getNode(f)?.in??"default";u[p]??={},u[p][m]??=[],u[p][m].push(f),h[d]??={},h[d][m]??=[],h[d][m].push(f)}),{horiz:Object.values(n(u,"horizontal")).filter(f=>f.length>1),vert:Object.values(n(h,"vertical")).filter(f=>f.length>1)}}),[a,s]=i.reduce(([l,u],{horiz:h,vert:f})=>[[...l,...h],[...u,...f]],[[],[]]);return{horizontal:a,vertical:s}}function Oit(t,e){let r=[],n=o(a=>`${a[0]},${a[1]}`,"posToStr"),i=o(a=>a.split(",").map(s=>parseInt(s)),"strToPos");return t.forEach(a=>{let s=Object.fromEntries(Object.entries(a).map(([f,d])=>[n(d),f])),l=[n([0,0])],u={},h={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;l.length>0;){let f=l.shift();if(f){u[f]=1;let d=s[f];if(d){let p=i(f);Object.entries(h).forEach(([m,g])=>{let y=n([p[0]+g[0],p[1]+g[1]]),v=s[y];v&&!u[y]&&(l.push(y),r.push({[Ez[m]]:v,[Ez[T4e(m)]]:d,gap:1.5*e.getConfigField("iconSize")}))})}}}}),r}function Pit(t,e,r,n,i,{spatialMaps:a,groupAlignments:s}){return new Promise(l=>{let u=qe("body").append("div").attr("id","cy").attr("style","display:none"),h=Ko({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${i.getConfigField("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${i.getConfigField("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});u.remove(),Nit(r,h),Dit(t,h,i),Lit(e,h,i),Mit(n,h);let f=Iit(i,a,s),d=Oit(a,i),p=h.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(m){let[g,y]=m.connectedNodes(),{parent:v}=td(g),{parent:x}=td(y);return v===x?1.5*i.getConfigField("iconSize"):.5*i.getConfigField("iconSize")},edgeElasticity(m){let[g,y]=m.connectedNodes(),{parent:v}=td(g),{parent:x}=td(y);return v===x?.45:.001},alignmentConstraint:f,relativePlacementConstraint:d});p.one("layoutstop",()=>{function m(g,y,v,x){let b,T,{x:S,y:w}=g,{x:k,y:A}=y;T=(x-w+(S-v)*(w-A)/(S-k))/Math.sqrt(1+Math.pow((w-A)/(S-k),2)),b=Math.sqrt(Math.pow(x-w,2)+Math.pow(v-S,2)-Math.pow(T,2));let C=Math.sqrt(Math.pow(k-S,2)+Math.pow(A-w,2));b=b/C;let R=(k-S)*(x-w)-(A-w)*(v-S);switch(!0){case R>=0:R=1;break;case R<0:R=-1;break}let I=(k-S)*(v-S)+(A-w)*(x-w);switch(!0){case I>=0:I=1;break;case I<0:I=-1;break}return T=Math.abs(T)*R,b=b*I,{distances:T,weights:b}}o(m,"getSegmentWeights"),h.startBatch();for(let g of Object.values(h.edges()))if(g.data?.()){let{x:y,y:v}=g.source().position(),{x,y:b}=g.target().position();if(y!==x&&v!==b){let T=g.sourceEndpoint(),S=g.targetEndpoint(),{sourceDir:w}=OC(g),[k,A]=nu(w)?[T.x,S.y]:[S.x,T.y],{weights:C,distances:R}=m(T,S,k,A);g.style("segment-distances",R),g.style("segment-weights",C)}}h.endBatch(),p.run()}),p.run(),h.ready(m=>{X.info("Ready",m),l(h)})})}var B4e,Bit,F4e,$4e=N(()=>{"use strict";II();B4e=ja(R4e(),1);yr();pt();nc();tu();Ei();Iz();PC();P4e();O3([{name:m0.prefix,icons:m0}]);Ko.use(B4e.default);o(Dit,"addServices");o(Lit,"addJunctions");o(Rit,"positionNodes");o(Nit,"addGroups");o(Mit,"addEdges");o(Iit,"getAlignments");o(Oit,"getRelativeConstraints");o(Pit,"layoutArchitecture");Bit=o(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),l=i.getGroups(),u=i.getEdges(),h=i.getDataStructures(),f=aa(e),d=f.append("g");d.attr("class","architecture-edges");let p=f.append("g");p.attr("class","architecture-services");let m=f.append("g");m.attr("class","architecture-groups"),await I4e(i,p,a),O4e(i,p,s);let g=await Pit(a,s,l,u,i,h);await N4e(d,g,i),await M4e(m,g,i),Rit(i,g),ic(void 0,f,i.getConfigField("padding"),i.getConfigField("useMaxWidth"))},"draw"),F4e={draw:Bit}});var z4e={};dr(z4e,{diagram:()=>Fit});var Fit,G4e=N(()=>{"use strict";_4e();Az();L4e();$4e();Fit={parser:_z,get db(){return new vy},renderer:F4e,styles:D4e}});var by,Oz=N(()=>{"use strict";La();qn();tr();$t();ci();by=class{constructor(){this.nodes=[];this.levels=new Map;this.outerNodes=[];this.classes=new Map;this.setAccTitle=Rr;this.getAccTitle=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Pr;this.getAccDescription=Or;this.setAccDescription=Ir}static{o(this,"TreeMapDB")}getNodes(){return this.nodes}getConfig(){let e=ur,r=Qt();return Vn({...e.treemap,...r.treemap??{}})}addNode(e,r){this.nodes.push(e),this.levels.set(e,r),r===0&&(this.outerNodes.push(e),this.root??=e)}getRoot(){return{name:"",children:this.outerNodes}}addClass(e,r){let n=this.classes.get(e)??{id:e,styles:[],textStyles:[]},i=r.replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");i&&i.forEach(a=>{_2(a)&&(n?.textStyles?n.textStyles.push(a):n.textStyles=[a]),n?.styles?n.styles.push(a):n.styles=[a]}),this.classes.set(e,n)}getClasses(){return this.classes}getStylesForClass(e){return this.classes.get(e)?.styles??[]}clear(){Sr(),this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.root=void 0}}});function H4e(t){if(!t.length)return[];let e=[],r=[];return t.forEach(n=>{let i={name:n.name,children:n.type==="Leaf"?void 0:[]};for(i.classSelector=n?.classSelector,n?.cssCompiledStyles&&(i.cssCompiledStyles=[n.cssCompiledStyles]),n.type==="Leaf"&&n.value!==void 0&&(i.value=n.value);r.length>0&&r[r.length-1].level>=n.level;)r.pop();if(r.length===0)e.push(i);else{let a=r[r.length-1].node;a.children?a.children.push(i):a.children=[i]}n.type!=="Leaf"&&r.push({node:i,level:n.level})}),e}var q4e=N(()=>{"use strict";o(H4e,"buildHierarchy")});var Vit,Uit,Pz,W4e=N(()=>{"use strict";Uf();pt();r0();q4e();Oz();Vit=o((t,e)=>{nl(t,e);let r=[];for(let a of t.TreemapRows??[])a.$type==="ClassDefStatement"&&e.addClass(a.className??"",a.styleText??"");for(let a of t.TreemapRows??[]){let s=a.item;if(!s)continue;let l=a.indent?parseInt(a.indent):0,u=Uit(s),h=s.classSelector?e.getStylesForClass(s.classSelector):[],f=h.length>0?h.join(";"):void 0,d={level:l,name:u,type:s.$type,value:s.value,classSelector:s.classSelector,cssCompiledStyles:f};r.push(d)}let n=H4e(r),i=o((a,s)=>{for(let l of a)e.addNode(l,s),l.children&&l.children.length>0&&i(l.children,s+1)},"addNodesRecursively");i(n,0)},"populate"),Uit=o(t=>t.name?String(t.name):"","getItemName"),Pz={parser:{yy:void 0},parse:o(async t=>{try{let r=await bs("treemap",t);X.debug("Treemap AST:",r);let n=Pz.parser?.yy;if(!(n instanceof by))throw new Error("parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");Vit(r,n)}catch(e){throw X.error("Error parsing treemap:",e),e}},"parse")}});var Hit,Ty,F4,qit,Wit,Y4e,X4e=N(()=>{"use strict";tu();Mf();Ei();yr();$t();qn();pt();Hit=10,Ty=10,F4=25,qit=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),s=a.padding??Hit,l=i.getDiagramTitle(),u=i.getRoot(),{themeVariables:h}=Qt();if(!u)return;let f=l?30:0,d=aa(e),p=a.nodeWidth?a.nodeWidth*Ty:960,m=a.nodeHeight?a.nodeHeight*Ty:500,g=p,y=m+f;d.attr("viewBox",`0 0 ${g} ${y}`),mn(d,y,g,a.useMaxWidth);let v;try{let _=a.valueFormat||",";if(_==="$0,0")v=o(O=>"$"+cc(",")(O),"valueFormat");else if(_.startsWith("$")&&_.includes(",")){let O=/\.\d+/.exec(_),M=O?O[0]:"";v=o(P=>"$"+cc(","+M)(P),"valueFormat")}else if(_.startsWith("$")){let O=_.substring(1);v=o(M=>"$"+cc(O||"")(M),"valueFormat")}else v=cc(_)}catch(_){X.error("Error creating format function:",_),v=cc(",")}let x=no().range(["transparent",h.cScale0,h.cScale1,h.cScale2,h.cScale3,h.cScale4,h.cScale5,h.cScale6,h.cScale7,h.cScale8,h.cScale9,h.cScale10,h.cScale11]),b=no().range(["transparent",h.cScalePeer0,h.cScalePeer1,h.cScalePeer2,h.cScalePeer3,h.cScalePeer4,h.cScalePeer5,h.cScalePeer6,h.cScalePeer7,h.cScalePeer8,h.cScalePeer9,h.cScalePeer10,h.cScalePeer11]),T=no().range([h.cScaleLabel0,h.cScaleLabel1,h.cScaleLabel2,h.cScaleLabel3,h.cScaleLabel4,h.cScaleLabel5,h.cScaleLabel6,h.cScaleLabel7,h.cScaleLabel8,h.cScaleLabel9,h.cScaleLabel10,h.cScaleLabel11]);l&&d.append("text").attr("x",g/2).attr("y",f/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(l);let S=d.append("g").attr("transform",`translate(0, ${f})`).attr("class","treemapContainer"),w=U0(u).sum(_=>_.value??0).sort((_,O)=>(O.value??0)-(_.value??0)),A=R5().size([p,m]).paddingTop(_=>_.children&&_.children.length>0?F4+Ty:0).paddingInner(s).paddingLeft(_=>_.children&&_.children.length>0?Ty:0).paddingRight(_=>_.children&&_.children.length>0?Ty:0).paddingBottom(_=>_.children&&_.children.length>0?Ty:0).round(!0)(w),C=A.descendants().filter(_=>_.children&&_.children.length>0),R=S.selectAll(".treemapSection").data(C).enter().append("g").attr("class","treemapSection").attr("transform",_=>`translate(${_.x0},${_.y0})`);R.append("rect").attr("width",_=>_.x1-_.x0).attr("height",F4).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",_=>_.depth===0?"display: none;":""),R.append("clipPath").attr("id",(_,O)=>`clip-section-${e}-${O}`).append("rect").attr("width",_=>Math.max(0,_.x1-_.x0-12)).attr("height",F4),R.append("rect").attr("width",_=>_.x1-_.x0).attr("height",_=>_.y1-_.y0).attr("class",(_,O)=>`treemapSection section${O}`).attr("fill",_=>x(_.data.name)).attr("fill-opacity",.6).attr("stroke",_=>b(_.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",_=>{if(_.depth===0)return"display: none;";let O=je({cssCompiledStyles:_.data.cssCompiledStyles});return O.nodeStyles+";"+O.borderStyles.join(";")}),R.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",F4/2).attr("dominant-baseline","middle").text(_=>_.depth===0?"":_.data.name).attr("font-weight","bold").attr("style",_=>{if(_.depth===0)return"display: none;";let O="dominant-baseline: middle; font-size: 12px; fill:"+T(_.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",M=je({cssCompiledStyles:_.data.cssCompiledStyles});return O+M.labelStyles.replace("color:","fill:")}).each(function(_){if(_.depth===0)return;let O=qe(this),M=_.data.name;O.text(M);let P=_.x1-_.x0,B=6,F;a.showValues!==!1&&_.value?F=P-10-30-10-B:F=P-B-6;let $=Math.max(15,F),U=O.node();if(U.getComputedTextLength()>$){let Y=M;for(;Y.length>0;){if(Y=M.substring(0,Y.length-1),Y.length===0){O.text("..."),U.getComputedTextLength()>$&&O.text("");break}if(O.text(Y+"..."),U.getComputedTextLength()<=$)break}}}),a.showValues!==!1&&R.append("text").attr("class","treemapSectionValue").attr("x",_=>_.x1-_.x0-10).attr("y",F4/2).attr("text-anchor","end").attr("dominant-baseline","middle").text(_=>_.value?v(_.value):"").attr("font-style","italic").attr("style",_=>{if(_.depth===0)return"display: none;";let O="text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+T(_.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",M=je({cssCompiledStyles:_.data.cssCompiledStyles});return O+M.labelStyles.replace("color:","fill:")});let I=A.leaves(),L=S.selectAll(".treemapLeafGroup").data(I).enter().append("g").attr("class",(_,O)=>`treemapNode treemapLeafGroup leaf${O}${_.data.classSelector?` ${_.data.classSelector}`:""}x`).attr("transform",_=>`translate(${_.x0},${_.y0})`);L.append("rect").attr("width",_=>_.x1-_.x0).attr("height",_=>_.y1-_.y0).attr("class","treemapLeaf").attr("fill",_=>_.parent?x(_.parent.data.name):x(_.data.name)).attr("style",_=>je({cssCompiledStyles:_.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",_=>_.parent?x(_.parent.data.name):x(_.data.name)).attr("stroke-width",3),L.append("clipPath").attr("id",(_,O)=>`clip-${e}-${O}`).append("rect").attr("width",_=>Math.max(0,_.x1-_.x0-4)).attr("height",_=>Math.max(0,_.y1-_.y0-4)),L.append("text").attr("class","treemapLabel").attr("x",_=>(_.x1-_.x0)/2).attr("y",_=>(_.y1-_.y0)/2).attr("style",_=>{let O="text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+T(_.data.name)+";",M=je({cssCompiledStyles:_.data.cssCompiledStyles});return O+M.labelStyles.replace("color:","fill:")}).attr("clip-path",(_,O)=>`url(#clip-${e}-${O})`).text(_=>_.data.name).each(function(_){let O=qe(this),M=_.x1-_.x0,P=_.y1-_.y0,B=O.node(),F=4,G=M-2*F,$=P-2*F;if(G<10||$<10){O.style("display","none");return}let U=parseInt(O.style("font-size"),10),j=8,te=28,Y=.6,oe=6,J=2;for(;B.getComputedTextLength()>G&&U>j;)U--,O.style("font-size",`${U}px`);let ue=Math.max(oe,Math.min(te,Math.round(U*Y))),re=U+J+ue;for(;re>$&&U>j&&(U--,ue=Math.max(oe,Math.min(te,Math.round(U*Y))),!(ue$;O.style("font-size",`${U}px`),(B.getComputedTextLength()>G||U(O.x1-O.x0)/2).attr("y",function(O){return(O.y1-O.y0)/2}).attr("style",O=>{let M="text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+T(O.data.name)+";",P=je({cssCompiledStyles:O.data.cssCompiledStyles});return M+P.labelStyles.replace("color:","fill:")}).attr("clip-path",(O,M)=>`url(#clip-${e}-${M})`).text(O=>O.value?v(O.value):"").each(function(O){let M=qe(this),P=this.parentNode;if(!P){M.style("display","none");return}let B=qe(P).select(".treemapLabel");if(B.empty()||B.style("display")==="none"){M.style("display","none");return}let F=parseFloat(B.style("font-size")),G=28,$=.6,U=6,j=2,te=Math.max(U,Math.min(G,Math.round(F*$)));M.style("font-size",`${te}px`);let oe=(O.y1-O.y0)/2+F/2+j;M.attr("y",oe);let J=O.x1-O.x0,ee=O.y1-O.y0-4,Z=J-8;M.node().getComputedTextLength()>Z||oe+te>ee||te{"use strict";tr();Yit={sectionStrokeColor:"black",sectionStrokeWidth:"1",sectionFillColor:"#efefef",leafStrokeColor:"black",leafStrokeWidth:"1",leafFillColor:"#efefef",labelColor:"black",labelFontSize:"12px",valueFontSize:"10px",valueColor:"black",titleColor:"black",titleFontSize:"14px"},Xit=o(({treemap:t}={})=>{let e=Vn(Yit,t);return` + .treemapNode.section { + stroke: ${e.sectionStrokeColor}; + stroke-width: ${e.sectionStrokeWidth}; + fill: ${e.sectionFillColor}; + } + .treemapNode.leaf { + stroke: ${e.leafStrokeColor}; + stroke-width: ${e.leafStrokeWidth}; + fill: ${e.leafFillColor}; + } + .treemapLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .treemapValue { + fill: ${e.valueColor}; + font-size: ${e.valueFontSize}; + } + .treemapTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + `},"getStyles"),j4e=Xit});var Q4e={};dr(Q4e,{diagram:()=>jit});var jit,Z4e=N(()=>{"use strict";Oz();W4e();X4e();K4e();jit={parser:Pz,get db(){return new by},renderer:Y4e,styles:j4e}});var Oat={};dr(Oat,{default:()=>Iat});nc();_A();vd();var O_e=o(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),P_e=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(NQ(),RQ));return{id:"c4",diagram:t}},"loader"),B_e={id:"c4",detector:O_e,loader:P_e},MQ=B_e;var yfe="flowchart",rWe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),nWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(AE(),CE));return{id:yfe,diagram:t}},"loader"),iWe={id:yfe,detector:rWe,loader:nWe},vfe=iWe;var xfe="flowchart-v2",aWe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),sWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(AE(),CE));return{id:xfe,diagram:t}},"loader"),oWe={id:xfe,detector:aWe,loader:sWe},bfe=oWe;var fWe=o(t=>/^\s*erDiagram/.test(t),"detector"),dWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(_fe(),Afe));return{id:"er",diagram:t}},"loader"),pWe={id:"er",detector:fWe,loader:dWe},Dfe=pWe;var Pge="gitGraph",HKe=o(t=>/^\s*gitGraph/.test(t),"detector"),qKe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Oge(),Ige));return{id:Pge,diagram:t}},"loader"),WKe={id:Pge,detector:HKe,loader:qKe},Bge=WKe;var d1e="gantt",MQe=o(t=>/^\s*gantt/.test(t),"detector"),IQe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(f1e(),h1e));return{id:d1e,diagram:t}},"loader"),OQe={id:d1e,detector:MQe,loader:IQe},p1e=OQe;var k1e="info",GQe=o(t=>/^\s*info/.test(t),"detector"),VQe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(w1e(),T1e));return{id:k1e,diagram:t}},"loader"),E1e={id:k1e,detector:GQe,loader:VQe};var tZe=o(t=>/^\s*pie/.test(t),"detector"),rZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(M1e(),N1e));return{id:"pie",diagram:t}},"loader"),I1e={id:"pie",detector:tZe,loader:rZe};var Y1e="quadrantChart",bZe=o(t=>/^\s*quadrantChart/.test(t),"detector"),TZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(W1e(),q1e));return{id:Y1e,diagram:t}},"loader"),wZe={id:Y1e,detector:bZe,loader:TZe},X1e=wZe;var Tye="xychart",$Ze=o(t=>/^\s*xychart(-beta)?/.test(t),"detector"),zZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bye(),xye));return{id:Tye,diagram:t}},"loader"),GZe={id:Tye,detector:$Ze,loader:zZe},wye=GZe;var Rye="requirement",qZe=o(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),WZe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Lye(),Dye));return{id:Rye,diagram:t}},"loader"),YZe={id:Rye,detector:qZe,loader:WZe},Nye=YZe;var Xye="sequence",IJe=o(t=>/^\s*sequenceDiagram/.test(t),"detector"),OJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Yye(),Wye));return{id:Xye,diagram:t}},"loader"),PJe={id:Xye,detector:IJe,loader:OJe},jye=PJe;var tve="class",VJe=o((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),UJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(eve(),Jye));return{id:tve,diagram:t}},"loader"),HJe={id:tve,detector:VJe,loader:UJe},rve=HJe;var ave="classDiagram",WJe=o((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),YJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ive(),nve));return{id:ave,diagram:t}},"loader"),XJe={id:ave,detector:WJe,loader:YJe},sve=XJe;var Fve="state",Tet=o((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),wet=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Bve(),Pve));return{id:Fve,diagram:t}},"loader"),ket={id:Fve,detector:Tet,loader:wet},$ve=ket;var Vve="stateDiagram",Cet=o((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),Aet=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Gve(),zve));return{id:Vve,diagram:t}},"loader"),_et={id:Vve,detector:Cet,loader:Aet},Uve=_et;var a2e="journey",jet=o(t=>/^\s*journey/.test(t),"detector"),Ket=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(i2e(),n2e));return{id:a2e,diagram:t}},"loader"),Qet={id:a2e,detector:jet,loader:Ket},s2e=Qet;pt();tu();Ei();var Zet=o((t,e,r)=>{X.debug(`rendering svg for syntax error +`);let n=aa(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),mn(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),O$={draw:Zet},o2e=O$;var Jet={db:{},renderer:O$,parser:{parse:o(()=>{},"parse")}},l2e=Jet;var c2e="flowchart-elk",ett=o((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*(flowchart|graph)/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),ttt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(AE(),CE));return{id:c2e,diagram:t}},"loader"),rtt={id:c2e,detector:ett,loader:ttt},u2e=rtt;var P2e="timeline",Ttt=o(t=>/^\s*timeline/.test(t),"detector"),wtt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(O2e(),I2e));return{id:P2e,diagram:t}},"loader"),ktt={id:P2e,detector:Ttt,loader:wtt},B2e=ktt;var J2e="mindmap",Rtt=o(t=>/^\s*mindmap/.test(t),"detector"),Ntt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Z2e(),Q2e));return{id:J2e,diagram:t}},"loader"),Mtt={id:J2e,detector:Rtt,loader:Ntt},exe=Mtt;var fxe="kanban",jtt=o(t=>/^\s*kanban/.test(t),"detector"),Ktt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(hxe(),uxe));return{id:fxe,diagram:t}},"loader"),Qtt={id:fxe,detector:jtt,loader:Ktt},dxe=Qtt;var Xxe="sankey",brt=o(t=>/^\s*sankey(-beta)?/.test(t),"detector"),Trt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Yxe(),Wxe));return{id:Xxe,diagram:t}},"loader"),wrt={id:Xxe,detector:brt,loader:Trt},jxe=wrt;var nbe="packet",Rrt=o(t=>/^\s*packet(-beta)?/.test(t),"detector"),Nrt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(rbe(),tbe));return{id:nbe,diagram:t}},"loader"),ibe={id:nbe,detector:Rrt,loader:Nrt};var mbe="radar",ent=o(t=>/^\s*radar-beta/.test(t),"detector"),tnt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(pbe(),dbe));return{id:mbe,diagram:t}},"loader"),gbe={id:mbe,detector:ent,loader:tnt};var x4e="block",wit=o(t=>/^\s*block(-beta)?/.test(t),"detector"),kit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(v4e(),y4e));return{id:x4e,diagram:t}},"loader"),Eit={id:x4e,detector:wit,loader:kit},b4e=Eit;var V4e="architecture",$it=o(t=>/^\s*architecture/.test(t),"detector"),zit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(G4e(),z4e));return{id:V4e,diagram:t}},"loader"),Git={id:V4e,detector:$it,loader:zit},U4e=Git;vd();Xt();var J4e="treemap",Kit=o(t=>/^\s*treemap/.test(t),"detector"),Qit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Z4e(),Q4e));return{id:J4e,diagram:t}},"loader"),e3e={id:J4e,detector:Kit,loader:Qit};var t3e=!1,wy=o(()=>{t3e||(t3e=!0,xd("error",l2e,t=>t.toLowerCase().trim()==="error"),xd("---",{db:{clear:o(()=>{},"clear")},styles:{},renderer:{draw:o(()=>{},"draw")},parser:{parse:o(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:o(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),ev(u2e,exe,U4e),ev(MQ,dxe,sve,rve,Dfe,p1e,E1e,I1e,Nye,jye,bfe,vfe,B2e,Bge,Uve,$ve,s2e,X1e,jxe,ibe,wye,b4e,gbe,e3e))},"addDiagrams");pt();vd();Xt();var r3e=o(async()=>{X.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(gu).map(async([r,{detector:n,loader:i}])=>{if(i)try{av(r)}catch{try{let{diagram:a,id:s}=await i();xd(s,a,n)}catch(a){throw X.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete gu[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){X.error(`Failed to load ${e.length} external diagrams`);for(let r of e)X.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams");pt();yr();var BC="comm",FC="rule",$C="decl";var n3e="@import";var i3e="@namespace",a3e="@keyframes";var s3e="@layer";var Bz=Math.abs,$4=String.fromCharCode;function zC(t){return t.trim()}o(zC,"trim");function z4(t,e,r){return t.replace(e,r)}o(z4,"replace");function o3e(t,e,r){return t.indexOf(e,r)}o(o3e,"indexof");function rd(t,e){return t.charCodeAt(e)|0}o(rd,"charat");function nd(t,e,r){return t.slice(e,r)}o(nd,"substr");function wo(t){return t.length}o(wo,"strlen");function l3e(t){return t.length}o(l3e,"sizeof");function ky(t,e){return e.push(t),t}o(ky,"append");var GC=1,Ey=1,c3e=0,ll=0,Ri=0,Cy="";function VC(t,e,r,n,i,a,s,l){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:GC,column:Ey,length:s,return:"",siblings:l}}o(VC,"node");function u3e(){return Ri}o(u3e,"char");function h3e(){return Ri=ll>0?rd(Cy,--ll):0,Ey--,Ri===10&&(Ey=1,GC--),Ri}o(h3e,"prev");function cl(){return Ri=ll2||Sy(Ri)>3?"":" "}o(p3e,"whitespace");function m3e(t,e){for(;--e&&cl()&&!(Ri<48||Ri>102||Ri>57&&Ri<65||Ri>70&&Ri<97););return UC(t,G4()+(e<6&&uh()==32&&cl()==32))}o(m3e,"escaping");function Fz(t){for(;cl();)switch(Ri){case t:return ll;case 34:case 39:t!==34&&t!==39&&Fz(Ri);break;case 40:t===41&&Fz(t);break;case 92:cl();break}return ll}o(Fz,"delimiter");function g3e(t,e){for(;cl()&&t+Ri!==57;)if(t+Ri===84&&uh()===47)break;return"/*"+UC(e,ll-1)+"*"+$4(t===47?t:cl())}o(g3e,"commenter");function y3e(t){for(;!Sy(uh());)cl();return UC(t,ll)}o(y3e,"identifier");function b3e(t){return d3e(qC("",null,null,null,[""],t=f3e(t),0,[0],t))}o(b3e,"compile");function qC(t,e,r,n,i,a,s,l,u){for(var h=0,f=0,d=s,p=0,m=0,g=0,y=1,v=1,x=1,b=0,T="",S=i,w=a,k=n,A=T;v;)switch(g=b,b=cl()){case 40:if(g!=108&&rd(A,d-1)==58){o3e(A+=z4(HC(b),"&","&\f"),"&\f",Bz(h?l[h-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:A+=HC(b);break;case 9:case 10:case 13:case 32:A+=p3e(g);break;case 92:A+=m3e(G4()-1,7);continue;case 47:switch(uh()){case 42:case 47:ky(Zit(g3e(cl(),G4()),e,r,u),u),(Sy(g||1)==5||Sy(uh()||1)==5)&&wo(A)&&nd(A,-1,void 0)!==" "&&(A+=" ");break;default:A+="/"}break;case 123*y:l[h++]=wo(A)*x;case 125*y:case 59:case 0:switch(b){case 0:case 125:v=0;case 59+f:x==-1&&(A=z4(A,/\f/g,"")),m>0&&(wo(A)-d||y===0&&g===47)&&ky(m>32?x3e(A+";",n,r,d-1,u):x3e(z4(A," ","")+";",n,r,d-2,u),u);break;case 59:A+=";";default:if(ky(k=v3e(A,e,r,h,f,i,l,T,S=[],w=[],d,a),a),b===123)if(f===0)qC(A,e,k,k,S,a,d,l,w);else{switch(p){case 99:if(rd(A,3)===110)break;case 108:if(rd(A,2)===97)break;default:f=0;case 100:case 109:case 115:}f?qC(t,k,k,n&&ky(v3e(t,k,k,0,0,i,l,T,i,S=[],d,w),w),i,w,d,l,n?S:w):qC(A,k,k,k,[""],w,0,l,w)}}h=f=m=0,y=x=1,T=A="",d=s;break;case 58:d=1+wo(A),m=g;default:if(y<1){if(b==123)--y;else if(b==125&&y++==0&&h3e()==125)continue}switch(A+=$4(b),b*y){case 38:x=f>0?1:(A+="\f",-1);break;case 44:l[h++]=(wo(A)-1)*x,x=1;break;case 64:uh()===45&&(A+=HC(cl())),p=uh(),f=d=wo(T=A+=y3e(G4())),b++;break;case 45:g===45&&wo(A)==2&&(y=0)}}return a}o(qC,"parse");function v3e(t,e,r,n,i,a,s,l,u,h,f,d){for(var p=i-1,m=i===0?a:[""],g=l3e(m),y=0,v=0,x=0;y0?m[b]+" "+T:z4(T,/&\f/g,m[b])))&&(u[x++]=S);return VC(t,e,r,i===0?FC:l,u,h,f,d)}o(v3e,"ruleset");function Zit(t,e,r,n){return VC(t,e,r,BC,$4(u3e()),nd(t,2,-2),0,n)}o(Zit,"comment");function x3e(t,e,r,n,i){return VC(t,e,r,$C,nd(t,0,n),nd(t,n+1,-1),n,i)}o(x3e,"declaration");function WC(t,e){for(var r="",n=0;n{E3e.forEach(t=>{t()}),E3e=[]},"attachFunctions");pt();var C3e=o(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");F3();w2();function A3e(t){let e=t.match(B3);if(!e)return{text:t,metadata:{}};let r=Kh(e[1],{schema:jh})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}o(A3e,"extractFrontMatter");tr();var eat=o(t=>t.replace(/\r\n?/g,` +`).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),tat=o(t=>{let{text:e,metadata:r}=A3e(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),rat=o(t=>{let e=qt.detectInit(t)??{},r=qt.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:bQ(t),directive:e}},"processDirectives");function $z(t){let e=eat(t),r=tat(e),n=rat(r.text),i=Vn(r.config,n.directive);return t=C3e(n.text),{code:t,title:r.title,config:i}}o($z,"preprocessDiagram");NA();e3();tr();function _3e(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}o(_3e,"toBase64");var nat=5e4,iat="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",aat="sandbox",sat="loose",oat="http://www.w3.org/2000/svg",lat="http://www.w3.org/1999/xlink",cat="http://www.w3.org/1999/xhtml",uat="100%",hat="100%",fat="border:0;margin:0;",dat="margin:0",pat="allow-top-navigation-by-user-activation allow-popups",mat='The "iframe" tag is not supported by your browser.',gat=["foreignobject"],yat=["dominant-baseline"];function N3e(t){let e=$z(t);return By(),ZG(e.config??{}),e}o(N3e,"processAndSetConfigs");async function vat(t,e){wy();try{let{code:r,config:n}=N3e(t);return{diagramType:(await M3e(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}o(vat,"parse");var D3e=o((t,e,r=[])=>` +.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),xat=o((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` +${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` +:root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` +:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(l=>{mr(l.styles)||s.forEach(u=>{r+=D3e(l.id,u,l.styles)}),mr(l.textStyles)||(r+=D3e(l.id,"tspan",(l?.textStyles||[]).map(u=>u.replace("color","fill"))))})}return r},"createCssStyles"),bat=o((t,e,r,n)=>{let i=xat(t,r),a=aH(e,i,t.themeVariables);return WC(b3e(`${n}{${a}}`),T3e)},"createUserStyles"),Tat=o((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=Ji(n),n=n.replace(/
      /g,"
      "),n},"cleanUpSvgCode"),wat=o((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":hat,n=_3e(`${t}`);return``},"putIntoIFrame"),L3e=o((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",oat);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function R3e(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}o(R3e,"sandboxedIframe");var kat=o((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),Eat=o(async function(t,e,r){wy();let n=N3e(e);e=n.code;let i=Qt();X.debug(i),e.length>(i?.maxTextSize??nat)&&(e=iat);let a="#"+t,s="i"+t,l="#"+s,u="d"+t,h="#"+u,f=o(()=>{let D=qe(p?l:h).node();D&&"remove"in D&&D.remove()},"removeTempElements"),d=qe("body"),p=i.securityLevel===aat,m=i.securityLevel===sat,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),p){let E=R3e(qe(r),s);d=qe(E.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=qe(r);L3e(d,t,u,`font-family: ${g}`,lat)}else{if(kat(document,t,u,s),p){let E=R3e(qe("body"),s);d=qe(E.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=qe("body");L3e(d,t,u)}let y,v;try{y=await Ay.fromText(e,{title:n.title})}catch(E){if(i.suppressErrorRendering)throw f(),E;y=await Ay.fromText("error"),v=E}let x=d.select(h).node(),b=y.type,T=x.firstChild,S=T.firstChild,w=y.renderer.getClasses?.(e,y),k=bat(i,b,w,a),A=document.createElement("style");A.innerHTML=k,T.insertBefore(A,S);try{await y.renderer.draw(e,t,g4.version,y)}catch(E){throw i.suppressErrorRendering?f():o2e.draw(e,t,g4.version),E}let C=d.select(`${h} svg`),R=y.db.getAccTitle?.(),I=y.db.getAccDescription?.();Cat(b,C,R,I),d.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",cat);let L=d.select(h).node().innerHTML;if(X.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),L=Tat(L,p,vr(i.arrowMarkerAbsolute)),p){let E=d.select(h+" svg").node();L=wat(L,E)}else m||(L=yh.sanitize(L,{ADD_TAGS:gat,ADD_ATTR:yat,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(S3e(),v)throw v;return f(),{diagramType:b,svg:L,bindFunctions:y.db.bindFunctions}},"render");function Sat(t={}){let e=Rn({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),jG(e),e?.theme&&e.theme in So?e.themeVariables=So[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=So.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?C7(e):A7();Dy(r.logLevel),wy()}o(Sat,"initialize");var M3e=o((t,e={})=>{let{code:r}=$z(t);return Ay.fromText(r,e)},"getDiagramFromText");function Cat(t,e,r,n){w3e(e,t),k3e(e,r,n,e.attr("id"))}o(Cat,"addA11yInfo");var id=Object.freeze({render:Eat,parse:vat,getDiagramFromText:M3e,initialize:Sat,getConfig:Qt,setConfig:n3,getSiteConfig:A7,updateSiteConfig:KG,reset:o(()=>{By()},"reset"),globalReset:o(()=>{By(gh)},"globalReset"),defaultConfig:gh});Dy(Qt().logLevel);By(Qt());Nf();tr();var Aat=o((t,e,r)=>{X.warn(t),qL(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),I3e=o(async function(t={querySelector:".mermaid"}){try{await _at(t)}catch(e){if(qL(e)&&X.error(e.str),hh.parseError&&hh.parseError(e),!t.suppressErrors)throw X.error("Use the suppressErrors option to suppress these errors"),e}},"run"),_at=o(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=id.getConfig();X.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");X.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(X.debug("Start On Load: "+n?.startOnLoad),id.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new qt.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,l=[];for(let u of Array.from(i)){X.info("Rendering diagram: "+u.id);if(u.getAttribute("data-processed"))continue;u.setAttribute("data-processed","true");let h=`mermaid-${a.next()}`;s=u.innerHTML,s=P3(qt.entityDecode(s)).trim().replace(//gi,"
      ");let f=qt.detectInit(s);f&&X.debug("Detected early reinit: ",f);try{let{svg:d,bindFunctions:p}=await F3e(h,s,u);u.innerHTML=d,t&&await t(h),p&&p(u)}catch(d){Aat(d,l,hh.parseError)}}if(l.length>0)throw l[0]},"runThrowsErrors"),O3e=o(function(t){id.initialize(t)},"initialize"),Dat=o(async function(t,e,r){X.warn("mermaid.init is deprecated. Please use run instead."),t&&O3e(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await I3e(n)},"init"),Lat=o(async(t,{lazyLoad:e=!0}={})=>{wy(),ev(...t),e===!1&&await r3e()},"registerExternalDiagrams"),P3e=o(function(){if(hh.startOnLoad){let{startOnLoad:t}=id.getConfig();t&&hh.run().catch(e=>X.error("Mermaid failed to initialize",e))}},"contentLoaded");if(typeof document<"u"){window.addEventListener("load",P3e,!1)}var Rat=o(function(t){hh.parseError=t},"setParseErrorHandler"),YC=[],zz=!1,B3e=o(async()=>{if(!zz){for(zz=!0;YC.length>0;){let t=YC.shift();if(t)try{await t()}catch(e){X.error("Error executing queue",e)}}zz=!1}},"executeQueue"),Nat=o(async(t,e)=>new Promise((r,n)=>{let i=o(()=>new Promise((a,s)=>{id.parse(t,e).then(l=>{a(l),r(l)},l=>{X.error("Error parsing",l),hh.parseError?.(l),s(l),n(l)})}),"performCall");YC.push(i),B3e().catch(n)}),"parse"),F3e=o((t,e,r)=>new Promise((n,i)=>{let a=o(()=>new Promise((s,l)=>{id.render(t,e,r).then(u=>{s(u),n(u)},u=>{X.error("Error parsing",u),hh.parseError?.(u),l(u),i(u)})}),"performCall");YC.push(a),B3e().catch(i)}),"render"),Mat=o(()=>Object.keys(gu).map(t=>({id:t})),"getRegisteredDiagramsMetadata"),hh={startOnLoad:!0,mermaidAPI:id,parse:Nat,render:F3e,init:Dat,run:I3e,registerExternalDiagrams:Lat,registerLayoutLoaders:zI,initialize:O3e,parseError:void 0,contentLoaded:P3e,setParseErrorHandler:Rat,detectType:_0,registerIconPacks:O3,getRegisteredDiagramsMetadata:Mat},Iat=hh;return Y3e(Oat);})(); +/*! Check if previously processed */ +/*! + * Wait for document loaded before starting the execution + */ +/*! Bundled license information: + +dompurify/dist/purify.es.mjs: + (*! @license DOMPurify 3.2.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.6/LICENSE *) + +js-yaml/dist/js-yaml.mjs: + (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) + +lodash-es/lodash.js: + (** + * @license + * Lodash (Custom Build) + * Build: `lodash modularize exports="es" -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + *) + +cytoscape/dist/cytoscape.esm.mjs: + (*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + *) + (*! + Event object based on jQuery events, MIT license + + https://jquery.org/license/ + https://tldrlegal.com/license/mit-license + https://github.com/jquery/jquery/blob/master/src/event.js + *) + (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) + (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) +*/ +globalThis["mermaid"] = globalThis.__esbuild_esm_mermaid_nm["mermaid"].default; diff --git a/jsonschema/custom-gcl.jsonschema.json b/jsonschema/custom-gcl.jsonschema.json new file mode 100644 index 000000000000..71ea3e98df65 --- /dev/null +++ b/jsonschema/custom-gcl.jsonschema.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$ref": "#/$defs/Configuration", + "$defs": { + "Configuration": { + "properties": { + "version": { + "type": "string", + "description": "golangci-lint version." + }, + "name": { + "type": "string", + "description": "Name of the binary." + }, + "destination": { + "type": "string", + "description": "Destination is the path to a directory to store the binary." + }, + "plugins": { + "items": { + "$ref": "#/$defs/Plugin" + }, + "type": "array", + "description": "Plugins information." + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "version" + ], + "description": "Configuration represents the configuration file." + }, + "Plugin": { + "oneOf": [ + { + "required": [ + "version" + ], + "title": "version" + }, + { + "required": [ + "path" + ], + "title": "path" + } + ], + "properties": { + "module": { + "type": "string", + "description": "Module name." + }, + "import": { + "type": "string", + "description": "Import to use." + }, + "version": { + "type": "string", + "description": "Version of the module.\nOnly for module available through a Go proxy." + }, + "path": { + "type": "string", + "description": "Path to the local module.\nOnly for local module." + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "module" + ], + "description": "Plugin represents information about a plugin." + } + }, + "description": "mygcl configuration definition file" +} \ No newline at end of file diff --git a/jsonschema/golangci.jsonschema.json b/jsonschema/golangci.jsonschema.json new file mode 100644 index 000000000000..f471fd3dadff --- /dev/null +++ b/jsonschema/golangci.jsonschema.json @@ -0,0 +1,5081 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "godoclint-rules": { + "enum": [ + "pkg-doc", + "single-pkg-doc", + "require-pkg-doc", + "start-with-name", + "require-doc", + "deprecated", + "max-len", + "no-unused-link" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "enforce-switch-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "identical-ifelseif-branches", + "identical-ifelseif-conditions", + "identical-switch-branches", + "identical-switch-conditions", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "package-directory-mismatch", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unsecure-url-scheme", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "use-waitgroup-go", + "useless-break", + "useless-fallthrough", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godoclint", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "iotamixing", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "empty-line": { + "description": "Checks that there is an empty space between the embedded fields and regular fields.", + "type": "boolean", + "default": false + }, + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + }, + "allow-empty": { + "description": "Allows empty structures, effectively excluding them from the check.", + "type": "boolean", + "default": false + }, + "allow-empty-rx": { + "description": "List of regular expressions to match type names that should be allowed to be empty.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-empty-returns": { + "description": "Allows empty structures in return statements.", + "type": "boolean", + "default": false + }, + "allow-empty-declarations": { + "description": "Allows empty structures in variable declarations.", + "type": "boolean", + "default": false + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + }, + "force-assertion-description": { + "description": "Force adding assertion descriptions to gomega matchers.", + "type": "boolean", + "default": false + }, + "force-tonot": { + "description": "Force using `ToNot`, `ShouldNot` instead of `To(Not())`.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godoclintSettings": { + "type": "object", + "properties": { + "default": { + "type": "string", + "enum": ["all", "basic", "none"], + "default": "basic", + "description": "Default set of rules to enable." + }, + "enable": { + "description": "List of rules to enable in addition to the default set.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "disable": { + "description": "List of rules to disable.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "options": { + "type": "object", + "description": "A map for setting individual rule options.", + "properties": { + "max-len": { + "type": "object", + "properties": { + "length": { + "type": "integer", + "description": "Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.", + "default": 77 + } + } + }, + "require-doc": { + "type": "object", + "properties": { + "ignore-exported": { + "type": "boolean", + "description": "Ignore exported (public) symbols when applying the `require-doc` rule.", + "default": false + }, + "ignore-unexported": { + "type": "boolean", + "description": "Ignore unexported (private) symbols when applying the `require-doc` rule.", + "default": true + } + } + }, + "start-with-name": { + "type": "object", + "properties": { + "include-unexported": { + "type": "boolean", + "description": "Include unexported symbols when applying the `start-with-name` rule.", + "default": false + } + } + } + } + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ineffassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-escaping-errors": { + "description": "Check escaping variables of type error, may cause false positives.", + "type": "boolean", + "default": false + } + } + }, + "iotamixingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-individual": { + "description": "Whether to report individual consts rather than just the const block.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unqueryvetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-sql-builders": { + "description": "Enable SQL builder checking.", + "type": "boolean", + "default": true + }, + "allowed-patterns": { + "description": "Regex patterns for acceptable SELECT * usage.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godoclint": { + "$ref": "#/definitions/settings/definitions/godoclintSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ineffassign": { + "$ref": "#/definitions/settings/definitions/ineffassignSettings" + }, + "iotamixing": { + "$ref": "#/definitions/settings/definitions/iotamixingSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unqueryvet": { + "$ref": "#/definitions/settings/definitions/unqueryvetSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.next.jsonschema.json b/jsonschema/golangci.next.jsonschema.json new file mode 100644 index 000000000000..a2cf0fd963d0 --- /dev/null +++ b/jsonschema/golangci.next.jsonschema.json @@ -0,0 +1,5136 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupOption", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr", + "zeroByteRepeat" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "godoclint-rules": { + "enum": [ + "pkg-doc", + "single-pkg-doc", + "require-pkg-doc", + "start-with-name", + "require-doc", + "deprecated", + "max-len", + "no-unused-link" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "enforce-switch-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "identical-ifelseif-branches", + "identical-ifelseif-conditions", + "identical-switch-branches", + "identical-switch-conditions", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "package-directory-mismatch", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unsecure-url-scheme", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "use-waitgroup-go", + "useless-break", + "useless-fallthrough", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "modernize-analyzers": { + "enum": [ + "any", + "bloop", + "fmtappendf", + "forvar", + "mapsloop", + "minmax", + "newexpr", + "omitzero", + "rangeint", + "reflecttypefor", + "slicescontains", + "slicessort", + "stditerators", + "stringscutprefix", + "stringsseq", + "stringsbuilder", + "testingcontext", + "waitgroup" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godoclint", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "iotamixing", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "modernize", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + }, + "comments-only": { + "description": "Checks only comments, skip strings.", + "type": "boolean", + "default": false + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "empty-line": { + "description": "Checks that there is an empty space between the embedded fields and regular fields.", + "type": "boolean", + "default": false + }, + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + }, + "allow-empty": { + "description": "Allows empty structures, effectively excluding them from the check.", + "type": "boolean", + "default": false + }, + "allow-empty-rx": { + "description": "List of regular expressions to match type names that should be allowed to be empty.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-empty-returns": { + "description": "Allows empty structures in return statements.", + "type": "boolean", + "default": false + }, + "allow-empty-declarations": { + "description": "Allows empty structures in variable declarations.", + "type": "boolean", + "default": false + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + }, + "force-assertion-description": { + "description": "Force adding assertion descriptions to gomega matchers.", + "type": "boolean", + "default": false + }, + "force-tonot": { + "description": "Force using `ToNot`, `ShouldNot` instead of `To(Not())`.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godoclintSettings": { + "type": "object", + "properties": { + "default": { + "type": "string", + "enum": ["all", "basic", "none"], + "default": "basic", + "description": "Default set of rules to enable." + }, + "enable": { + "description": "List of rules to enable in addition to the default set.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "disable": { + "description": "List of rules to disable.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "options": { + "type": "object", + "description": "A map for setting individual rule options.", + "properties": { + "max-len": { + "type": "object", + "properties": { + "length": { + "type": "integer", + "description": "Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.", + "default": 77 + } + } + }, + "require-doc": { + "type": "object", + "properties": { + "ignore-exported": { + "type": "boolean", + "description": "Ignore exported (public) symbols when applying the `require-doc` rule.", + "default": false + }, + "ignore-unexported": { + "type": "boolean", + "description": "Ignore unexported (private) symbols when applying the `require-doc` rule.", + "default": true + } + } + }, + "start-with-name": { + "type": "object", + "properties": { + "include-unexported": { + "type": "boolean", + "description": "Include unexported symbols when applying the `start-with-name` rule.", + "default": false + } + } + } + } + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ineffassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-escaping-errors": { + "description": "Check escaping variables of type error, may cause false positives.", + "type": "boolean", + "default": false + } + } + }, + "iotamixingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-individual": { + "description": "Whether to report individual consts rather than just the const block.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "modernizeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable": { + "description": "List of analyzers to disable.", + "type": "array", + "items": { + "$ref": "#/definitions/modernize-analyzers" + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + }, + "concat-loop": { + "description": "Enable/disable optimization of concat loop.", + "type": "boolean", + "default": true + }, + "loop-other-ops": { + "description": "Optimization of `concat-loop` even with other operations.", + "type": "boolean", + "default": false + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unqueryvetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-sql-builders": { + "description": "Enable SQL builder checking.", + "type": "boolean", + "default": true + }, + "allowed-patterns": { + "description": "Regex patterns for acceptable SELECT * usage.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godoclint": { + "$ref": "#/definitions/settings/definitions/godoclintSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ineffassign": { + "$ref": "#/definitions/settings/definitions/ineffassignSettings" + }, + "iotamixing": { + "$ref": "#/definitions/settings/definitions/iotamixingSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "modernize": { + "$ref": "#/definitions/settings/definitions/modernizeSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unqueryvet": { + "$ref": "#/definitions/settings/definitions/unqueryvetSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v1.57.jsonschema.json b/jsonschema/golangci.v1.57.jsonschema.json new file mode 100644 index 000000000000..a97c0d42919a --- /dev/null +++ b/jsonschema/golangci.v1.57.jsonschema.json @@ -0,0 +1,3480 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentedOutCode", + "commentedOutImport", + "commentFormatting", + "defaultCaseOrder", + "deferUnlambda", + "deferInLoop", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringsCompare", + "stringXbytes", + "suspiciousSorting", + "switchTrue", + "syncMapLoadAndDelete", + "timeCmpSimplify", + "timeExprSimplify", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G501", + "G502", + "G503", + "G504", + "G505", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "deadcode", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "execinquery", + "exhaustive", + "exhaustivestruct", + "exhaustruct", + "exportloopref", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "goerr113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "golint", + "gomnd", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "ifshort", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "interfacer", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "maligned", + "mirror", + "misspell", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosnakecase", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "revive", + "rowserrcheck", + "scopelint", + "sloglint", + "sqlclosecheck", + "staticcheck", + "structcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "typecheck", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "varcheck", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "checkstyle", + "code-climate", + "junit-xml", + "github-actions", + "teamcity" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "ignore": { + "description": "DEPRECATED: use `exclude-functions` instead. Comma-separated list of pairs of the form \"pkg:regex\".", + "type": "string", + "default": "fmt:.*" + }, + "exclude": { + "description": "DEPRECATED: use `exclude-functions` instead. Path to a file containing a list of functions to exclude from checking.", + "type": "string", + "examples": ["/path/to/file.txt"] + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print.*$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "DEPRECATED: use 'sections' and 'prefix(github.com/org/project)' instead.", + "type": "string", + "examples": ["github.com/org/project"] + }, + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "lang-version": { + "description": "Select the Go version to target.", + "type": "string", + "default": "1.15" + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": true + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": true + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "go": { + "description": "Targeted Go version", + "type": "string", + "default": "1.13" + }, + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "checked-types": { + "type": "array", + "description": "Order of return types to check.", + "items": { + "enum": ["ptr", "func", "iface", "map", "chan"] + }, + "default": ["ptr", "func", "iface", "map", "chan"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "type": "string", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context-only": { + "description": "Enforce using methods that accept a context.", + "type": "boolean", + "default": false + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "go": { + "description": "Targeted Go version", + "type": "string", + "default": "1.13" + }, + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "go": { + "description": "Targeted Go version", + "type": "string", + "default": "1.13" + }, + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "type": "boolean", + "default": false + } + } + }, + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "go-require", + "float-compare", + "len", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-thelper", + "useless-assert" + ] + } + }, + "disable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "go-require", + "float-compare", + "len", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-thelper", + "useless-assert" + ] + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string" + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for expected variable name.", + "type": "string" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"] + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "os-dev-null": { + "description": "Suggest the use of os.DevNull.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + }, + "syslog-priority": { + "description": "Suggest the use of syslog.Priority.", + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-is-used": { + "description": "", + "type": "boolean", + "default": true + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated-strict": { + "description": "To follow strict Go generated file convention", + "type": "boolean", + "default": false + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.58.jsonschema.json b/jsonschema/golangci.v1.58.jsonschema.json new file mode 100644 index 000000000000..d0bdc8d7b95e --- /dev/null +++ b/jsonschema/golangci.v1.58.jsonschema.json @@ -0,0 +1,3638 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentedOutCode", + "commentedOutImport", + "commentFormatting", + "defaultCaseOrder", + "deferUnlambda", + "deferInLoop", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringsCompare", + "stringXbytes", + "suspiciousSorting", + "switchTrue", + "syncMapLoadAndDelete", + "timeCmpSimplify", + "timeExprSimplify", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G501", + "G502", + "G503", + "G504", + "G505", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "deadcode", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "execinquery", + "exhaustive", + "exhaustivestruct", + "exhaustruct", + "exportloopref", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "golint", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "ifshort", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "interfacer", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "maligned", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosnakecase", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "revive", + "rowserrcheck", + "scopelint", + "sloglint", + "sqlclosecheck", + "staticcheck", + "structcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "typecheck", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "varcheck", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "github-actions", + "teamcity" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print.*$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": true + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": true + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "checked-types": { + "type": "array", + "description": "Order of return types to check.", + "items": { + "enum": ["ptr", "func", "iface", "map", "chan"] + }, + "default": ["ptr", "func", "iface", "map", "chan"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "type": "string", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "type": "boolean", + "default": false + } + } + }, + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "go-require", + "float-compare", + "len", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-thelper", + "useless-assert" + ] + } + }, + "disable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "go-require", + "float-compare", + "len", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-thelper", + "useless-assert" + ] + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string" + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for expected variable name.", + "type": "string" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"] + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-is-used": { + "description": "", + "type": "boolean", + "default": true + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated-strict": { + "description": "To follow strict Go generated file convention", + "type": "boolean", + "default": false + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.59.jsonschema.json b/jsonschema/golangci.v1.59.jsonschema.json new file mode 100644 index 000000000000..cc3e63655bc1 --- /dev/null +++ b/jsonschema/golangci.v1.59.jsonschema.json @@ -0,0 +1,3766 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentedOutCode", + "commentedOutImport", + "commentFormatting", + "defaultCaseOrder", + "deferUnlambda", + "deferInLoop", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringsCompare", + "stringXbytes", + "suspiciousSorting", + "switchTrue", + "syncMapLoadAndDelete", + "timeCmpSimplify", + "timeExprSimplify", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G501", + "G502", + "G503", + "G504", + "G505", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range", + "range-val-address", + "range-val-in-closure", + "receiver-naming", + "redefines-builtin-id", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "deadcode", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "execinquery", + "exhaustive", + "exhaustivestruct", + "exhaustruct", + "exportloopref", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "golint", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "ifshort", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "interfacer", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "maligned", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosnakecase", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "revive", + "rowserrcheck", + "scopelint", + "sloglint", + "sqlclosecheck", + "staticcheck", + "structcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "typecheck", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "varcheck", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print.*$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": true + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": true + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["ptr", "func", "iface", "map", "chan", "uintptr", "unsafeptr"] + }, + "default": ["ptr", "func", "iface", "map", "chan", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-is-used": { + "description": "", + "type": "boolean", + "default": true + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.60.jsonschema.json b/jsonschema/golangci.v1.60.jsonschema.json new file mode 100644 index 000000000000..b8920ae06f94 --- /dev/null +++ b/jsonschema/golangci.v1.60.jsonschema.json @@ -0,0 +1,3792 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentedOutCode", + "commentedOutImport", + "commentFormatting", + "defaultCaseOrder", + "deferUnlambda", + "deferInLoop", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringsCompare", + "stringXbytes", + "suspiciousSorting", + "switchTrue", + "syncMapLoadAndDelete", + "timeCmpSimplify", + "timeExprSimplify", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range", + "range-val-address", + "range-val-in-closure", + "receiver-naming", + "redefines-builtin-id", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "deadcode", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "execinquery", + "exhaustive", + "exhaustivestruct", + "exhaustruct", + "exportloopref", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "golint", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "ifshort", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "interfacer", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "maligned", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosnakecase", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "revive", + "rowserrcheck", + "scopelint", + "sloglint", + "sqlclosecheck", + "staticcheck", + "structcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "typecheck", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "varcheck", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print.*$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": true + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": true + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["ptr", "func", "iface", "map", "chan", "uintptr", "unsafeptr"] + }, + "default": ["ptr", "func", "iface", "map", "chan", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "float-compare", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions if format string is used.", + "type": "boolean", + "default": false + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.61.jsonschema.json b/jsonschema/golangci.v1.61.jsonschema.json new file mode 100644 index 000000000000..a574b0195bca --- /dev/null +++ b/jsonschema/golangci.v1.61.jsonschema.json @@ -0,0 +1,3797 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentedOutCode", + "commentedOutImport", + "commentFormatting", + "defaultCaseOrder", + "deferUnlambda", + "deferInLoop", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringsCompare", + "stringXbytes", + "suspiciousSorting", + "switchTrue", + "syncMapLoadAndDelete", + "timeCmpSimplify", + "timeExprSimplify", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range", + "range-val-address", + "range-val-in-closure", + "receiver-naming", + "redefines-builtin-id", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "deadcode", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "execinquery", + "exhaustive", + "exhaustivestruct", + "exhaustruct", + "exportloopref", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "golint", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "ifshort", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "interfacer", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "maligned", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosnakecase", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "revive", + "rowserrcheck", + "scopelint", + "sloglint", + "sqlclosecheck", + "staticcheck", + "structcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "varcheck", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "junit-xml-extended", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print(ln)?$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": true + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": true + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["ptr", "func", "iface", "map", "chan", "uintptr", "unsafeptr"] + }, + "default": ["ptr", "func", "iface", "map", "chan", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "float-compare", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "empty", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions if format string is used.", + "type": "boolean", + "default": false + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.62.jsonschema.json b/jsonschema/golangci.v1.62.jsonschema.json new file mode 100644 index 000000000000..3ca3593b2600 --- /dev/null +++ b/jsonschema/golangci.v1.62.jsonschema.json @@ -0,0 +1,3860 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range", + "range-val-address", + "range-val-in-closure", + "receiver-naming", + "redefines-builtin-id", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exportloopref", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "junit-xml-extended", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print(ln)?$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtype": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": false + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "iface": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.63.jsonschema.json b/jsonschema/golangci.v1.63.jsonschema.json new file mode 100644 index 000000000000..c54dd6904d13 --- /dev/null +++ b/jsonschema/golangci.v1.63.jsonschema.json @@ -0,0 +1,4082 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range", + "range-val-address", + "range-val-in-closure", + "receiver-naming", + "redefines-builtin-id", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque" + ] + }, + "tagliatelle-cases": { + "enum": [ + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exportloopref", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "junit-xml-extended", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print(ln)?$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtype": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "iface": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetesting": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": true + }, + "context-todo": { + "type": "boolean", + "default": true + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": false + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.64.jsonschema.json b/jsonschema/golangci.v1.64.jsonschema.json new file mode 100644 index 000000000000..b265c1a8233c --- /dev/null +++ b/jsonschema/golangci.v1.64.jsonschema.json @@ -0,0 +1,4224 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "junit-xml-extended", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "fatcontext": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print(ln)?$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtype": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "iface": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetesting": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": true + }, + "context-todo": { + "type": "boolean", + "default": true + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "lax" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "default": { + "type": "array", + "items": { + "enum": [ + "comments", + "stdErrorHandling", + "commonFalsePositives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "enum": [ + "EXC0001", + "EXC0002", + "EXC0003", + "EXC0004", + "EXC0005", + "EXC0006", + "EXC0007", + "EXC0008", + "EXC0009", + "EXC0010", + "EXC0011", + "EXC0012", + "EXC0013", + "EXC0014", + "EXC0015" + ] + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v1.jsonschema.json b/jsonschema/golangci.v1.jsonschema.json new file mode 100644 index 000000000000..b265c1a8233c --- /dev/null +++ b/jsonschema/golangci.v1.jsonschema.json @@ -0,0 +1,4224 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "linters": { + "$comment": "anyOf with enum is used to allow auto completion of non-custom linters", + "description": "Linters usable.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "gci", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "gofmt", + "gofumpt", + "goheader", + "goimports", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "tenv", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + } + }, + "type": "object", + "additionalProperties": false, + "properties": { + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "default": "stdout", + "anyOf": [ + { + "enum": [ "stdout", "stderr" ] + }, + { + "type": "string" + } + ] + }, + "format": { + "default": "colored-line-number", + "enum": [ + "colored-line-number", + "line-number", + "json", + "colored-tab", + "tab", + "html", + "checkstyle", + "code-climate", + "junit-xml", + "junit-xml-extended", + "github-actions", + "teamcity", + "sarif" + ] + } + }, + "required": ["format"] + } + }, + "print-issued-lines": { + "description": "Print lines of code with issue.", + "type": "boolean", + "default": true + }, + "print-linter-name": { + "description": "Print linter name in the end of issue text.", + "type": "boolean", + "default": true + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": false + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + }, + "sort-results": { + "description": "Sort results by: filepath, line and column.", + "type": "boolean", + "default": true + } + } + }, + "linters-settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalint": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + }, + "ignore-test": { + "description": "Ignore *_test.go files.", + "type": "boolean", + "default": false + } + } + }, + "bidichk": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclop": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-tests": { + "description": "Should the linter execute on test files as well", + "type": "boolean", + "default": false + }, + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorder": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsled": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "dupl": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjson": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustive": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "check-generated": { + "description": "Check switch statements in generated files", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustruct": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "fatcontext": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigo": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "examples": ["^print(ln)?$"], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "p": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + ] + } + } + } + }, + "funlen": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": false + } + } + }, + "gci": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "skip-generated": { + "description": "Skip generated files.", + "type": "boolean", + "default": true + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtype": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognit": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconst": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocritic": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocyclo": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godot": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godox": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmt": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "interfacebloat": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumpt": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheader": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimports": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a comma-separated list of prefixes.", + "type": "string", + "examples": ["github.com/org/project"] + } + } + }, + "gomoddirectives": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local_replace_directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosimple": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "gosec": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "exclude-generated": { + "description": "Exclude generated files", + "type": "boolean", + "default": false + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitan": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-tests": { + "description": "Ignore test files.", + "type": "boolean", + "default": false + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govet": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouper": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "iface": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importas": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturn": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lll": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidx": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezero": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspell": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-words": { + "description": "List of words to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttag": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedret": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestif": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnil": { + "type": "object", + "additionalProperties": false, + "properties": { + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturn": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mnd": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlint": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassign": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturns": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltest": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprint": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "prealloc": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclared": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "Comma-separated list of predeclared identifiers to not report on.", + "type": "string" + }, + "q": { + "description": "Include method names and field names (i.e., qualified names) in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinter": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetter": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "revive": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "ignore-generated-header": { + "type": "boolean" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglint": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + } + } + } + }, + "stylecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": ["all"] + }, + { + "type": "string" + } + ] + }, + "default": [ + "all", + "-ST1000", + "-ST1003", + "-ST1016", + "-ST1020", + "-ST1021", + "-ST1022" + ] + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalign": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelle": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "tenv": { + "type": "object", + "additionalProperties": false, + "properties": { + "all": { + "description": "The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.", + "type": "boolean", + "default": false + } + } + }, + "testifylint": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackage": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelper": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvars": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetesting": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": true + }, + "context-todo": { + "type": "boolean", + "default": true + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvert": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparam": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelen": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespace": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreSigRegexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignorePackageGlobs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignoreInterfaceRegexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wsl": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvar": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "custom": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "enable-all": { + "description": "Whether to enable all linters. You can re-disable them with `disable` explicitly.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Whether to disable all linters. You can re-enable them with `enable` explicitly.", + "type": "boolean", + "default": false + }, + "presets": { + "description": "Allow to use different presets of linters", + "type": "array", + "items": { + "enum": [ + "bugs", + "comment", + "complexity", + "error", + "format", + "import", + "metalinter", + "module", + "performance", + "sql", + "style", + "test", + "unused" + ] + } + }, + "fast": { + "description": "Enable run of fast linters.", + "type": "boolean", + "default": false + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "lax" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "default": { + "type": "array", + "items": { + "enum": [ + "comments", + "stdErrorHandling", + "commonFalsePositives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "List of regular expressions of issue texts to exclude.\nBut independently from this option we use default exclude patterns. Their usage can be controlled through `exclude-use-default`.", + "type": "array", + "items": { + "type": "string" + } + }, + "exclude-rules": { + "description": "Exclude configuration per-path, per-linter, per-text and per-source", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + } + } + }, + "exclude-use-default": { + "description": "Independently from option `exclude` we use default exclude patterns. This behavior can be disabled by this option.", + "type": "boolean", + "default": true + }, + "exclude-case-sensitive": { + "description": "If set to true, exclude and exclude-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "exclude-generated": { + "description": "Mode of the generated files analysis.", + "enum": ["lax", "strict", "disable"], + "default": "lax" + }, + "exclude-dirs": { + "description": "Which directories to exclude: issues from them won't be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. The regexp is applied on the full path.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": ["generated.*"] + }, + "default": [], + "examples": [["src/external_libs", "autogenerated_by_my_lib"]] + }, + "exclude-dirs-use-default": { + "description": "Enable exclusion of directories \"vendor\", \"third_party\", \"testdata\", \"examples\", \"Godeps\", and \"builtin\".", + "type": "boolean", + "default": true + }, + "exclude-files": { + "description": "Which files to exclude: they will be analyzed, but issues from them will not be reported.", + "type": "array", + "items": { + "description": "You can use regexp here. There is no need to include all autogenerated files, we confidently recognize them. If that is not the case, please let us know.\n\"/\" will be replaced by current OS file path separator to properly work on Windows.", + "type": "string", + "examples": [".*\\.my\\.go$"] + }, + "default": [], + "examples": [[".*\\.my\\.go$", "lib/bad.go"]] + }, + "include": { + "description": "The list of ids of default excludes to include or disable.", + "type": "array", + "items": { + "enum": [ + "EXC0001", + "EXC0002", + "EXC0003", + "EXC0004", + "EXC0005", + "EXC0006", + "EXC0007", + "EXC0008", + "EXC0009", + "EXC0010", + "EXC0011", + "EXC0012", + "EXC0013", + "EXC0014", + "EXC0015" + ] + }, + "default": [] + }, + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-severity": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "case-sensitive": { + "description": "If set to true, severity-rules regular expressions become case sensitive.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linters" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default-severity"] + } + } +} diff --git a/jsonschema/golangci.v2.0.jsonschema.json b/jsonschema/golangci.v2.0.jsonschema.json new file mode 100644 index 000000000000..437943b5f318 --- /dev/null +++ b/jsonschema/golangci.v2.0.jsonschema.json @@ -0,0 +1,4738 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G113", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-strings": { + "description": "Exclude strings matching the given regular expression", + "type": "string" + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": true + }, + "context-todo": { + "type": "boolean", + "default": true + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v2.1.jsonschema.json b/jsonschema/golangci.v2.1.jsonschema.json new file mode 100644 index 000000000000..0f2ef5fcc50b --- /dev/null +++ b/jsonschema/golangci.v2.1.jsonschema.json @@ -0,0 +1,4790 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": true + }, + "context-todo": { + "type": "boolean", + "default": true + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v2.2.jsonschema.json b/jsonschema/golangci.v2.2.jsonschema.json new file mode 100644 index 000000000000..3e51264fec47 --- /dev/null +++ b/jsonschema/golangci.v2.2.jsonschema.json @@ -0,0 +1,4901 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v2.3.jsonschema.json b/jsonschema/golangci.v2.3.jsonschema.json new file mode 100644 index 000000000000..7c4840521f4a --- /dev/null +++ b/jsonschema/golangci.v2.3.jsonschema.json @@ -0,0 +1,4907 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "enforce-switch-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + }, + "force-assertion-description": { + "description": "Force adding assertion descriptions to gomega matchers.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v2.4.jsonschema.json b/jsonschema/golangci.v2.4.jsonschema.json new file mode 100644 index 000000000000..67cd80a55e98 --- /dev/null +++ b/jsonschema/golangci.v2.4.jsonschema.json @@ -0,0 +1,4929 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "enforce-switch-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "useless-break", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + }, + "allow-empty": { + "description": "Allows empty structures, effectively excluding them from the check.", + "type": "boolean", + "default": false + }, + "allow-empty-rx": { + "description": "List of regular expressions to match type names that should be allowed to be empty.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-empty-returns": { + "description": "Allows empty structures in return statements.", + "type": "boolean", + "default": false + }, + "allow-empty-declarations": { + "description": "Allows empty structures in variable declarations.", + "type": "boolean", + "default": false + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + }, + "force-assertion-description": { + "description": "Force adding assertion descriptions to gomega matchers.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v2.5.jsonschema.json b/jsonschema/golangci.v2.5.jsonschema.json new file mode 100644 index 000000000000..f471fd3dadff --- /dev/null +++ b/jsonschema/golangci.v2.5.jsonschema.json @@ -0,0 +1,5081 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "godoclint-rules": { + "enum": [ + "pkg-doc", + "single-pkg-doc", + "require-pkg-doc", + "start-with-name", + "require-doc", + "deprecated", + "max-len", + "no-unused-link" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "enforce-switch-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "identical-ifelseif-branches", + "identical-ifelseif-conditions", + "identical-switch-branches", + "identical-switch-conditions", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "package-directory-mismatch", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unsecure-url-scheme", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "use-waitgroup-go", + "useless-break", + "useless-fallthrough", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godoclint", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "iotamixing", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "empty-line": { + "description": "Checks that there is an empty space between the embedded fields and regular fields.", + "type": "boolean", + "default": false + }, + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + }, + "allow-empty": { + "description": "Allows empty structures, effectively excluding them from the check.", + "type": "boolean", + "default": false + }, + "allow-empty-rx": { + "description": "List of regular expressions to match type names that should be allowed to be empty.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-empty-returns": { + "description": "Allows empty structures in return statements.", + "type": "boolean", + "default": false + }, + "allow-empty-declarations": { + "description": "Allows empty structures in variable declarations.", + "type": "boolean", + "default": false + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + }, + "force-assertion-description": { + "description": "Force adding assertion descriptions to gomega matchers.", + "type": "boolean", + "default": false + }, + "force-tonot": { + "description": "Force using `ToNot`, `ShouldNot` instead of `To(Not())`.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godoclintSettings": { + "type": "object", + "properties": { + "default": { + "type": "string", + "enum": ["all", "basic", "none"], + "default": "basic", + "description": "Default set of rules to enable." + }, + "enable": { + "description": "List of rules to enable in addition to the default set.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "disable": { + "description": "List of rules to disable.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "options": { + "type": "object", + "description": "A map for setting individual rule options.", + "properties": { + "max-len": { + "type": "object", + "properties": { + "length": { + "type": "integer", + "description": "Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.", + "default": 77 + } + } + }, + "require-doc": { + "type": "object", + "properties": { + "ignore-exported": { + "type": "boolean", + "description": "Ignore exported (public) symbols when applying the `require-doc` rule.", + "default": false + }, + "ignore-unexported": { + "type": "boolean", + "description": "Ignore unexported (private) symbols when applying the `require-doc` rule.", + "default": true + } + } + }, + "start-with-name": { + "type": "object", + "properties": { + "include-unexported": { + "type": "boolean", + "description": "Include unexported symbols when applying the `start-with-name` rule.", + "default": false + } + } + } + } + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ineffassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-escaping-errors": { + "description": "Check escaping variables of type error, may cause false positives.", + "type": "boolean", + "default": false + } + } + }, + "iotamixingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-individual": { + "description": "Whether to report individual consts rather than just the const block.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unqueryvetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-sql-builders": { + "description": "Enable SQL builder checking.", + "type": "boolean", + "default": true + }, + "allowed-patterns": { + "description": "Regex patterns for acceptable SELECT * usage.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godoclint": { + "$ref": "#/definitions/settings/definitions/godoclintSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ineffassign": { + "$ref": "#/definitions/settings/definitions/ineffassignSettings" + }, + "iotamixing": { + "$ref": "#/definitions/settings/definitions/iotamixingSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unqueryvet": { + "$ref": "#/definitions/settings/definitions/unqueryvetSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/jsonschema/golangci.v2.jsonschema.json b/jsonschema/golangci.v2.jsonschema.json new file mode 100644 index 000000000000..f471fd3dadff --- /dev/null +++ b/jsonschema/golangci.v2.jsonschema.json @@ -0,0 +1,5081 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://json.schemastore.org/golangci-lint.json", + "definitions": { + "gocritic-checks": { + "enum": [ + "appendAssign", + "appendCombine", + "argOrder", + "assignOp", + "badCall", + "badCond", + "badLock", + "badRegexp", + "badSorting", + "badSyncOnceFunc", + "boolExprSimplify", + "builtinShadow", + "builtinShadowDecl", + "captLocal", + "caseOrder", + "codegenComment", + "commentFormatting", + "commentedOutCode", + "commentedOutImport", + "defaultCaseOrder", + "deferInLoop", + "deferUnlambda", + "deprecatedComment", + "docStub", + "dupArg", + "dupBranchBody", + "dupCase", + "dupImport", + "dupSubExpr", + "dynamicFmtString", + "elseif", + "emptyDecl", + "emptyFallthrough", + "emptyStringTest", + "equalFold", + "evalOrder", + "exitAfterDefer", + "exposedSyncMutex", + "externalErrorReassign", + "filepathJoin", + "flagDeref", + "flagName", + "hexLiteral", + "httpNoBody", + "hugeParam", + "ifElseChain", + "importShadow", + "indexAlloc", + "initClause", + "ioutilDeprecated", + "mapKey", + "methodExprCall", + "nestingReduce", + "newDeref", + "nilValReturn", + "octalLiteral", + "offBy1", + "paramTypeCombine", + "preferDecodeRune", + "preferFilepathJoin", + "preferFprint", + "preferStringWriter", + "preferWriteByte", + "ptrToRefParam", + "rangeAppendAll", + "rangeExprCopy", + "rangeValCopy", + "redundantSprint", + "regexpMust", + "regexpPattern", + "regexpSimplify", + "returnAfterHttpError", + "ruleguard", + "singleCaseSwitch", + "sliceClear", + "sloppyLen", + "sloppyReassign", + "sloppyTypeAssert", + "sortSlice", + "sprintfQuotedString", + "sqlQuery", + "stringConcatSimplify", + "stringXbytes", + "stringsCompare", + "switchTrue", + "syncMapLoadAndDelete", + "timeExprSimplify", + "todoCommentWithoutDetail", + "tooManyResultsChecker", + "truncateCmp", + "typeAssertChain", + "typeDefFirst", + "typeSwitchVar", + "typeUnparen", + "uncheckedInlineErr", + "underef", + "unlabelStmt", + "unlambda", + "unnamedResult", + "unnecessaryBlock", + "unnecessaryDefer", + "unslice", + "valSwap", + "weakCond", + "whyNoLint", + "wrapperFunc", + "yodaStyleExpr" + ] + }, + "gocritic-tags": { + "enum": [ + "diagnostic", + "style", + "performance", + "experimental", + "opinionated", + "security" + ] + }, + "staticcheck-checks": { + "enum": [ + "*", + "all", + "SA*", + "-SA*", + "SA1*", + "-SA1*", + "SA1000", + "-SA1000", + "SA1001", + "-SA1001", + "SA1002", + "-SA1002", + "SA1003", + "-SA1003", + "SA1004", + "-SA1004", + "SA1005", + "-SA1005", + "SA1006", + "-SA1006", + "SA1007", + "-SA1007", + "SA1008", + "-SA1008", + "SA1010", + "-SA1010", + "SA1011", + "-SA1011", + "SA1012", + "-SA1012", + "SA1013", + "-SA1013", + "SA1014", + "-SA1014", + "SA1015", + "-SA1015", + "SA1016", + "-SA1016", + "SA1017", + "-SA1017", + "SA1018", + "-SA1018", + "SA1019", + "-SA1019", + "SA1020", + "-SA1020", + "SA1021", + "-SA1021", + "SA1023", + "-SA1023", + "SA1024", + "-SA1024", + "SA1025", + "-SA1025", + "SA1026", + "-SA1026", + "SA1027", + "-SA1027", + "SA1028", + "-SA1028", + "SA1029", + "-SA1029", + "SA1030", + "-SA1030", + "SA1031", + "-SA1031", + "SA1032", + "-SA1032", + "SA2*", + "-SA2*", + "SA2000", + "-SA2000", + "SA2001", + "-SA2001", + "SA2002", + "-SA2002", + "SA2003", + "-SA2003", + "SA3*", + "-SA3*", + "SA3000", + "-SA3000", + "SA3001", + "-SA3001", + "SA4*", + "-SA4*", + "SA4000", + "-SA4000", + "SA4001", + "-SA4001", + "SA4003", + "-SA4003", + "SA4004", + "-SA4004", + "SA4005", + "-SA4005", + "SA4006", + "-SA4006", + "SA4008", + "-SA4008", + "SA4009", + "-SA4009", + "SA4010", + "-SA4010", + "SA4011", + "-SA4011", + "SA4012", + "-SA4012", + "SA4013", + "-SA4013", + "SA4014", + "-SA4014", + "SA4015", + "-SA4015", + "SA4016", + "-SA4016", + "SA4017", + "-SA4017", + "SA4018", + "-SA4018", + "SA4019", + "-SA4019", + "SA4020", + "-SA4020", + "SA4021", + "-SA4021", + "SA4022", + "-SA4022", + "SA4023", + "-SA4023", + "SA4024", + "-SA4024", + "SA4025", + "-SA4025", + "SA4026", + "-SA4026", + "SA4027", + "-SA4027", + "SA4028", + "-SA4028", + "SA4029", + "-SA4029", + "SA4030", + "-SA4030", + "SA4031", + "-SA4031", + "SA4032", + "-SA4032", + "SA5*", + "-SA5*", + "SA5000", + "-SA5000", + "SA5001", + "-SA5001", + "SA5002", + "-SA5002", + "SA5003", + "-SA5003", + "SA5004", + "-SA5004", + "SA5005", + "-SA5005", + "SA5007", + "-SA5007", + "SA5008", + "-SA5008", + "SA5009", + "-SA5009", + "SA5010", + "-SA5010", + "SA5011", + "-SA5011", + "SA5012", + "-SA5012", + "SA6*", + "-SA6*", + "SA6000", + "-SA6000", + "SA6001", + "-SA6001", + "SA6002", + "-SA6002", + "SA6003", + "-SA6003", + "SA6005", + "-SA6005", + "SA6006", + "-SA6006", + "SA9*", + "-SA9*", + "SA9001", + "-SA9001", + "SA9002", + "-SA9002", + "SA9003", + "-SA9003", + "SA9004", + "-SA9004", + "SA9005", + "-SA9005", + "SA9006", + "-SA9006", + "SA9007", + "-SA9007", + "SA9008", + "-SA9008", + "SA9009", + "-SA9009", + "ST*", + "-ST*", + "ST1*", + "-ST1*", + "ST1000", + "-ST1000", + "ST1001", + "-ST1001", + "ST1003", + "-ST1003", + "ST1005", + "-ST1005", + "ST1006", + "-ST1006", + "ST1008", + "-ST1008", + "ST1011", + "-ST1011", + "ST1012", + "-ST1012", + "ST1013", + "-ST1013", + "ST1015", + "-ST1015", + "ST1016", + "-ST1016", + "ST1017", + "-ST1017", + "ST1018", + "-ST1018", + "ST1019", + "-ST1019", + "ST1020", + "-ST1020", + "ST1021", + "-ST1021", + "ST1022", + "-ST1022", + "ST1023", + "-ST1023", + "S*", + "-S*", + "S1*", + "-S1*", + "S1000", + "-S1000", + "S1001", + "-S1001", + "S1002", + "-S1002", + "S1003", + "-S1003", + "S1004", + "-S1004", + "S1005", + "-S1005", + "S1006", + "-S1006", + "S1007", + "-S1007", + "S1008", + "-S1008", + "S1009", + "-S1009", + "S1010", + "-S1010", + "S1011", + "-S1011", + "S1012", + "-S1012", + "S1016", + "-S1016", + "S1017", + "-S1017", + "S1018", + "-S1018", + "S1019", + "-S1019", + "S1020", + "-S1020", + "S1021", + "-S1021", + "S1023", + "-S1023", + "S1024", + "-S1024", + "S1025", + "-S1025", + "S1028", + "-S1028", + "S1029", + "-S1029", + "S1030", + "-S1030", + "S1031", + "-S1031", + "S1032", + "-S1032", + "S1033", + "-S1033", + "S1034", + "-S1034", + "S1035", + "-S1035", + "S1036", + "-S1036", + "S1037", + "-S1037", + "S1038", + "-S1038", + "S1039", + "-S1039", + "S1040", + "-S1040", + "QF*", + "-QF*", + "QF1*", + "-QF1*", + "QF1001", + "-QF1001", + "QF1002", + "-QF1002", + "QF1003", + "-QF1003", + "QF1004", + "-QF1004", + "QF1005", + "-QF1005", + "QF1006", + "-QF1006", + "QF1007", + "-QF1007", + "QF1008", + "-QF1008", + "QF1009", + "-QF1009", + "QF1010", + "-QF1010", + "QF1011", + "-QF1011", + "QF1012", + "-QF1012" + ] + }, + "godoclint-rules": { + "enum": [ + "pkg-doc", + "single-pkg-doc", + "require-pkg-doc", + "start-with-name", + "require-doc", + "deprecated", + "max-len", + "no-unused-link" + ] + }, + "gosec-rules": { + "enum": [ + "G101", + "G102", + "G103", + "G104", + "G106", + "G107", + "G108", + "G109", + "G110", + "G111", + "G112", + "G114", + "G115", + "G201", + "G202", + "G203", + "G204", + "G301", + "G302", + "G303", + "G304", + "G305", + "G306", + "G307", + "G401", + "G402", + "G403", + "G404", + "G405", + "G406", + "G501", + "G502", + "G503", + "G504", + "G505", + "G506", + "G507", + "G601", + "G602" + ] + }, + "govet-analyzers": { + "enum": [ + "appends", + "asmdecl", + "assign", + "atomic", + "atomicalign", + "bools", + "buildtag", + "cgocall", + "composites", + "copylocks", + "deepequalerrors", + "defers", + "directive", + "errorsas", + "fieldalignment", + "findcall", + "framepointer", + "hostport", + "httpmux", + "httpresponse", + "ifaceassert", + "loopclosure", + "lostcancel", + "nilfunc", + "nilness", + "printf", + "reflectvaluecompare", + "shadow", + "shift", + "sigchanyzer", + "slog", + "sortslice", + "stdmethods", + "stdversion", + "stringintconv", + "structtag", + "testinggoroutine", + "tests", + "timeformat", + "unmarshal", + "unreachable", + "unsafeptr", + "unusedresult", + "unusedwrite", + "waitgroup" + ] + }, + "revive-rules": { + "enum": [ + "add-constant", + "argument-limit", + "atomic", + "banned-characters", + "bare-return", + "blank-imports", + "bool-literal-in-expr", + "call-to-gc", + "cognitive-complexity", + "comment-spacings", + "comments-density", + "confusing-naming", + "confusing-results", + "constant-logical-expr", + "context-as-argument", + "context-keys-type", + "cyclomatic", + "datarace", + "deep-exit", + "defer", + "dot-imports", + "duplicated-imports", + "early-return", + "empty-block", + "empty-lines", + "enforce-map-style", + "enforce-repeated-arg-type-style", + "enforce-slice-style", + "enforce-switch-style", + "error-naming", + "error-return", + "error-strings", + "errorf", + "exported", + "file-header", + "file-length-limit", + "filename-format", + "flag-parameter", + "function-length", + "function-result-limit", + "get-return", + "identical-branches", + "identical-ifelseif-branches", + "identical-ifelseif-conditions", + "identical-switch-branches", + "identical-switch-conditions", + "if-return", + "import-alias-naming", + "import-shadowing", + "imports-blocklist", + "increment-decrement", + "indent-error-flow", + "line-length-limit", + "max-control-nesting", + "max-public-structs", + "modifies-parameter", + "modifies-value-receiver", + "nested-structs", + "optimize-operands-order", + "package-comments", + "package-directory-mismatch", + "range-val-address", + "range-val-in-closure", + "range", + "receiver-naming", + "redefines-builtin-id", + "redundant-build-tag", + "redundant-import-alias", + "redundant-test-main-exit", + "string-format", + "string-of-int", + "struct-tag", + "superfluous-else", + "time-date", + "time-equal", + "time-naming", + "unchecked-type-assertion", + "unconditional-recursion", + "unexported-naming", + "unexported-return", + "unhandled-error", + "unnecessary-format", + "unnecessary-stmt", + "unreachable-code", + "unsecure-url-scheme", + "unused-parameter", + "unused-receiver", + "use-any", + "use-errors-new", + "use-fmt-print", + "use-waitgroup-go", + "useless-break", + "useless-fallthrough", + "var-declaration", + "var-naming", + "waitgroup-by-value" + ] + }, + "iface-analyzers": { + "enum": [ + "identical", + "unused", + "opaque", + "unexported" + ] + }, + "tagliatelle-cases": { + "enum": [ + "", + "camel", + "pascal", + "kebab", + "snake", + "goCamel", + "goPascal", + "goKebab", + "goSnake", + "upper", + "upperSnake", + "lower", + "header" + ] + }, + "wsl-checks": { + "enum": [ + "assign", + "branch", + "decl", + "defer", + "expr", + "for", + "go", + "if", + "inc-dec", + "label", + "range", + "return", + "select", + "send", + "switch", + "type-switch", + "append", + "assign-exclusive", + "assign-expr", + "err", + "leading-whitespace", + "trailing-whitespace" + ] + }, + "relative-path-modes": { + "enum": [ + "gomod", + "gitroot", + "cfg", + "wd" + ] + }, + "simple-format": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + } + } + }, + "formats-path" : { + "anyOf": [ + { + "enum": [ + "stdout", + "stderr" + ] + }, + { + "type": "string" + } + ] + }, + "linter-names": { + "$comment": "anyOf with enum is used to allow auto-completion of non-custom linters", + "description": "Usable linter names.", + "anyOf": [ + { + "enum": [ + "arangolint", + "asasalint", + "asciicheck", + "bidichk", + "bodyclose", + "canonicalheader", + "containedctx", + "contextcheck", + "copyloopvar", + "cyclop", + "decorder", + "depguard", + "dogsled", + "dupl", + "dupword", + "durationcheck", + "embeddedstructfieldcheck", + "errcheck", + "errchkjson", + "errname", + "errorlint", + "exhaustive", + "exhaustruct", + "exptostd", + "fatcontext", + "forbidigo", + "forcetypeassert", + "funcorder", + "funlen", + "ginkgolinter", + "gocheckcompilerdirectives", + "gochecknoglobals", + "gochecknoinits", + "gochecksumtype", + "gocognit", + "goconst", + "gocritic", + "gocyclo", + "godoclint", + "godot", + "godox", + "err113", + "goheader", + "gomoddirectives", + "gomodguard", + "goprintffuncname", + "gosec", + "gosimple", + "gosmopolitan", + "govet", + "grouper", + "iface", + "importas", + "inamedparam", + "ineffassign", + "interfacebloat", + "intrange", + "iotamixing", + "ireturn", + "lll", + "loggercheck", + "maintidx", + "makezero", + "mirror", + "misspell", + "mnd", + "musttag", + "nakedret", + "nestif", + "nilerr", + "nilnesserr", + "nilnil", + "nlreturn", + "noctx", + "noinlineerr", + "nolintlint", + "nonamedreturns", + "nosprintfhostport", + "paralleltest", + "perfsprint", + "prealloc", + "predeclared", + "promlinter", + "protogetter", + "reassign", + "recvcheck", + "revive", + "rowserrcheck", + "sloglint", + "sqlclosecheck", + "staticcheck", + "stylecheck", + "tagalign", + "tagliatelle", + "testableexamples", + "testifylint", + "testpackage", + "thelper", + "tparallel", + "unconvert", + "unparam", + "unused", + "usestdlibvars", + "usetesting", + "varnamelen", + "wastedassign", + "whitespace", + "wrapcheck", + "wsl", + "wsl_v5", + "zerologlint" + ] + }, + { + "type": "string" + } + ] + }, + "formatter-names": { + "description": "Usable formatter names.", + "enum": [ + "gci", + "gofmt", + "gofumpt", + "goimports", + "golines", + "swaggo" + ] + }, + "settings": { + "definitions": { + "dupwordSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Keywords for detecting duplicate words. If this list is not empty, only the words defined in this list will be detected.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["the", "and", "a"] + } + }, + "ignore": { + "description": "Keywords used to ignore detection.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["0C0C"] + } + } + } + }, + "asasalintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "description": "To specify a set of function names to exclude.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["\\.Wrapf"] + } + }, + "use-builtin-exclusions": { + "description": "To enable/disable the asasalint builtin exclusions of function names.", + "type": "boolean", + "default": true + } + } + }, + "bidichkSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "left-to-right-embedding": { + "description": "Disallow: LEFT-TO-RIGHT-EMBEDDING", + "type": "boolean", + "default": false + }, + "right-to-left-embedding": { + "description": "Disallow: RIGHT-TO-LEFT-EMBEDDING", + "type": "boolean", + "default": false + }, + "pop-directional-formatting": { + "description": "Disallow: POP-DIRECTIONAL-FORMATTING", + "type": "boolean", + "default": false + }, + "left-to-right-override": { + "description": "Disallow: LEFT-TO-RIGHT-OVERRIDE", + "type": "boolean", + "default": false + }, + "right-to-left-override": { + "description": "Disallow: RIGHT-TO-LEFT-OVERRIDE", + "type": "boolean", + "default": false + }, + "left-to-right-isolate": { + "description": "Disallow: LEFT-TO-RIGHT-ISOLATE", + "type": "boolean", + "default": false + }, + "right-to-left-isolate": { + "description": "Disallow: RIGHT-TO-LEFT-ISOLATE", + "type": "boolean", + "default": false + }, + "first-strong-isolate": { + "description": "Disallow: FIRST-STRONG-ISOLATE", + "type": "boolean", + "default": false + }, + "pop-directional-isolate": { + "description": "Disallow: POP-DIRECTIONAL-ISOLATE", + "type": "boolean", + "default": false + } + } + }, + "cyclopSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-complexity": { + "description": "Max complexity the function can have", + "type": "integer", + "default": 10, + "minimum": 0 + }, + "package-average": { + "description": "Max average complexity in package", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "decorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "dec-order": { + "type": "array", + "default": [["type", "const", "var", "func"]], + "items": { + "enum": ["type", "const", "var", "func"] + } + }, + "ignore-underscore-vars": { + "description": "Underscore vars (vars with \"_\" as the name) will be ignored at all checks", + "default": true, + "type": "boolean" + }, + "disable-dec-order-check": { + "description": "Order of declarations is not checked", + "default": true, + "type": "boolean" + }, + "disable-init-func-first-check": { + "description": "Allow init func to be anywhere in file", + "default": true, + "type": "boolean" + }, + "disable-dec-num-check": { + "description": "Multiple global type, const and var declarations are allowed", + "default": true, + "type": "boolean" + }, + "disable-type-dec-num-check": { + "description": "Type declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-const-dec-num-check": { + "description": "Const declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + }, + "disable-var-dec-num-check": { + "description": "Var declarations will be ignored for dec num check", + "default": true, + "type": "boolean" + } + } + }, + "depguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "rules": { + "description": "Rules to apply.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[^.]+$": { + "description": "Name of a rule.", + "type": "object", + "additionalProperties": false, + "properties": { + "list-mode": { + "description": "Used to determine the package matching priority.", + "enum": ["original", "strict", "lax"], + "default": "original" + }, + "files": { + "description": "List of file globs that will match this list of settings to compare against.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "allow": { + "description": "List of allowed packages.", + "additionalProperties": false, + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "description": "Packages that are not allowed where the value is a suggestion.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "desc": { + "description": "Description", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "dogsledSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-blank-identifiers": { + "description": "Check assignments with too many blank identifiers.", + "type": "integer", + "default": 2, + "minimum": 0 + } + } + }, + "duplSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "threshold": { + "description": "Tokens count to trigger issue.", + "type": "integer", + "default": 150, + "minimum": 0 + } + } + }, + "embeddedstructfieldcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "empty-line": { + "description": "Checks that there is an empty space between the embedded fields and regular fields.", + "type": "boolean", + "default": false + }, + "forbid-mutex": { + "description": "Checks that sync.Mutex and sync.RWMutex are not used as embedded fields.", + "type": "boolean", + "default": false + } + } + }, + "errcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-type-assertions": { + "description": "Report about not checking errors in type assertions, i.e.: `a := b.(MyStruct)`", + "type": "boolean", + "default": false + }, + "check-blank": { + "description": "Report about assignment of errors to blank identifier", + "type": "boolean", + "default": false + }, + "exclude-functions": { + "description": "List of functions to exclude from checking, where each entry is a single function to exclude", + "type": "array", + "examples": ["io/ioutil.ReadFile", "io.Copy(*bytes.Buffer)"], + "items": { + "type": "string" + } + }, + "disable-default-exclusions": { + "description": "To disable the errcheck built-in exclude list", + "type": "boolean", + "default": false + }, + "verbose": { + "description": "Display function signature instead of selector", + "type": "boolean", + "default": false + } + } + }, + "errchkjsonSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-error-free-encoding": { + "type": "boolean", + "default": false + }, + "report-no-exported": { + "description": "Issue on struct that doesn't have exported fields.", + "type": "boolean", + "default": false + } + } + }, + "errorlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "errorf": { + "description": "Check whether fmt.Errorf uses the %w verb for formatting errors", + "type": "boolean", + "default": true + }, + "errorf-multi": { + "description": "Permit more than 1 %w verb, valid per Go 1.20", + "type": "boolean", + "default": true + }, + "asserts": { + "description": "Check for plain type assertions and type switches.", + "type": "boolean", + "default": true + }, + "comparison": { + "description": "Check for plain error comparisons", + "type": "boolean", + "default": true + }, + "allowed-errors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + }, + "allowed-errors-wildcard": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "err": { + "type": "string" + }, + "fun": { + "type": "string" + } + } + } + } + } + }, + "exhaustiveSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check": { + "description": "Program elements to check for exhaustiveness.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["switch", "map"] + } + }, + "explicit-exhaustive-switch": { + "description": "Only run exhaustive check on switches with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "explicit-exhaustive-map": { + "description": "Only run exhaustive check on map literals with \"//exhaustive:enforce\" comment.", + "type": "boolean", + "default": false + }, + "default-case-required": { + "description": "Switch statement requires default case even if exhaustive.", + "type": "boolean", + "default": false + }, + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, even if all enum members are not listed.", + "type": "boolean", + "default": false + }, + "ignore-enum-members": { + "description": "Enum members matching `regex` do not have to be listed in switch statements to satisfy exhaustiveness", + "type": "string" + }, + "ignore-enum-types": { + "description": "Enum types matching the supplied regex do not have to be listed in switch statements to satisfy exhaustiveness.", + "type": "string" + }, + "package-scope-only": { + "description": "Consider enums only in package scopes, not in inner scopes.", + "type": "boolean", + "default": false + } + } + }, + "exhaustructSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "include": { + "description": "List of regular expressions to match struct packages and names.", + "type": "array", + "examples": [".*\\.Test"], + "items": { + "type": "string" + } + }, + "exclude": { + "description": "List of regular expressions to exclude struct packages and names from check.", + "type": "array", + "examples": ["cobra\\.Command$"], + "items": { + "type": "string" + } + }, + "allow-empty": { + "description": "Allows empty structures, effectively excluding them from the check.", + "type": "boolean", + "default": false + }, + "allow-empty-rx": { + "description": "List of regular expressions to match type names that should be allowed to be empty.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-empty-returns": { + "description": "Allows empty structures in return statements.", + "type": "boolean", + "default": false + }, + "allow-empty-declarations": { + "description": "Allows empty structures in variable declarations.", + "type": "boolean", + "default": false + } + } + }, + "fatcontextSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-struct-pointers": { + "description": "Check for potential fat contexts in struct pointers.", + "type": "boolean", + "default": false + } + } + }, + "forbidigoSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude-godoc-examples": { + "description": "Exclude code in godoc examples.", + "type": "boolean", + "default": true + }, + "analyze-types": { + "description": "Instead of matching the literal source code, use type information to replace expressions with strings that contain the package name and (for methods and fields) the type name.", + "type": "boolean", + "default": true + }, + "forbid": { + "description": "List of identifiers to forbid (written using `regexp`)", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Pattern", + "type": "string" + }, + "pkg": { + "description": "Package", + "type": "string" + }, + "msg": { + "description": "Message", + "type": "string" + } + } + } + } + } + }, + "funcorderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "constructor": { + "description": "Checks that constructors are placed after the structure declaration.", + "type": "boolean", + "default": true + }, + "struct-method": { + "description": "Checks if the exported methods of a structure are placed before the non-exported ones.", + "type": "boolean", + "default": true + }, + "alphabetical": { + "description": "Checks if the constructors and/or structure methods are sorted alphabetically.", + "type": "boolean", + "default": false + } + } + }, + "funlenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "lines": { + "description": "Limit lines number per function.", + "type": "integer", + "default": 60 + }, + "statements": { + "description": "Limit statements number per function.", + "type": "integer", + "default": 40 + }, + "ignore-comments": { + "description": "Ignore comments when counting lines.", + "type": "boolean", + "default": true + } + } + }, + "gciSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "sections": { + "description": "Section configuration to compare against.", + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "standard", + "default", + "blank", + "dot", + "alias", + "localmodule" + ] + }, + { + "type": "string" + } + ] + }, + "default": ["standard", "default"] + }, + "no-inline-comments": { + "description": "Checks that no inline Comments are present.", + "type": "boolean", + "default": false + }, + "no-prefix-comments": { + "description": "Checks that no prefix Comments(comment lines above an import) are present.", + "type": "boolean", + "default": false + }, + "custom-order": { + "description": "Enable custom order of sections.", + "type": "boolean", + "default": false + }, + "no-lex-order": { + "description": "Drops lexical ordering for custom sections.", + "type": "boolean", + "default": false + } + } + }, + "ginkgolinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "suppress-len-assertion": { + "description": "Suppress the wrong length assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-nil-assertion": { + "description": "Suppress the wrong nil assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-err-assertion": { + "description": "Suppress the wrong error assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-compare-assertion": { + "description": "Suppress the wrong comparison assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-async-assertion": { + "description": "Suppress the function all in async assertion warning.", + "type": "boolean", + "default": false + }, + "suppress-type-compare-assertion": { + "description": "Suppress warning for comparing values from different types, like int32 and uint32.", + "type": "boolean", + "default": false + }, + "forbid-focus-container": { + "description": "Trigger warning for ginkgo focus containers like FDescribe, FContext, FWhen or FIt.", + "type": "boolean", + "default": false + }, + "allow-havelen-zero": { + "description": "Don't trigger warnings for HaveLen(0).", + "type": "boolean", + "default": false + }, + "force-expect-to": { + "description": "Force using `Expect` with `To`, `ToNot` or `NotTo`", + "type": "boolean", + "default": false + }, + "validate-async-intervals": { + "description": "Best effort validation of async intervals (timeout and polling).", + "type": "boolean", + "default": false + }, + "forbid-spec-pollution": { + "description": "Trigger a warning for variable assignments in ginkgo containers like `Describe`, `Context` and `When`, instead of in `BeforeEach()`.", + "type": "boolean", + "default": false + }, + "force-succeed": { + "description": "Force using the Succeed matcher for error functions, and the HaveOccurred matcher for non-function error values.", + "type": "boolean", + "default": false + }, + "force-assertion-description": { + "description": "Force adding assertion descriptions to gomega matchers.", + "type": "boolean", + "default": false + }, + "force-tonot": { + "description": "Force using `ToNot`, `ShouldNot` instead of `To(Not())`.", + "type": "boolean", + "default": false + } + } + }, + "gochecksumtypeSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "default-signifies-exhaustive": { + "description": "Presence of `default` case in switch statements satisfies exhaustiveness, if all members are not listed.", + "type": "boolean", + "default": true + }, + "include-shared-interfaces": { + "description": "Include shared interfaces in the exhaustiviness check.", + "type": "boolean", + "default": false + } + } + }, + "gocognitSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimal code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "goconstSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "match-constant": { + "description": "Look for existing constants matching the values", + "type": "boolean", + "default": true + }, + "min-len": { + "description": "Minimum length of string constant.", + "type": "integer", + "default": 3 + }, + "min-occurrences": { + "description": "Minimum occurrences count to trigger.", + "type": "integer", + "default": 3 + }, + "ignore-calls": { + "description": "Ignore when constant is not used as function argument", + "type": "boolean", + "default": true + }, + "ignore-string-values": { + "description": "Exclude strings matching the given regular expression", + "type": "array", + "items": { + "type": "string" + } + }, + "numbers": { + "description": "Search also for duplicated numbers.", + "type": "boolean", + "default": false + }, + "min": { + "description": "Minimum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "max": { + "description": "Maximum value, only works with `numbers`", + "type": "integer", + "default": 3 + }, + "find-duplicates": { + "description": "Detects constants with identical values", + "type": "boolean", + "default": false + }, + "eval-const-expressions": { + "description": "Evaluates of constant expressions like Prefix + \"suffix\"", + "type": "boolean", + "default": false + } + } + }, + "gocriticSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled-checks": { + "description": "Which checks should be enabled. By default, a list of stable checks is used. To see it, run `GL_DEBUG=gocritic golangci-lint run`.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + } + }, + "disabled-checks": { + "description": "Which checks should be disabled.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-checks" + }, + "default": [] + }, + "enabled-tags": { + "description": "Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "disabled-tags": { + "description": "Disable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.", + "type": "array", + "items": { + "$ref": "#/definitions/gocritic-tags" + } + }, + "settings": { + "description": "Settings passed to gocritic. Properties must be valid and enabled check names.", + "type": "object", + "additionalProperties": false, + "properties": { + "captLocal": { + "type": "object", + "additionalProperties": false, + "properties": { + "paramsOnly" : { + "type": "boolean", + "default": true + } + } + }, + "commentedOutCode": { + "type": "object", + "additionalProperties": false, + "properties": { + "minLength" : { + "type": "number", + "default": 15 + } + } + }, + "elseif": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipBalanced" : { + "type": "boolean", + "default": true + } + } + }, + "hugeParam": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 80 + } + } + }, + "ifElseChain": { + "type": "object", + "additionalProperties": false, + "properties": { + "minThreshold" : { + "type": "number", + "default": 2 + } + } + }, + "nestingReduce": { + "type": "object", + "additionalProperties": false, + "properties": { + "bodyWidth" : { + "type": "number", + "default": 5 + } + } + }, + "rangeExprCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 512 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "rangeValCopy": { + "type": "object", + "additionalProperties": false, + "properties": { + "sizeThreshold" : { + "type": "number", + "default": 128 + }, + "skipTestFuncs" : { + "type": "boolean", + "default": true + } + } + }, + "ruleguard": { + "type": "object", + "additionalProperties": false, + "properties": { + "debug" : { + "type": "string" + }, + "enable" : { + "type": "string" + }, + "disable" : { + "type": "string" + }, + "failOn" : { + "type": "string" + }, + "rules" : { + "type": "string" + } + } + }, + "tooManyResultsChecker": { + "type": "object", + "additionalProperties": false, + "properties": { + "maxResults" : { + "type": "number", + "default": 5 + } + } + }, + "truncateCmp": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipArchDependent" : { + "type": "boolean", + "default": true + } + } + }, + "underef": { + "type": "object", + "additionalProperties": false, + "properties": { + "skipRecvDeref" : { + "type": "boolean", + "default": true + } + } + }, + "unnamedResult": { + "type": "object", + "additionalProperties": false, + "properties": { + "checkExported" : { + "type": "boolean", + "default": false + } + } + } + } + }, + "disable-all": { + "type": "boolean", + "default": false + }, + "enable-all": { + "type": "boolean", + "default": false + } + } + }, + "gocycloSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum code complexity to report (we recommend 10-20).", + "type": "integer", + "default": 30 + } + } + }, + "godoclintSettings": { + "type": "object", + "properties": { + "default": { + "type": "string", + "enum": ["all", "basic", "none"], + "default": "basic", + "description": "Default set of rules to enable." + }, + "enable": { + "description": "List of rules to enable in addition to the default set.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "disable": { + "description": "List of rules to disable.", + "type": "array", + "uniqueItems": true, + "items": { + "$ref": "#/definitions/godoclint-rules" + } + }, + "options": { + "type": "object", + "description": "A map for setting individual rule options.", + "properties": { + "max-len": { + "type": "object", + "properties": { + "length": { + "type": "integer", + "description": "Maximum line length for godocs, not including the `// `, or `/*` or `*/` tokens.", + "default": 77 + } + } + }, + "require-doc": { + "type": "object", + "properties": { + "ignore-exported": { + "type": "boolean", + "description": "Ignore exported (public) symbols when applying the `require-doc` rule.", + "default": false + }, + "ignore-unexported": { + "type": "boolean", + "description": "Ignore unexported (private) symbols when applying the `require-doc` rule.", + "default": true + } + } + }, + "start-with-name": { + "type": "object", + "properties": { + "include-unexported": { + "type": "boolean", + "description": "Include unexported symbols when applying the `start-with-name` rule.", + "default": false + } + } + } + } + } + } + }, + "godotSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "scope": { + "description": "Comments to be checked.", + "enum": ["declarations", "toplevel", "all", "noinline"], + "default": "declarations" + }, + "exclude": { + "description": "List of regexps for excluding particular comment lines from check.", + "type": "array", + "items": { + "type": "string" + } + }, + "period": { + "description": "Check that each sentence ends with a period.", + "type": "boolean", + "default": true + }, + "capital": { + "description": "Check that each sentence starts with a capital letter.", + "type": "boolean", + "default": false + }, + "check-all": { + "description": "DEPRECATED: Check all top-level comments, not only declarations.", + "type": "boolean", + "default": false + } + } + }, + "godoxSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "keywords": { + "description": "Report any comments starting with one of these keywords. This is useful for TODO or FIXME comments that might be left in the code accidentally and should be resolved before merging.", + "type": "array", + "items": { + "type": "string" + }, + "default": ["TODO", "BUG", "FIXME"] + } + } + }, + "gofmtSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "simplify": { + "description": "Simplify code.", + "type": "boolean", + "default": true + }, + "rewrite-rules": { + "description": "Apply the rewrite rules to the source before reformatting.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "replacement": { + "type": "string" + } + } + } + } + } + }, + "golinesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-len": { + "type": "integer", + "default": 100 + }, + "tab-len": { + "type": "integer", + "default": 4 + }, + "shorten-comments": { + "type": "boolean", + "default": false + }, + "reformat-tags": { + "type": "boolean", + "default": true + }, + "chain-split-dots": { + "type": "boolean", + "default": true + } + } + }, + "interfacebloatSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max": { + "description": "The maximum number of methods allowed for an interface.", + "type": "integer" + } + } + }, + "gofumptSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-rules": { + "description": "Choose whether or not to use the extra rules that are disabled by default.", + "type": "boolean", + "default": false + }, + "module-path": { + "description": " Module path which contains the source code being formatted.", + "type": "string" + } + } + }, + "goheaderSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "values": { + "type": "object", + "additionalProperties": false, + "properties": { + "const": { + "description": "Constants to use in the template.", + "type": "object", + "patternProperties": { + "^.+$": { + "description": "Value for the constant.", + "type": "string" + } + }, + "additionalProperties": false, + "examples": [ + { + "YEAR": "2030", + "COMPANY": "MY FUTURISTIC COMPANY" + } + ] + }, + "regexp": { + "description": "Regular expressions to use in your template.", + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.+$": { + "type": "string" + } + }, + "examples": [ + { + "AUTHOR": ".*@mycompany\\.com" + } + ] + } + } + }, + "template": { + "description": "Template to put on top of every file.", + "type": "string", + "examples": [ + "{{ MY COMPANY }}\nSPDX-License-Identifier: Apache-2.0\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at:\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License." + ] + }, + "template-path": { + "description": "Path to the file containing the template source.", + "type": "string", + "examples": ["my_header_template.txt"] + } + }, + "oneOf": [ + { "required": ["template"] }, + { "required": ["template-path"] } + ] + }, + "goimportsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "local-prefixes": { + "description": "Put imports beginning with prefix after 3rd-party packages. It is a list of prefixes.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "gomoddirectivesSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "replace-local": { + "description": "Allow local `replace` directives.", + "type": "boolean", + "default": true + }, + "replace-allow-list": { + "description": "List of allowed `replace` directives.", + "type": "array", + "items": { + "type": "string" + } + }, + "retract-allow-no-explanation": { + "description": "Allow to not explain why the version has been retracted in the `retract` directives.", + "type": "boolean", + "default": false + }, + "exclude-forbidden": { + "description": "Forbid the use of the `exclude` directives.", + "type": "boolean", + "default": false + }, + "ignore-forbidden": { + "description": "Forbid the use of the `ignore` directives. (>= go1.25)", + "type": "boolean", + "default": false + }, + "toolchain-forbidden": { + "description": "Forbid the use of the `toolchain` directive.", + "type": "boolean", + "default": false + }, + "toolchain-pattern": { + "description": "Defines a pattern to validate `toolchain` directive.", + "type": "string" + }, + "tool-forbidden": { + "description": "Forbid the use of the `tool` directives.", + "type": "boolean", + "default": false + }, + "go-debug-forbidden": { + "description": "Forbid the use of the `godebug` directive.", + "type": "boolean", + "default": false + }, + "go-version-pattern": { + "description": "Defines a pattern to validate `go` minimum version directive.", + "type": "string", + "default": "" + } + } + }, + "gomodguardSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allowed": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of allowed modules.", + "type": "array", + "items": { + "type": "string", + "examples": ["gopkg.in/yaml.v2"] + } + }, + "domains": { + "description": "List of allowed module domains.", + "type": "array", + "items": { + "type": "string", + "examples": ["golang.org"] + } + } + } + }, + "blocked": { + "type": "object", + "additionalProperties": false, + "properties": { + "modules": { + "description": "List of blocked modules.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "properties": { + "recommendations": { + "description": "Recommended modules that should be used instead.", + "type": "array", + "items": { + "type": "string" + } + }, + "reason": { + "description": "Reason why the recommended module should be used.", + "type": "string" + } + } + } + }, + "additionalProperties": false + } + }, + "versions": { + "description": "List of blocked module version constraints.", + "type": "array", + "items": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "description": "Version constraint.", + "type": "string" + }, + "reason": { + "description": "Reason why the version constraint exists.", + "type": "string" + } + }, + "required": ["reason"] + } + } + } + }, + "local-replace-directives": { + "description": "Raise lint issues if loading local path with replace directive", + "type": "boolean", + "default": true + } + } + } + } + }, + "gosecSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "includes": { + "type": "array", + "description": "To select a subset of rules to run", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "excludes": { + "type": "array", + "description": "To specify a set of rules to explicitly exclude", + "examples": [["G401"]], + "items": { + "$ref": "#/definitions/gosec-rules" + } + }, + "severity": { + "description": "Filter out the issues with a lower severity than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "confidence": { + "description": "Filter out the issues with a lower confidence than the given value", + "type": "string", + "enum": ["low", "medium", "high"], + "default": "low" + }, + "config": { + "description": "To specify the configuration of rules", + "type": "object" + }, + "concurrency": { + "description": "Concurrency value", + "type": "integer" + } + } + }, + "gosmopolitanSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-time-local": { + "description": "Allow and ignore `time.Local` usages.", + "type": "boolean", + "default": false + }, + "escape-hatches": { + "description": "List of fully qualified names in the `full/pkg/path.name` form, to act as \"i18n escape hatches\".", + "type": "array", + "items": { + "type": "string" + } + }, + "watch-for-scripts": { + "description": "List of Unicode scripts to watch for any usage in string literals.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "govetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "settings": { + "description": "Settings per analyzer. Map of analyzer name to specific settings.\nRun `go tool vet help` to find out more.", + "type": "object", + "propertyNames": { + "$ref": "#/definitions/govet-analyzers" + }, + "patternProperties": { + "^.*$": { + "description": "Run `go tool vet help ` to see all settings.", + "type": "object" + } + } + }, + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "disable": { + "description": "Disable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/govet-analyzers" + } + }, + "enable-all": { + "description": "Enable all analyzers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all analyzers.", + "type": "boolean", + "default": false + } + } + }, + "grouperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "const-require-single-const": { + "type": "boolean", + "default": false + }, + "const-require-grouping": { + "type": "boolean", + "default": false + }, + "import-require-single-import": { + "type": "boolean", + "default": false + }, + "import-require-grouping": { + "type": "boolean", + "default": false + }, + "type-require-single-type": { + "type": "boolean", + "default": false + }, + "type-require-grouping": { + "type": "boolean", + "default": false + }, + "var-require-single-var": { + "type": "boolean", + "default": false + }, + "var-require-grouping": { + "type": "boolean", + "default": false + } + } + }, + "ifaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "Enable analyzers by name.", + "type": "array", + "items": { + "$ref": "#/definitions/iface-analyzers" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "unused": { + "type": "object", + "additionalProperties": false, + "properties": { + "exclude": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "importasSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "no-unaliased": { + "description": "Do not allow unaliased imports of aliased packages.", + "type": "boolean", + "default": false + }, + "no-extra-aliases": { + "description": "Do not allow non-required aliases.", + "type": "boolean", + "default": false + }, + "alias": { + "description": "List of aliases", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "pkg": { + "description": "Package path e.g. knative.dev/serving/pkg/apis/autoscaling/v1alpha1", + "type": "string" + }, + "alias": { + "description": "Package alias e.g. autoscalingv1alpha1", + "type": "string" + } + }, + "required": ["pkg", "alias"] + } + } + } + }, + "inamedparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-single-param": { + "description": "Skips check for interface methods with only a single parameter.", + "type": "boolean", + "default": false + } + } + }, + "ineffassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-escaping-errors": { + "description": "Check escaping variables of type error, may cause false positives.", + "type": "boolean", + "default": false + } + } + }, + "iotamixingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-individual": { + "description": "Whether to report individual consts rather than just the const block.", + "type": "boolean", + "default": false + } + } + }, + "ireturnSettings": { + "type": "object", + "additionalProperties": false, + "description": "Use either `reject` or `allow` properties for interfaces matching.", + "properties": { + "allow": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + }, + "reject": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "enum": ["anon", "error", "empty", "stdlib"] + } + ] + } + } + }, + "anyOf": [ + { + "not": { + "properties": { + "allow": { + "const": "reject" + } + } + }, + "required": ["allow"] + }, + { + "required": ["reject"] + } + ] + }, + "lllSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "tab-width": { + "description": "Width of \"\\t\" in spaces.", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "line-length": { + "description": "Maximum allowed line length, lines longer will be reported.", + "type": "integer", + "minimum": 1, + "default": 120 + } + } + }, + "maintidxSettings": { + "description": "Maintainability index https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022", + "type": "object", + "additionalProperties": false, + "properties": { + "under": { + "description": "Minimum accatpable maintainability index level (see https://docs.microsoft.com/en-us/visualstudio/code-quality/code-metrics-maintainability-index-range-and-meaning?view=vs-2022)", + "type": "number", + "default": 20 + } + } + }, + "makezeroSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "always": { + "description": "Allow only slices initialized with a length of zero.", + "type": "boolean", + "default": false + } + } + }, + "loggercheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kitlog": { + "description": "Allow check for the github.com/go-kit/log library.", + "type": "boolean", + "default": true + }, + "klog": { + "description": "Allow check for the k8s.io/klog/v2 library.", + "type": "boolean", + "default": true + }, + "logr": { + "description": "Allow check for the github.com/go-logr/logr library.", + "type": "boolean", + "default": true + }, + "slog": { + "description": "Allow check for the log/slog library.", + "type": "boolean", + "default": true + }, + "zap": { + "description": "Allow check for the \"sugar logger\" from go.uber.org/zap library.", + "type": "boolean", + "default": true + }, + "require-string-key": { + "description": "Require all logging keys to be inlined constant strings.", + "type": "boolean", + "default": false + }, + "no-printf-like": { + "description": "Require printf-like format specifier (%s, %d for example) not present.", + "type": "boolean", + "default": false + }, + "rules": { + "description": "List of custom rules to check against, where each rule is a single logger pattern, useful for wrapped loggers.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "misspellSettings": { + "description": "Correct spellings using locale preferences for US or UK. Default is to use a neutral variety of English.", + "type": "object", + "additionalProperties": false, + "properties": { + "locale": { + "enum": ["US", "UK"] + }, + "ignore-rules": { + "description": "List of rules to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "mode": { + "description": "Mode of the analysis.", + "enum": ["restricted", "", "default"], + "default": "" + }, + "extra-words": { + "description": "Extra word corrections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "correction": { + "type": "string" + }, + "typo": { + "type": "string" + } + } + } + } + } + }, + "musttagSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "functions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "tag": { + "type": "string" + }, + "arg-pos": { + "type": "integer" + } + } + } + } + } + }, + "nakedretSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-func-lines": { + "description": "Report if a function has more lines of code than this value and it has naked returns.", + "type": "integer", + "minimum": 0, + "default": 30 + } + } + }, + "nestifSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "min-complexity": { + "description": "Minimum complexity of \"if\" statements to report.", + "type": "integer", + "default": 5 + } + } + }, + "nilnilSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "only-two": { + "type": "boolean", + "description": "To check functions with only two return values.", + "default": true + }, + "detect-opposite": { + "type": "boolean", + "description": "In addition, detect opposite situation (simultaneous return of non-nil error and valid value).", + "default": false + }, + "checked-types": { + "type": "array", + "description": "List of return types to check.", + "items": { + "enum": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + }, + "default": ["chan", "func", "iface", "map", "ptr", "uintptr", "unsafeptr"] + } + } + }, + "nlreturnSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "block-size": { + "description": "set block size that is still ok", + "type": "number", + "default": 0, + "minimum": 0 + } + } + }, + "mndSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignored-files": { + "description": "List of file patterns to exclude from analysis.", + "examples": [["magic1_.*.go"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-functions": { + "description": "Comma-separated list of function patterns to exclude from the analysis.", + "examples": [["math.*", "http.StatusText", "make"]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignored-numbers": { + "description": "List of numbers to exclude from analysis.", + "examples": [["1000", "1234_567_890", "3.14159264"]], + "type": "array", + "items": { + "type": "string" + } + }, + "checks": { + "description": "The list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description.", + "type": "array", + "items": { + "enum": [ + "argument", + "case", + "condition", + "operation", + "return", + "assign" + ] + } + } + } + }, + "nolintlintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-unused": { + "description": "Enable to ensure that nolint directives are all used.", + "type": "boolean", + "default": true + }, + "allow-no-explanation": { + "description": "Exclude these linters from requiring an explanation.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + }, + "default": [] + }, + "require-explanation": { + "description": "Enable to require an explanation of nonzero length after each nolint directive.", + "type": "boolean", + "default": false + }, + "require-specific": { + "description": "Enable to require nolint directives to mention the specific linter being suppressed.", + "type": "boolean", + "default": false + } + } + }, + "reassignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "patterns": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recvcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable-builtin": { + "description": "Disables the built-in method exclusions.", + "type": "boolean", + "default": true + }, + "exclusions": { + "description": "User-defined method exclusions.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nonamedreturnsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "report-error-in-defer": { + "description": "Report named error if it is assigned inside defer.", + "type": "boolean", + "default": false + } + } + }, + "paralleltestSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-missing": { + "description": "Ignore missing calls to `t.Parallel()` and only report incorrect uses of it.", + "type": "boolean", + "default": false + }, + "ignore-missing-subtests": { + "description": "Ignore missing calls to `t.Parallel()` in subtests. Top-level tests are still required to have `t.Parallel`, but subtests are allowed to skip it.", + "type": "boolean", + "default": false + } + } + }, + "perfsprintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "integer-format": { + "description": "Enable/disable optimization of integer formatting.", + "type": "boolean", + "default": true + }, + "int-conversion": { + "description": "Optimizes even if it requires an int or uint type cast.", + "type": "boolean", + "default": true + }, + "error-format": { + "description": "Enable/disable optimization of error formatting.", + "type": "boolean", + "default": true + }, + "err-error": { + "description": "Optimizes into `err.Error()` even if it is only equivalent for non-nil errors.", + "type": "boolean", + "default": false + }, + "errorf": { + "description": "Optimizes `fmt.Errorf`.", + "type": "boolean", + "default": true + }, + "string-format": { + "description": "Enable/disable optimization of string formatting.", + "type": "boolean", + "default": true + }, + "sprintf1": { + "description": "Optimizes `fmt.Sprintf` with only one argument.", + "type": "boolean", + "default": true + }, + "strconcat": { + "description": "Optimizes into strings concatenation.", + "type": "boolean", + "default": true + }, + "bool-format": { + "description": "Enable/disable optimization of bool formatting.", + "type": "boolean", + "default": true + }, + "hex-format": { + "description": "Enable/disable optimization of hex formatting.", + "type": "boolean", + "default": true + } + } + }, + "preallocSettings": { + "description": "We do not recommend using this linter before doing performance profiling.\nFor most programs usage of `prealloc` will be premature optimization.", + "type": "object", + "additionalProperties": false, + "properties": { + "simple": { + "description": "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.", + "type": "boolean", + "default": true + }, + "range-loops": { + "description": "Report preallocation suggestions on range loops.", + "type": "boolean", + "default": true + }, + "for-loops": { + "description": "Report preallocation suggestions on for loops.", + "type": "boolean", + "default": false + } + } + }, + "predeclaredSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore": { + "description": "List of predeclared identifiers to not report on.", + "type": "array", + "items": { + "type": "string" + } + }, + "qualified-name": { + "description": "Include method names and field names in checks.", + "type": "boolean", + "default": false + } + } + }, + "promlinterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "strict": {}, + "disabled-linters": { + "type": "array", + "items": { + "enum": [ + "Help", + "MetricUnits", + "Counter", + "HistogramSummaryReserved", + "MetricTypeInName", + "ReservedChars", + "CamelCase", + "UnitAbbreviations" + ] + } + } + } + }, + "protogetterSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-generated-by": { + "type": "array", + "items": { + "type": "string", + "examples": ["protoc-gen-go-my-own-generator"] + } + }, + "skip-files": { + "type": "array", + "items": { + "type": "string", + "examples": ["*.pb.go"] + } + }, + "skip-any-generated": { + "description": "Skip any generated files from the checking.", + "type": "boolean", + "default": false + }, + "replace-first-arg-in-append": { + "description": "Skip first argument of append function.", + "type": "boolean", + "default": false + } + } + }, + "reviveSettings": { + "type": "object", + "additionalProperties": false, + "examples": [ + { + "ignore-generated-header": true, + "severity": "warning", + "rules": [ + { + "name": "indent-error-flow", + "severity": "warning" + }, + { + "name": "add-constant", + "severity": "warning", + "arguments": [ + { + "maxLitCount": "3", + "allowStrs": "\"\"", + "allowInts": "0,1,2", + "allowFloats": "0.0,0.,1.0,1.,2.0,2." + } + ] + } + ] + } + ], + "properties": { + "max-open-files": { + "type": "integer" + }, + "confidence": { + "type": "number" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "enable-all-rules": { + "type": "boolean", + "default": false + }, + "directives": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "enum": ["specify-disable-reason"] + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "$ref": "#/definitions/revive-rules", + "title": "The rule name" + }, + "disabled": { + "type": "boolean" + }, + "severity": { + "type": "string", + "enum": ["warning", "error"] + }, + "exclude": { + "type": "array", + "items": { + "type": "string" + } + }, + "arguments": { + "type": "array" + } + } + } + } + } + }, + "rowserrcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "packages": { + "type": "array", + "items": { + "description": "", + "type": "string", + "examples": ["github.com/jmoiron/sqlx"] + } + } + } + }, + "sloglintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "kv-only": { + "description": "Enforce using key-value pairs only (incompatible with attr-only).", + "type": "boolean", + "default": false + }, + "no-global": { + "description": "Enforce not using global loggers.", + "enum": ["", "all", "default"], + "default": "" + }, + "no-mixed-args": { + "description": "Enforce not mixing key-value pairs and attributes.", + "type": "boolean", + "default": true + }, + "context": { + "description": "Enforce using methods that accept a context.", + "enum": ["", "all", "scope"], + "default": "" + }, + "static-msg": { + "description": "Enforce using static values for log messages.", + "type": "boolean", + "default": false + }, + "msg-style": { + "description": "Enforce message style.", + "enum": ["", "lowercased", "capitalized"], + "default": "" + }, + "key-naming-case": { + "description": "Enforce a single key naming convention.", + "enum": ["snake", "kebab", "camel", "pascal"] + }, + "attr-only": { + "description": "Enforce using attributes only (incompatible with kv-only).", + "type": "boolean", + "default": false + }, + "no-raw-keys": { + "description": "Enforce using constants instead of raw keys.", + "type": "boolean", + "default": false + }, + "forbidden-keys": { + "description": "Enforce not using specific keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "args-on-sep-lines": { + "description": "Enforce putting arguments on separate lines.", + "type": "boolean", + "default": false + } + } + }, + "spancheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "description": "Checks to enable.", + "type": "array", + "items": { + "enum": ["end", "record-error", "set-status"] + } + }, + "ignore-check-signatures": { + "description": "A list of regexes for function signatures that silence `record-error` and `set-status` reports if found in the call path to a returned error.", + "type": "array", + "items": { + "type": "string" + } + }, + "extra-start-span-signatures": { + "description": "A list of regexes for additional function signatures that create spans.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "staticcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "checks": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/staticcheck-checks" + }, + { + "type": "string" + } + ] + } + }, + "dot-import-whitelist": { + "description": "By default, ST1001 forbids all uses of dot imports in non-test packages. This setting allows setting a whitelist of import paths that can be dot-imported anywhere.", + "type": "array", + "items": { + "type": "string" + } + }, + "http-status-code-whitelist": { + "description": "ST1013 recommends using constants from the net/http package instead of hard-coding numeric HTTP status codes. This setting specifies a list of numeric status codes that this check does not complain about.", + "default": ["200", "400", "404", "500"], + "type": "array", + "items": { + "enum": [ + "100", + "101", + "102", + "103", + "200", + "201", + "202", + "203", + "204", + "205", + "206", + "207", + "208", + "226", + "300", + "301", + "302", + "303", + "304", + "305", + "306", + "307", + "308", + "400", + "401", + "402", + "403", + "404", + "405", + "406", + "407", + "408", + "409", + "410", + "411", + "412", + "413", + "414", + "415", + "416", + "417", + "418", + "421", + "422", + "423", + "424", + "425", + "426", + "428", + "429", + "431", + "451", + "500", + "501", + "502", + "503", + "504", + "505", + "506", + "507", + "508", + "510", + "511" + ] + } + }, + "initialisms": { + "description": "ST1003 check, among other things, for the correct capitalization of initialisms. The set of known initialisms can be configured with this option.", + "type": "array", + "items": { + "type": "string", + "default": [ + "ACL", + "API", + "ASCII", + "CPU", + "CSS", + "DNS", + "EOF", + "GUID", + "HTML", + "HTTP", + "HTTPS", + "ID", + "IP", + "JSON", + "QPS", + "RAM", + "RPC", + "SLA", + "SMTP", + "SQL", + "SSH", + "TCP", + "TLS", + "TTL", + "UDP", + "UI", + "GID", + "UID", + "UUID", + "URI", + "URL", + "UTF8", + "VM", + "XML", + "XMPP", + "XSRF", + "XSS", + "SIP", + "RTP", + "AMQP", + "DB", + "TS" + ] + } + } + } + }, + "tagalignSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "align": { + "description": "Align and sort can be used together or separately.", + "type": "boolean", + "default": true + }, + "sort": { + "description": "Whether enable tags sort.", + "type": "boolean", + "default": true + }, + "order": { + "description": "Specify the order of tags, the other tags will be sorted by name.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [ + [ + "json", + "yaml", + "yml", + "toml", + "mapstructure", + "binding", + "validate" + ] + ] + }, + "strict": { + "description": "Whether enable strict style.", + "type": "boolean", + "default": false + } + } + }, + "tagliatelleSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "case": { + "type": "object", + "additionalProperties": false, + "properties": { + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + }, + "overrides": { + "description": "Overrides the default/root configuration.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["pkg"], + "properties": { + "pkg": { + "description": "A package path.", + "type": "string" + }, + "use-field-name": { + "description": "Use the struct field name to check the name of the struct tag.", + "type": "boolean", + "default": false + }, + "ignored-fields": { + "description": "The field names to ignore.", + "type": "array", + "items": { + "type": "string", + "examples": ["example"] + } + }, + "ignore": { + "description": "Ignore the package (takes precedence over all other configurations).", + "type": "boolean", + "default": false + }, + "rules": { + "type": "object", + "patternProperties": { + "^.+$": { + "$ref": "#/definitions/tagliatelle-cases" + } + } + }, + "extended-rules": { + "description": "Defines the association between tag name and case.", + "type": "object", + "patternProperties": { + "^.+$": { + "type": "object", + "additionalProperties": false, + "required": ["case"], + "properties": { + "case": { + "$ref": "#/definitions/tagliatelle-cases" + }, + "extra-initialisms": { + "type": "boolean", + "default": false + }, + "initialism-overrides": { + "type": "object", + "patternProperties": { + "^.+$": { + "type": "boolean", + "default": false + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "testifylintSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable-all": { + "description": "Enable all checkers.", + "type": "boolean", + "default": false + }, + "disable-all": { + "description": "Disable all checkers.", + "type": "boolean", + "default": false + }, + "enable": { + "description": "Enable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ] + }, + "default": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "useless-assert" + ] + }, + "disable": { + "description": "Disable specific checkers.", + "type": "array", + "items": { + "enum": [ + "blank-import", + "bool-compare", + "compares", + "contains", + "empty", + "encoded-compare", + "equal-values", + "error-is-as", + "error-nil", + "expected-actual", + "float-compare", + "formatter", + "go-require", + "len", + "negative-positive", + "nil-compare", + "regexp", + "require-error", + "suite-broken-parallel", + "suite-dont-use-pkg", + "suite-extra-assert-call", + "suite-method-signature", + "suite-subtest-run", + "suite-thelper", + "useless-assert" + ], + "default": [ + "suite-thelper" + ] + } + }, + "bool-compare": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-custom-types": { + "description": "To ignore user defined types (over builtin bool).", + "type": "boolean", + "default": false + } + } + }, + "expected-actual": { + "type": "object", + "additionalProperties": false, + "properties": { + "pattern": { + "description": "Regexp for expected variable name.", + "type": "string", + "default": "(^(exp(ected)?|want(ed)?)([A-Z]\\w*)?$)|(^(\\w*[a-z])?(Exp(ected)?|Want(ed)?)$)" + } + } + }, + "formatter": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-format-string": { + "description": "To enable go vet's printf checks.", + "type": "boolean", + "default": true + }, + "require-f-funcs": { + "description": "To require f-assertions (e.g. assert.Equalf) if format string is used, even if there are no variable-length variables.", + "type": "boolean", + "default": false + }, + "require-string-msg": { + "description": "To require that the first element of msgAndArgs (msg) has a string type.", + "type": "boolean", + "default": true + } + } + }, + "go-require": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignore-http-handlers": { + "description": "To ignore HTTP handlers (like http.HandlerFunc).", + "type": "boolean", + "default": false + } + } + }, + "require-error": { + "type": "object", + "additionalProperties": false, + "properties": { + "fn-pattern": { + "description": "Regexp for assertions to analyze. If defined, then only matched error assertions will be reported.", + "type": "string", + "default": "" + } + } + }, + "suite-extra-assert-call": { + "type": "object", + "additionalProperties": false, + "properties": { + "mode": { + "description": "To require or remove extra Assert() call?", + "type": "string", + "enum": ["remove", "require"], + "default": "remove" + } + } + } + } + }, + "testpackageSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "skip-regexp": { + "description": "Files with names matching this regular expression are skipped.", + "type": "string", + "examples": ["(export|internal)_test\\.go"] + }, + "allow-packages": { + "description": "List of packages that don't end with _test that tests are allowed to be in.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "examples": ["example"] + } + } + } + }, + "thelperSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "test": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `t.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.T is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.T param has t name.", + "default": true, + "type": "boolean" + } + } + }, + "benchmark": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `b.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.B is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.B param has b name.", + "default": true, + "type": "boolean" + } + } + }, + "tb": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `tb.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.TB is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.TB param has tb name.", + "default": true, + "type": "boolean" + } + } + }, + "fuzz": { + "type": "object", + "additionalProperties": false, + "properties": { + "begin": { + "description": "Check if `f.Helper()` begins helper function.", + "default": true, + "type": "boolean" + }, + "first": { + "description": "Check if *testing.F is first param of helper function.", + "default": true, + "type": "boolean" + }, + "name": { + "description": "Check if *testing.F param has f name.", + "default": true, + "type": "boolean" + } + } + } + } + }, + "usestdlibvarsSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "http-method": { + "description": "Suggest the use of http.MethodXX.", + "type": "boolean", + "default": true + }, + "http-status-code": { + "description": "Suggest the use of http.StatusXX.", + "type": "boolean", + "default": true + }, + "time-weekday": { + "description": "Suggest the use of time.Weekday.String().", + "type": "boolean", + "default": false + }, + "time-month": { + "description": "Suggest the use of time.Month.String().", + "type": "boolean", + "default": false + }, + "time-layout": { + "description": "Suggest the use of time.Layout.", + "type": "boolean", + "default": false + }, + "time-date-month": { + "description": "Suggest the use of time.Month in time.Date.", + "type": "boolean", + "default": false + }, + "crypto-hash": { + "description": "Suggest the use of crypto.Hash.String().", + "type": "boolean", + "default": false + }, + "default-rpc-path": { + "description": "Suggest the use of rpc.DefaultXXPath.", + "type": "boolean", + "default": false + }, + "sql-isolation-level": { + "description": "Suggest the use of sql.LevelXX.String().", + "type": "boolean", + "default": false + }, + "tls-signature-scheme": { + "description": "Suggest the use of tls.SignatureScheme.String().", + "type": "boolean", + "default": false + }, + "constant-kind": { + "description": "Suggest the use of constant.Kind.String().", + "type": "boolean", + "default": false + } + } + }, + "usetestingSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "context-background": { + "type": "boolean", + "default": false + }, + "context-todo": { + "type": "boolean", + "default": false + }, + "os-chdir": { + "type": "boolean", + "default": true + }, + "os-mkdir-temp": { + "type": "boolean", + "default": true + }, + "os-setenv": { + "type": "boolean", + "default": true + }, + "os-create-temp": { + "type": "boolean", + "default": true + }, + "os-temp-dir": { + "type": "boolean", + "default": false + } + } + }, + "unconvertSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "fast-math": { + "type": "boolean", + "default": false + }, + "safe": { + "type": "boolean", + "default": false + } + } + }, + "unparamSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-exported": { + "description": "Inspect exported functions. Set to true if no external program/library imports your code.\n\nWARNING: if you enable this setting, unparam will report a lot of false-positives in text editors:\nif it's called for subdir of a project it can't find external interfaces. All text editor integrations\nwith golangci-lint call it on a directory with the changed file.", + "type": "boolean", + "default": false + } + } + }, + "unqueryvetSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-sql-builders": { + "description": "Enable SQL builder checking.", + "type": "boolean", + "default": true + }, + "allowed-patterns": { + "description": "Regex patterns for acceptable SELECT * usage.", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "unusedSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "field-writes-are-uses": { + "description": "", + "type": "boolean", + "default": true + }, + "post-statements-are-reads": { + "description": "", + "type": "boolean", + "default": false + }, + "exported-fields-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "parameters-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "local-variables-are-used": { + "description": "", + "type": "boolean", + "default": true + }, + "generated-is-used": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "varnamelenSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-distance": { + "description": "Variables used in at most this N-many lines will be ignored.", + "type": "integer", + "default": 5 + }, + "min-name-length": { + "description": "The minimum length of a variable's name that is considered `long`.", + "type": "integer", + "default": 3 + }, + "check-receiver": { + "description": "Check method receiver names.", + "default": false, + "type": "boolean" + }, + "check-return": { + "description": "Check named return values.", + "default": false, + "type": "boolean" + }, + "check-type-param": { + "description": "Check type parameters.", + "default": false, + "type": "boolean" + }, + "ignore-type-assert-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a type assertion", + "default": false, + "type": "boolean" + }, + "ignore-map-index-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a map index.", + "default": false, + "type": "boolean" + }, + "ignore-chan-recv-ok": { + "description": "Ignore `ok` variables that hold the bool return value of a channel receive.", + "default": false, + "type": "boolean" + }, + "ignore-names": { + "description": "Optional list of variable names that should be ignored completely.", + "default": [[]], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-decls": { + "description": "Optional list of variable declarations that should be ignored completely.", + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + ["c echo.Context", "t testing.T", "f *foo.Bar", "const C"] + ] + } + } + }, + "whitespaceSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "multi-if": { + "description": "Enforces newlines (or comments) after every multi-line if statement", + "type": "boolean", + "default": false + }, + "multi-func": { + "description": "Enforces newlines (or comments) after every multi-line function signature", + "type": "boolean", + "default": false + } + } + }, + "wrapcheckSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "extra-ignore-sigs": { + "description": "An array of strings specifying additional substrings of signatures to ignore.", + "default": [ + ".CustomError(", + ".SpecificWrap(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sigs": { + "description": "An array of strings which specify substrings of signatures to ignore.", + "default": [ + ".Errorf(", + "errors.New(", + "errors.Unwrap(", + ".Wrap(", + ".Wrapf(", + ".WithMessage(", + ".WithMessagef(", + ".WithStack(" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-sig-regexps": { + "description": "An array of strings which specify regular expressions of signatures to ignore.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-package-globs": { + "description": "An array of glob patterns which, if any match the package of the function returning the error, will skip wrapcheck analysis for this error.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "ignore-interface-regexps": { + "description": "An array of glob patterns which, if matched to an underlying interface name, will ignore unwrapped errors returned from a function whose call is defined on the given interface.", + "default": [""], + "type": "array", + "items": { + "type": "string" + } + }, + "report-internal-errors": { + "description": "Determines whether wrapcheck should report errors returned from inside the package.", + "type": "boolean", + "default": false + } + } + }, + "wslSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-assign-and-anything": { + "description": "Controls if you may cuddle assignments and anything without needing an empty line between them.", + "type": "boolean", + "default": false + }, + "allow-assign-and-call": { + "description": "Allow calls and assignments to be cuddled as long as the lines have any matching variables, fields or types.", + "type": "boolean", + "default": true + }, + "allow-cuddle-declarations": { + "description": "Allow declarations (var) to be cuddled.", + "type": "boolean", + "default": false + }, + "allow-cuddle-with-calls": { + "description": "A list of call idents that everything can be cuddled with.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-with-rhs": { + "description": "AllowCuddleWithRHS is a list of right hand side variables that is allowed to be cuddled with anything.", + "type": "array", + "items": { + "type": "string" + } + }, + "allow-cuddle-used-in-block": { + "description": "Allow cuddling with any block as long as the variable is used somewhere in the block", + "type": "boolean", + "default": false + }, + "allow-multiline-assign": { + "description": "Allow multiline assignments to be cuddled.", + "type": "boolean", + "default": true + }, + "allow-separated-leading-comment": { + "description": "Allow leading comments to be separated with empty lines.", + "type": "boolean", + "default": false + }, + "allow-trailing-comment": { + "description": "Allow trailing comments in ending of blocks.", + "type": "boolean", + "default": false + }, + "error-variable-names": { + "description": "When force-err-cuddling is enabled this is a list of names used for error variables to check for in the conditional.", + "type": "array", + "items": { + "type": "string" + } + }, + "force-case-trailing-whitespace": { + "description": "Force newlines in end of case at this limit (0 = never).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "force-err-cuddling": { + "description": "Causes an error when an If statement that checks an error variable doesn't cuddle with the assignment of that variable.", + "type": "boolean", + "default": false + }, + "force-short-decl-cuddling": { + "description": "Causes an error if a short declaration (:=) cuddles with anything other than another short declaration.", + "type": "boolean", + "default": false + }, + "strict-append": { + "description": "If true, append is only allowed to be cuddled if appending value is matching variables, fields or types on line above.", + "type": "boolean", + "default": true + } + } + }, + "wslSettingsV5": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow-first-in-block": { + "type": "boolean", + "default": true + }, + "allow-whole-block": { + "type": "boolean", + "default": false + }, + "branch-max-lines": { + "type": "integer", + "default": 2 + }, + "case-max-lines": { + "type": "integer", + "default": 0 + }, + "default": { + "enum": ["all", "none", "default", ""], + "default": "default" + }, + "enable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + }, + "disable": { + "type": "array", + "items": { + "$ref": "#/definitions/wsl-checks" + } + } + } + }, + "copyloopvarSettings": { + "type": "object", + "additionalProperties": false, + "properties": { + "check-alias": { + "type": "boolean", + "default": false + } + } + }, + "customSettings": { + "description": "The custom section can be used to define linter plugins to be loaded at runtime. See README of golangci-lint for more information.\nEach custom linter should have a unique name.", + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "description": "The plugin type.", + "enum": ["module", "goplugin"], + "default": "goplugin" + }, + "path": { + "description": "The path to the plugin *.so. Can be absolute or local.", + "type": "string", + "examples": ["/path/to/example.so"] + }, + "description": { + "description": "The description of the linter, for documentation purposes only.", + "type": "string" + }, + "original-url": { + "description": "Intended to point to the repo location of the linter, for documentation purposes only.", + "type": "string" + }, + "settings": { + "description": "Plugins settings/configuration. Only work with plugin based on `linterdb.PluginConstructor`.", + "type": "object" + } + }, + "oneOf": [ + { + "properties": { + "type": {"enum": ["module"] } + }, + "required": ["type"] + }, + { + "required": ["path"] + } + ] + } + } + } + } + } + }, + "type": "object", + "additionalProperties": false, + "required": ["version"], + "properties": { + "version": { + "type": "string", + "default": "2" + }, + "run": { + "description": "Options for analysis running,", + "type": "object", + "additionalProperties": false, + "properties": { + "concurrency": { + "description": "Number of concurrent runners. Defaults to the number of available CPU cores.", + "type": "integer", + "minimum": 0, + "examples": [4] + }, + "timeout": { + "description": "Timeout for the analysis.", + "type": "string", + "pattern": "^((\\d+h)?(\\d+m)?(\\d+(?:\\.\\d)?s)?|0)$", + "default": "1m", + "examples": ["30s", "5m", "5m30s"] + }, + "issues-exit-code": { + "description": "Exit code when at least one issue was found.", + "type": "integer", + "default": 1 + }, + "tests": { + "description": "Enable inclusion of test files.", + "type": "boolean", + "default": true + }, + "build-tags": { + "description": "List of build tags to pass to all linters.", + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "examples": [["mytag"]] + }, + "modules-download-mode": { + "description": "Option to pass to \"go list -mod={option}\".\nSee \"go help modules\" for more information.", + "enum": ["mod", "readonly", "vendor"] + }, + "allow-parallel-runners": { + "description": "Allow multiple parallel golangci-lint instances running. If disabled, golangci-lint acquires file lock on start.", + "type": "boolean", + "default": false + }, + "allow-serial-runners": { + "description": "Allow multiple golangci-lint instances running, but serialize them around a lock.", + "type": "boolean", + "default": false + }, + "go": { + "description": "Targeted Go version.", + "type": "string", + "default": "1.17" + }, + "relative-path-mode": { + "description": "The mode used to evaluate relative paths.", + "type": "string", + "$ref": "#/definitions/relative-path-modes", + "default": "wd" + } + } + }, + "output": { + "description": "Output configuration options.", + "type": "object", + "additionalProperties": false, + "properties": { + "formats": { + "description": "Output formats to use.", + "type": "object", + "additionalProperties": false, + "properties": { + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "print-issued-lines": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "json": { + "$ref": "#/definitions/simple-format" + }, + "tab": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "print-linter-name": { + "type": "boolean", + "default": true + }, + "colors": { + "type": "boolean", + "default": true + } + } + }, + "html": { + "$ref": "#/definitions/simple-format" + }, + "checkstyle": { + "$ref": "#/definitions/simple-format" + }, + "code-climate": { + "$ref": "#/definitions/simple-format" + }, + "junit-xml": { + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "$ref": "#/definitions/formats-path", + "default": "stdout" + }, + "extended": { + "type": "boolean", + "default": true + } + } + }, + "teamcity": { + "$ref": "#/definitions/simple-format" + }, + "sarif": { + "$ref": "#/definitions/simple-format" + } + } + }, + "path-mode": { + "type": "string", + "default": "", + "examples": ["abs"] + }, + "path-prefix": { + "description": "Add a prefix to the output file references.", + "type": "string", + "default": "" + }, + "show-stats": { + "description": "Show statistics per linter.", + "type": "boolean", + "default": true + }, + "sort-order": { + "type": "array", + "items": { + "enum": ["linter", "severity", "file"] + } + } + } + }, + "linters": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "enum": [ + "standard", + "all", + "none", + "fast" + ] + }, + "enable": { + "description": "List of enabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "disable": { + "description": "List of disabled linters.", + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "settings": { + "description": "All available settings of specific linters.", + "type": "object", + "additionalProperties": false, + "properties": { + "dupword": { + "$ref": "#/definitions/settings/definitions/dupwordSettings" + }, + "asasalint": { + "$ref": "#/definitions/settings/definitions/asasalintSettings" + }, + "bidichk": { + "$ref": "#/definitions/settings/definitions/bidichkSettings" + }, + "cyclop": { + "$ref": "#/definitions/settings/definitions/cyclopSettings" + }, + "decorder": { + "$ref": "#/definitions/settings/definitions/decorderSettings" + }, + "depguard":{ + "$ref": "#/definitions/settings/definitions/depguardSettings" + }, + "dogsled": { + "$ref": "#/definitions/settings/definitions/dogsledSettings" + }, + "dupl": { + "$ref": "#/definitions/settings/definitions/duplSettings" + }, + "embeddedstructfieldcheck": { + "$ref": "#/definitions/settings/definitions/embeddedstructfieldcheckSettings" + }, + "errcheck": { + "$ref": "#/definitions/settings/definitions/errcheckSettings" + }, + "errchkjson": { + "$ref": "#/definitions/settings/definitions/errchkjsonSettings" + }, + "errorlint": { + "$ref": "#/definitions/settings/definitions/errorlintSettings" + }, + "exhaustive": { + "$ref": "#/definitions/settings/definitions/exhaustiveSettings" + }, + "exhaustruct": { + "$ref": "#/definitions/settings/definitions/exhaustructSettings" + }, + "fatcontext": { + "$ref": "#/definitions/settings/definitions/fatcontextSettings" + }, + "forbidigo": { + "$ref": "#/definitions/settings/definitions/forbidigoSettings" + }, + "funcorder": { + "$ref": "#/definitions/settings/definitions/funcorderSettings" + }, + "funlen": { + "$ref": "#/definitions/settings/definitions/funlenSettings" + }, + "ginkgolinter": { + "$ref": "#/definitions/settings/definitions/ginkgolinterSettings" + }, + "gochecksumtype": { + "$ref": "#/definitions/settings/definitions/gochecksumtypeSettings" + }, + "gocognit": { + "$ref": "#/definitions/settings/definitions/gocognitSettings" + }, + "goconst": { + "$ref": "#/definitions/settings/definitions/goconstSettings" + }, + "gocritic": { + "$ref": "#/definitions/settings/definitions/gocriticSettings" + }, + "gocyclo": { + "$ref": "#/definitions/settings/definitions/gocycloSettings" + }, + "godoclint": { + "$ref": "#/definitions/settings/definitions/godoclintSettings" + }, + "godot": { + "$ref": "#/definitions/settings/definitions/godotSettings" + }, + "godox": { + "$ref": "#/definitions/settings/definitions/godoxSettings" + }, + "interfacebloat":{ + "$ref": "#/definitions/settings/definitions/interfacebloatSettings" + }, + "goheader": { + "$ref": "#/definitions/settings/definitions/goheaderSettings" + }, + "gomoddirectives": { + "$ref": "#/definitions/settings/definitions/gomoddirectivesSettings" + }, + "gomodguard": { + "$ref": "#/definitions/settings/definitions/gomodguardSettings" + }, + "gosec": { + "$ref": "#/definitions/settings/definitions/gosecSettings" + }, + "gosmopolitan": { + "$ref": "#/definitions/settings/definitions/gosmopolitanSettings" + }, + "govet": { + "$ref": "#/definitions/settings/definitions/govetSettings" + }, + "grouper": { + "$ref": "#/definitions/settings/definitions/grouperSettings" + }, + "iface": { + "$ref": "#/definitions/settings/definitions/ifaceSettings" + }, + "importas": { + "$ref": "#/definitions/settings/definitions/importasSettings" + }, + "inamedparam": { + "$ref": "#/definitions/settings/definitions/inamedparamSettings" + }, + "ineffassign": { + "$ref": "#/definitions/settings/definitions/ineffassignSettings" + }, + "iotamixing": { + "$ref": "#/definitions/settings/definitions/iotamixingSettings" + }, + "ireturn": { + "$ref": "#/definitions/settings/definitions/ireturnSettings" + }, + "lll": { + "$ref": "#/definitions/settings/definitions/lllSettings" + }, + "maintidx": { + "$ref": "#/definitions/settings/definitions/maintidxSettings" + }, + "makezero":{ + "$ref": "#/definitions/settings/definitions/makezeroSettings" + }, + "loggercheck": { + "$ref": "#/definitions/settings/definitions/loggercheckSettings" + }, + "misspell": { + "$ref": "#/definitions/settings/definitions/misspellSettings" + }, + "musttag": { + "$ref": "#/definitions/settings/definitions/musttagSettings" + }, + "nakedret": { + "$ref": "#/definitions/settings/definitions/nakedretSettings" + }, + "nestif": { + "$ref": "#/definitions/settings/definitions/nestifSettings" + }, + "nilnil": { + "$ref": "#/definitions/settings/definitions/nilnilSettings" + }, + "nlreturn": { + "$ref": "#/definitions/settings/definitions/nlreturnSettings" + }, + "mnd": { + "$ref": "#/definitions/settings/definitions/mndSettings" + }, + "nolintlint":{ + "$ref": "#/definitions/settings/definitions/nolintlintSettings" + }, + "reassign": { + "$ref": "#/definitions/settings/definitions/reassignSettings" + }, + "recvcheck": { + "$ref": "#/definitions/settings/definitions/recvcheckSettings" + }, + "nonamedreturns": { + "$ref": "#/definitions/settings/definitions/nonamedreturnsSettings" + }, + "paralleltest": { + "$ref": "#/definitions/settings/definitions/paralleltestSettings" + }, + "perfsprint": { + "$ref": "#/definitions/settings/definitions/perfsprintSettings" + }, + "prealloc": { + "$ref": "#/definitions/settings/definitions/preallocSettings" + }, + "predeclared": { + "$ref": "#/definitions/settings/definitions/predeclaredSettings" + }, + "promlinter": { + "$ref": "#/definitions/settings/definitions/promlinterSettings" + }, + "protogetter": { + "$ref": "#/definitions/settings/definitions/protogetterSettings" + }, + "revive": { + "$ref": "#/definitions/settings/definitions/reviveSettings" + }, + "rowserrcheck": { + "$ref": "#/definitions/settings/definitions/rowserrcheckSettings" + }, + "sloglint": { + "$ref": "#/definitions/settings/definitions/sloglintSettings" + }, + "spancheck": { + "$ref": "#/definitions/settings/definitions/spancheckSettings" + }, + "staticcheck":{ + "$ref": "#/definitions/settings/definitions/staticcheckSettings" + }, + "tagalign": { + "$ref": "#/definitions/settings/definitions/tagalignSettings" + }, + "tagliatelle": { + "$ref": "#/definitions/settings/definitions/tagliatelleSettings" + }, + "testifylint": { + "$ref": "#/definitions/settings/definitions/testifylintSettings" + }, + "testpackage": { + "$ref": "#/definitions/settings/definitions/testpackageSettings" + }, + "thelper": { + "$ref": "#/definitions/settings/definitions/thelperSettings" + }, + "usestdlibvars": { + "$ref": "#/definitions/settings/definitions/usestdlibvarsSettings" + }, + "usetesting": { + "$ref": "#/definitions/settings/definitions/usetestingSettings" + }, + "unconvert": { + "$ref": "#/definitions/settings/definitions/unconvertSettings" + }, + "unparam": { + "$ref": "#/definitions/settings/definitions/unparamSettings" + }, + "unqueryvet": { + "$ref": "#/definitions/settings/definitions/unqueryvetSettings" + }, + "unused": { + "$ref": "#/definitions/settings/definitions/unusedSettings" + }, + "varnamelen": { + "$ref": "#/definitions/settings/definitions/varnamelenSettings" + }, + "whitespace": { + "$ref": "#/definitions/settings/definitions/whitespaceSettings" + }, + "wrapcheck": { + "$ref": "#/definitions/settings/definitions/wrapcheckSettings" + }, + "wsl": { + "$ref": "#/definitions/settings/definitions/wslSettings" + }, + "wsl_v5": { + "$ref": "#/definitions/settings/definitions/wslSettingsV5" + }, + "copyloopvar": { + "$ref": "#/definitions/settings/definitions/copyloopvarSettings" + }, + "custom":{ + "$ref": "#/definitions/settings/definitions/customSettings" + } + } + }, + "exclusions":{ + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "warn-unused": { + "type": "boolean", + "default": false + }, + "presets": { + "type": "array", + "items": { + "enum": [ + "comments", + "std-error-handling", + "common-false-positives", + "legacy" + ] + } + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + } + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "paths-except": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "formatters": { + "type": "object", + "additionalProperties": false, + "properties": { + "enable": { + "description": "List of enabled formatters.", + "type": "array", + "items": { + "$ref": "#/definitions/formatter-names" + } + }, + "settings": { + "type": "object", + "additionalProperties": false, + "properties": { + "gci": { + "$ref": "#/definitions/settings/definitions/gciSettings" + }, + "gofmt": { + "$ref": "#/definitions/settings/definitions/gofmtSettings" + }, + "gofumpt": { + "$ref": "#/definitions/settings/definitions/gofumptSettings" + }, + "goimports": { + "$ref": "#/definitions/settings/definitions/goimportsSettings" + }, + "golines": { + "$ref": "#/definitions/settings/definitions/golinesSettings" + } + } + }, + "exclusions": { + "type": "object", + "additionalProperties": false, + "properties": { + "generated": { + "enum": ["strict", "lax", "disable"], + "default": "strict" + }, + "paths": { + "type": "array", + "items": { + "type": "string" + } + }, + "warn-unused": { + "type": "boolean", + "default": false + } + } + } + } + }, + "issues": { + "type": "object", + "additionalProperties": false, + "properties": { + "max-issues-per-linter": { + "description": "Maximum issues count per one linter. Set to 0 to disable.", + "type": "integer", + "default": 50, + "minimum": 0 + }, + "max-same-issues": { + "description": "Maximum count of issues with the same text. Set to 0 to disable.", + "type": "integer", + "default": 3, + "minimum": 0 + }, + "new": { + "description": "Show only new issues: if there are unstaged changes or untracked files, only those changes are analyzed, else only changes in HEAD~ are analyzed.", + "type": "boolean", + "default": false + }, + "new-from-merge-base": { + "description": "Show only new issues created after the best common ancestor (merge-base against HEAD).", + "type": "string" + }, + "new-from-rev": { + "description": "Show only new issues created after this git revision.", + "type": "string" + }, + "new-from-patch": { + "description": "Show only new issues created in git patch with this file path.", + "type": "string", + "examples": ["path/to/patch/file"] + }, + "fix": { + "description": "Fix found issues (if it's supported by the linter).", + "type": "boolean", + "default": false + }, + "uniq-by-line": { + "description": "Make issues output unique by line.", + "type": "boolean", + "default": true + }, + "whole-files": { + "description": "Show issues in any part of update files (requires new-from-rev or new-from-patch).", + "type": "boolean", + "default": false + } + } + }, + "severity": { + "type": "object", + "additionalProperties": false, + "properties": { + "default": { + "description": "Set the default severity for issues. If severity rules are defined and the issues do not match or no severity is provided to the rule this will be the default severity applied. Severities should match the supported severity names of the selected out format.", + "type": "string", + "default": "" + }, + "rules": { + "description": "When a list of severity rules are provided, severity information will be added to lint issues. Severity rules have the same filtering capability as exclude rules except you are allowed to specify one matcher per severity rule.\nOnly affects out formats that support setting severity information.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "severity": { + "type": "string" + }, + "path": { + "type": "string" + }, + "path-except": { + "type": "string" + }, + "linters": { + "type": "array", + "items": { + "$ref": "#/definitions/linter-names" + } + }, + "text": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": ["severity"], + "anyOf": [ + { "required": ["path"] }, + { "required": ["path-except"] }, + { "required": ["linters"] }, + { "required": ["text"] }, + { "required": ["source"] } + ] + }, + "default": [] + } + }, + "required": ["default"] + } + } +} diff --git a/plugins/go-plugins/index.html b/plugins/go-plugins/index.html new file mode 100644 index 000000000000..bf38b8fdd604 --- /dev/null +++ b/plugins/go-plugins/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/plugins/go-plugins/ \ No newline at end of file diff --git a/plugins/module-plugins/index.html b/plugins/module-plugins/index.html new file mode 100644 index 000000000000..ed15cdab0fc5 --- /dev/null +++ b/plugins/module-plugins/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/plugins/module-plugins/ \ No newline at end of file diff --git a/product/changelog/index.html b/product/changelog/index.html new file mode 100644 index 000000000000..6f01f4992b0b --- /dev/null +++ b/product/changelog/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/product/changelog/ \ No newline at end of file diff --git a/product/migration-guide/index.html b/product/migration-guide/index.html new file mode 100644 index 000000000000..f33b41b07090 --- /dev/null +++ b/product/migration-guide/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/product/migration-guide/ \ No newline at end of file diff --git a/product/roadmap/index.html b/product/roadmap/index.html new file mode 100644 index 000000000000..fb4bbfab0406 --- /dev/null +++ b/product/roadmap/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/product/roadmap/ \ No newline at end of file diff --git a/product/thanks/index.html b/product/thanks/index.html new file mode 100644 index 000000000000..3d52b07705fc --- /dev/null +++ b/product/thanks/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/product/thanks/ \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000000..7d329b1db3f0 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +User-agent: * diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 000000000000..6bbf6c9ed39c --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,20 @@ +{ + "name": "golangci-lint", + "short_name": "golangci-lint", + "start_url": "index.html", + "icons": [ + { + "src": "android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#000000", + "display": "standalone" +} diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000000..e9a65666e19e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://golangci-lint.run/docs/configuration/cli/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/welcome/install/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/plugins/module-plugins/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/product/thanks/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/welcome/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/product/changelog/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/configuration/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/configuration/file/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/plugins/go-plugins/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/welcome/quick-start/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/formatters/configuration/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/linters/configuration/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/workflow/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/architecture/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/linters/false-positives/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/welcome/integrations/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/linters/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/product/migration-guide/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/formatters/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/new-linters/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/product/roadmap/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/debug/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/welcome/faq/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/product/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/faq/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/plugins/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/contributing/website/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/donate/2025-10-22T01:58:25+02:00https://golangci-lint.run/categories/https://golangci-lint.run/2025-10-22T01:58:25+02:00https://golangci-lint.run/docs/2025-10-22T01:58:25+02:00https://golangci-lint.run/tags/ \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000000..db410d7ace30 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,65 @@ +Tags – Golangci-lint
      New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
      \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml new file mode 100644 index 000000000000..0c8b04ebdaed --- /dev/null +++ b/tags/index.xml @@ -0,0 +1 @@ +Golangci-lint – Tagshttps://golangci-lint.run/tags/Recent content in Tags on Golangci-lintHugo -- gohugo.ioen-us \ No newline at end of file diff --git a/usage/configuration/index.html b/usage/configuration/index.html new file mode 100644 index 000000000000..0639772b6d51 --- /dev/null +++ b/usage/configuration/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/configuration/ \ No newline at end of file diff --git a/usage/false-positives/index.html b/usage/false-positives/index.html new file mode 100644 index 000000000000..f8954c800605 --- /dev/null +++ b/usage/false-positives/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/linters/false-positives/ \ No newline at end of file diff --git a/usage/formatters/index.html b/usage/formatters/index.html new file mode 100644 index 000000000000..ca9078bc1d99 --- /dev/null +++ b/usage/formatters/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/formatters/ \ No newline at end of file diff --git a/usage/linters/index.html b/usage/linters/index.html new file mode 100644 index 000000000000..971dc7ce2517 --- /dev/null +++ b/usage/linters/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/linters/ \ No newline at end of file diff --git a/welcome/faq/index.html b/welcome/faq/index.html new file mode 100644 index 000000000000..8ef554647cce --- /dev/null +++ b/welcome/faq/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/welcome/faq/ \ No newline at end of file diff --git a/welcome/install/index.html b/welcome/install/index.html new file mode 100644 index 000000000000..d6a9cc053155 --- /dev/null +++ b/welcome/install/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/welcome/install/ \ No newline at end of file diff --git a/welcome/integrations/index.html b/welcome/integrations/index.html new file mode 100644 index 000000000000..9bab90dce2ba --- /dev/null +++ b/welcome/integrations/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/welcome/integrations/ \ No newline at end of file diff --git a/welcome/quick-start/index.html b/welcome/quick-start/index.html new file mode 100644 index 000000000000..82930fac15a8 --- /dev/null +++ b/welcome/quick-start/index.html @@ -0,0 +1 @@ +https://golangci-lint.run/docs/welcome/quick-start/ \ No newline at end of file
    3. $(8k(7DZxQShj-%|rEq&i=cHYs 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%0A>-D~|bIGms@@No5eA4LA<@ohEefN0+??^{- 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

      xKkr0d;1`qzV%+ok@TJ*F72J1a#$zdQna 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≧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

      +l)j*;J2W8Ygk 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

      qY0xb1e7=ljuKK*UuuzcO ze367^`MO0BO)99e^lP;&>YuMkoX=UaoT$F-{d@kjkb7V%cV?*@8LMP9sZ5vgYKGE? zTq~J>2JKxI(OXqEdsU5GhxRVY^fHxOy-7rh0oGZlMNeUCf|B)H!^Lv<#Y~j?;_`xL zj&%`L`OPwaF-1Kt!TL}+3tGPTX=X$a7cSp1ArLf7gEUqdKkT z){_qtJ-;WA-2C%A50R%(RfuMf3_!_2+01LxK@L@*qADTEZAWjfC0+AI}Sw`R8tLSmQvbCz<-ZS&h~v-_8j zux7Rm+Z^)v=%1x5q@8QyRyHH(Hd;%aqcwQ7-87oJ*1M znAqR8%RJJSX0mtZvoA)S717C3{`*v=re~8k3oC2(`2lj1%}z62MQakNy<@6#52@>C zhx@9EAI^lOn;A4A4QqN%em#@8hcsSzRvf6SV&!1ol)3M1Wm1zVg;zJyS=!q&-iA76 z0grU89PD*W96TOH3a@Y-E@e$Wo=Q_>aa}R|`i$8Tm)pNGI=`}*g}Z9e?f-iv2kBJK z@AO)76{6!5YT=Y)YUX|xpO&+F1+tXW;^Z~F8ad~ru;FyEX3;+n33QB_GC8Y;QnL4) z{Qu%Z4p*R|&e;+c;g0%Otd`?XYcdnkomEnM^no;G3?ys|937v64NQ?Br})2h&O**j z4Jl!km1+2vEDOF2VGW+PT;Yc?^NCSR!r2?nM}wmkdZmYFFqpB37IS?=26fkd)&Wj+jO1vlzT|1Z4HDF|2mLw^y-KD>mYWq8xF+!{w$I9d4QgW}me#c@v zq;FCGr7T~X4tJ_h#LE^!0Z)0#_%kIhdyBTFHp6bkMocOnit#Q$1i28|O||t6-NvgI z+jazctrU|*Asj8%uQ9~h;a8e-Zqw_pdNvgG)l<2--CJ;s^tj{)XV*XSXFUzE9MN%p zw4;E>rS$hO0yyF+BNcR4M=Ac<{3ORc-`{R>RN$ouBW<#gBQS*oQ(8$^UClERwtvYN zM_id_9A5(j)z>ATZN$9wux5Oqk4a_20e`z0UfxW8YxQ7zICEFVY|*3K1=@)(05hRp z@8JNpj@OuR&zyeiRhfQ|Mum#M$%q2aIV51Q(0NTM>ucyd>VL3x@9|9k;orbNJKAP! z7=~g8=BznI4mESggq+WZIp!RaB-J*QQ_kgFa|o4$B%&HoNPSUBB_T?Zh=gk0`~B|6 z{onm~?2rAmKR$bGpU-u@uj};`1TF}Zb~|{k#R4AipR^Kw8d0YYY3If z5h!*_E0sb7Z~5P|g^0l1U4aqm5XoXz>t8aMq8J=vB5nyw!%1dFa!i?WZccdKuabN1iv!7y~J< z3`>Kck{L7SoLF+J9G95edU&vi;ir;u7Nv0pZtS1kvXIfga4g+AJ?@j)es{_yc=}k; z{w;RcwC9J>)PTfHGkoen%6z&iJMvs%PI6s3Uw>CJeEiGQr}QtONywVrys3;v|2@pl zC=gUF$)myMleS@4Zh8y3ylp&mVxp3ujyp~IHtT^KJ(7w;Mb=j z9T}<3n^?GY>O)bCO5>~SP8MISG=evsO3e7oSpAax3FLkU0iI-K!|_iZBdiy!;Y|oo zs~mIlt;LQUJ)Mep;@d3Axc+kEDp#4guF7ELi@x^0F1vD*Jc!2oOHn z;7#-}2~Zh~-gujeKj-ym6i@|L8a)>9JmCKG7<2}BQYvp=1$2Kei_>1d)SO`(ZM!`E z^;?XD;&UV_c2QC+O};Z|3k*lzs~kaYzldiR$OGhgDPJQW&JXqu`3zAnhc3N1nyRe8H*ElTn(JW=?l`L5f&N=zNpnq`Fze5Gl}fQVA^D= zE*_Hejg3-Rz6t>7SnxI_cYYH1br}i<;+FO!m2Z7}W3sYuUn=H#rZ6?^(-M0?tMCz` zO1o7_t@Ki=lCnCBLmUN3jS9@gby5MFgvnFQ2N6#k2z*(#qmDd~XRUHR)(3WZ;L?e_}_{J3=8Ah%#<$V6j6k^6FX&*04n&@@;d7gT> zA~VeL76Odttajw=w`Ti%mH<>hgK&&b_~DQ5*2}{;3z8B`b2b^)tDdtFQVoC$|35U1 zdm=p!VJelU!UECZER;uLQW>wXkv0+a>%`%UWZOuIdas z{nKtC!q56@dXCE0V+}eyT9$p4v#rnCJ(}2^5%!44k~CZ%9^{Z(K1|qy4&N%vdzg{1 zFj#OGapCZm>1umK4eMU6D3$f|Tyja9XkN?aFA>C6^4Q7jneB{??JQu&rS-VX>-!S1 z@88d)$}`te*EWYo5npx#>lZ{t4<==DS&WtPYqv749~`{VfKYeG)ABiXw-B&V_QhK$ z_ajM}v4H$4yX9v7qG)BE!T7BSv_d1R^*pHZu1r@0qEvDlH6VM{6~uq=AyAEb{Muxy z59Xc(n_yVt+?2iy&Z`EESm|FkTK{D7{`9v0&cy#Y(RE8W ze|BeKW;mZSdmy~=ETYos^zP{km;gYO%8~x=HQj*_Dg_xm$x`)Tclej0R5*c8WS>0D zxS7sy-G%&gLR#(D>S8yWhB)1T-KnGkwYi9eQZ}lDKL$g9MGa}Qx?$pd3=R)#y|`Na z2#_N5??O&^Jdy`8>Sq^le*)IX$Mu=y`BnVo!`oB(pFzPg;H> zt=19Hb}_#+-mVD3mmRVXC)GmJVQ~68D0BKxD&7Yznw;V|n)gm|_tuv2z;D-;QFN^#8Xp#i{-!dqgP>PExYcg4V+ewqOrkHEP)2>$b_)q zMh*pV0t+#B`Cx$~v&IryJR>c|x3i_yy1|=x%mCfWV0gZz?8$i_WMBfQ@R&#-Tu22J zE6As;*UykfR|eD2`gV6XN8rWn7vUOz2m|<28z5_fTe)6_7z+QBCXvDjq1%9%1n;5* zWcawuX_S#lwW8`tv7+=H#SEOVn-m~)AgaKM;Etl>VkB2(oTWTtC;Kffh68W~&2vf; zk(p%zy(Gm>8xj)aM1vm9Qu}#?!G3#B{nkPG2r>Bm>6cGL@qsuV7+)EiD&}2j=4+o? z*$U+0GzqDP?WR25Aj2&p`@x-dH1~$89j=m%Ft6oWi++G{ee<_r<6B1`y5ThLYwu2^ z-+7|OVxvqQKyZF`OrK(gXlrtD@8P$(Z=%~zg>gL?@Sd;EUG0t`t`Bi<5UvkaWEY|b zl`3*78C#cg3JGq8JL1;(7A90WxFu=nkiboDHGjQ#*U}m6!QbYcN-&4sME#JdYS)iQ z-ugkA(R=Z>(%%p2yz-3v<^-W=_Z(-W^q-Ib;Tl&h$|GfS#0XBb3s^vgRVmSk`8r$F zF56?uFlRh{`5sM4sb_%>Kbq&EmpR`GUg1HkpK}F=E<3zdI&FH=a{R}s7lNN>?B?w~ z%_0T;%9_~J4+gKEeS3f4XFiJoF6JgN+D{$Zgar^l0;n@dIOM>_R!;YUPs%R+JY17&~2r%8SJ;YO^y_Y6n#jjv?XS2u6eyNaH z{U@Qq&fE6zK681<`1!;?U&l)|@I1+t;j@Y$Cg3TdbPvkYlb+#;jKVXXpaaq4-X3Db zbh9T_wDf&%IK!K%>=~v0L=(UnapJB)Nt7j=GOvKn3AB)kcXZI&7({z+)uF*5>X<8%=r)>0S_R<6m9#TkeWe>j9ir#1BBHnIQ<7?% zVop@Bg1rL`0wTa{>%5f=WDapFt6kgXK0>S}rSqYPf&;S73ZbgcAg>A)??x%gXaPgu z=mDW?kWZyf)R8MdA0qhAU@QV#62AYo&R8YIq|DhauM#Nu_J$5m9IEWxN7S@K)VuYU zN$pWAFiT!iHogG9nWXd5V7=ek^qVR|tA7Ukc|!!Sm^;jJt1J2LG7Px@1yEbG)3>8O zpOJbydU59}K*I!UJbv}l zz*Qyo7Y*`97`c&fg1AF=08_iWHWF;rwi=xVW1oFQ)Is;-6{QQjOs?wOxoH!p#>g3R zsAlydl#^%~HWqkrQqhh5=?LI~QOW*4%qvh28fXh1>Cf+M@d{yMB zG&;O{cxVr(6!3~1e>L35x;gd(yqw}}4p-a@(^)mc?W!2n){kxLxXB37t^wceIEZBl zCK{G)H19X+?x}r$IQ&aIywOSrfHMUe;LKZ6np=6vai8d;H{O>}iFc*n+>G80%`mO2 zZdT*+971Yj_uDGgKKgRCtmkj6wpizNo2o5H6rcWXw z%dg3;A0X8Wiz(WQp(-Yn!&w0*I|2bgq!~nYrgx87%E!O?Ndxwmp;@kfg457*m|$zF zupW)QHIOE7)LO?pMn6_!J4`@$0EC`liSStWoD&BNcmMjd&scF-NrqY_0Y>OpSJz7e z&lEr{4ST-gNg(VoKPi&L`b)tvu?ibaEjnT-7czdVLzm$Y7H)dQ3}w*yW%_0Kcsr|1 z5zI6T{!(+k#P!@*h%TtG)uGvr9PE9OU;VR4`&)tBj1jRc-7i^r7Wkt&AS9_WbnW-o zqW!BzM({=+>bX&RcwYHL$L8SPQ}=y+gX-SA4Q<77F0gmT1||nX*=@(fGc=c@!8);Y zT>anZ44>Z~>u~M6d*;3!#VEZqZvN#n5*?B7-4fGlHFaMd9GktUI~yIsd8i8RJ@tzX zI%>SzAG#t2#`^3zJ;Qs4UbQ)I96T$D+&k2Oj4QJJ^NvF>?XDw1KC=1h#o=^t`>C*M3$;txT~%T{mtLm&AbS$b_MzIn2N=&0z)ntD-~xZF~; zhdsl3B{o;v^x{1!@uBgdvX;B@Bi-kfhiF*c=EOY7GkZ9AddnfgyQ2mVNLA@6^U4Rl zcU1M4oR%?RAV#<07l@Pba>-v*_ER|Z2r!z&~erxgL7^A_xHKpJRL!57^pwd}Vxf4O7LpU%zx*DLY6 ztRK7j4%;IFc!+^>g&7*mE&eyNod7621;0_22J_?Ug)kX|?zgUj-t4mnW*iZ2Bhx?A z2|m1c`Ni97X~Kasj6p*41@LT%Y@)Rw1|^wpyk&+p0nmD0aEc}Qsrr4F|w6)(m?5Z|D5WBiooj6bjW3{ zrM1PK(-m??X}<=D|3(5BChQI*M@Bx|Dzh3=oCf|w46Xz1a_Z+6Otm7qRM#7%>?b`^$kAu)VN0qDN; z;(pJ%U7E>he9dW+@B+zdnbaKDOCj+~)g0XW z-gu(+j!NC<03N2kk^%O#G5XJ@(BjbC+q?@y(6Au45x~yoirq@Omg+~V&A0ZO!NA|T zgDz&b*uAMYCA(4$bWP5FG~H;Tni%8x%3Ml9$iGMy2DIzl>PsdD5f z!H;1=i`(=%=moX4`8?s!aL}V+w>>?WWC5QKjfz*cOga+KLQCEUP?UU}==~>aj!ZNv zTP5`#&ow)1ly+gmN@@@|O@~5?0|Qv(ZJ7Mc-HqlgL_x+X1KYUU%Pe(&{~TZPG3QL9 zxk=;EsSxdmw>_R=bY|GO<{XwE^t@O3v5XMQoZ5_G)&-}22u&q`HI9%9O)rNg-46@7 z48{8#!OSa5ej4DcEJ|Mg=pW0rrl_11zgD0niX?nFKG(o>Xe?R^OR~AU9JV97K*N2EA9%P$N>(GmJ>b zIUP!6%ccGYk~f+z_p|2T5bAoT5!d`Q!US6KEpd37O3)|RjT@ByJAvx=cilLM&AfVl ziouF3&5i8hr>7M{A-qp@A!aSw-0lwHoTK50lm*RHSTBd7⩔P@j_%6uSwR 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%0A+Kbe3&pw7ftq+ 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%0D@tuw2sS>%Pmww&-#| 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�T!l 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%0DW?xqyloYxy32I_Z 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

      _ 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

      5pGM?`{b8%IqD>GSOsJ_#H5^>wM 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

      WX1QRVBa0q>*F2hGI9!LM+2is!#FY^ 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 }CbFtRrOP++EX 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%0Db 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 z⩔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≈$atg01rN5|B!^+L9xR$(1B(@hee!&KL}`PU)5 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%0A(;{aXMxFCavGjS}H+NO33y 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

      4gN_kVjD^=yCBDt{M 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

      44Gv<9TRYU@WlNZYHaB6 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⋘1`IBXKB(isGsWPqc40~}!%hYBFTQ3>EBJ{ZXdquWs7ZQ%NIvL-iTOJ&;i*`uKSqdt9{ zVv@)w^=LfdK8=Cc7eA5B-yhWmW>%pb2%k`BxY%K&|50dwvwkrL`2CJ~H9^{+*7ceR zF(O2G;1SL}peJce8uPw^wvijfZ1%)`T8qIA2P>=O21r7faQuWDqvvi zLWnu;b3Y=7#(G`PSj}dyHgc6{SV&A8XwQW`{|t>cU#?-j>TCLHVT{m1Kg~e{C=$d7 zfQQ#R=b*(`_Ch8rRvW6o)g07V8we$>u788=#lfBwyzSoqLG0Xe+#yajYHH6#2w^9} zPR?3b5=m=8t-Jsw6H%D2;FTQEh2UL#6q*ruGk>Q1Z-Vr$?D>fGPmWl`F$SW~S@Fnc z@Jcqy=+@`cJ5gog$R+>lPtctD;rE~hdf4zk9u>V| zGDZ&KUfSSu4@rm!F@F7d&;J>(BKO|wRSQd^3;Rop{4DJq$|HBha~G;nWm>5kvQ%^y z_^xb>`Dz!x{Ki1;d%#jJcQXz9slII~{TxzA1zD!~qm2eBJh81hHW4DJCbUDsH^KgN zB6v0tWtk(sud3|80U0l1=OSNSK?A11GrrFJ7Dae!*h8zbiD%aGl#RV zZ1@-c2Q}g^<~9eA2)6SR3t_SUd&BwvjufjX(BA4N_PFhn>E&(Y{izfL!Zb8wj(~o8 zpFXkopxr?}LgdLEAAfxU3!9f`w@_g19`HBPD!nOcbhhGwtfoe-F_VDi?r18=*0DbL z?CTLT$#0ef8kd+CBJIN$mq<5gGPtLhTm9Y9QR5<$#zq6NfL6Eu;vp%^vwo+z$}S`} z<+AyYUB9bnNnZ+Q=S!RnPK6hPB{9rPmq{3SY(NTm>_jNw0QYw};B`t4oq|V@8aKDJTFT5wV^7mI2d849e zz9gOX#!2;Fx?6|RY$LIDpx)ojYcC=rPf2^^-mi5juTkPLdqoD8nkv4_-tdFX3#6I) zt1Msj#D^|Tg<5uz$Cma*UFez3y>ii;94KYZy~QZsth+9`;rL?g!GUDQjC>V6uALgY z(x312zC-r*e;`Dr0W5q%SCUxT(Gr~Go�SO7~@gyp>Df~wih3k!Mm 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 literal 0 HcmV?d00001 diff --git a/images/logo-circle.svg b/images/logo-circle.svg new file mode 100644 index 000000000000..153e7fff73d9 --- /dev/null +++ b/images/logo-circle.svg @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/logo-dark.svg b/images/logo-dark.svg new file mode 100644 index 000000000000..285726401796 --- /dev/null +++ b/images/logo-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/logo-nocircle.svg b/images/logo-nocircle.svg new file mode 100644 index 000000000000..7c3408e13110 --- /dev/null +++ b/images/logo-nocircle.svg @@ -0,0 +1,563 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/logo.svg b/images/logo.svg new file mode 100644 index 000000000000..1ed7daf01d70 --- /dev/null +++ b/images/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/open-collective.svg b/images/open-collective.svg new file mode 100644 index 000000000000..c8b3db1ba1d8 --- /dev/null +++ b/images/open-collective.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/thanks-dev.svg b/images/thanks-dev.svg new file mode 100644 index 000000000000..141befa70355 --- /dev/null +++ b/images/thanks-dev.svg @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 000000000000..bdd2df65b4c9 --- /dev/null +++ b/index.html @@ -0,0 +1,71 @@ +Golangci-lint

      New golangci-lint release (v2.4) with support of Go 1.25 🎉🎉🎉 It’s time to support us to keep golangci-lint always up to date!
      \ No newline at end of file diff --git a/js/flexsearch.433e941a8a573ebb9931fc16fc75266ab6b93f569ac2fb4f3dc66882e0416f4c.js b/js/flexsearch.433e941a8a573ebb9931fc16fc75266ab6b93f569ac2fb4f3dc66882e0416f4c.js new file mode 100644 index 000000000000..970b75712941 --- /dev/null +++ b/js/flexsearch.433e941a8a573ebb9931fc16fc75266ab6b93f569ac2fb4f3dc66882e0416f4c.js @@ -0,0 +1,96 @@ +/**! + * FlexSearch.js v0.8.143 (Bundle) + * Author and Copyright: Thomas Wilkerling + * Licence: Apache-2.0 + * Hosted by Nextapps GmbH + * https://github.com/nextapps-de/flexsearch + */ +(function _f(self){'use strict';if(typeof module!=='undefined')self=module;else if(typeof process !== 'undefined')self=process;self._factory=_f;var t;function z(a,c,b){const e=typeof b,d=typeof a;if("undefined"!==e){if("undefined"!==d){if(b){if("function"===d&&e===d)return function(h){return a(b(h))};c=a.constructor;if(c===b.constructor){if(c===Array)return b.concat(a);if(c===Map){var f=new Map(b);for(var g of a)f.set(g[0],g[1]);return f}if(c===Set){g=new Set(b);for(f of a.values())g.add(f);return g}}}return a}return b}return"undefined"===d?c:a}function B(){return Object.create(null)}function E(a){return"string"===typeof a} +function I(a){return"object"===typeof a}function aa(a){const c=[];for(const b of a.keys())c.push(b);return c}function ba(a,c){if(E(c))a=a[c];else for(let b=0;a&&b"a1a".split(b).length; +this.numeric=z(a.numeric,e)}else{try{this.split=z(this.split,da)}catch(d){this.split=/\s+/}this.numeric=z(a.numeric,z(this.numeric,!0))}this.prepare=z(a.prepare,null,this.prepare);this.finalize=z(a.finalize,null,this.finalize);b=a.filter;this.filter="function"===typeof b?b:z(b&&new Set(b),null,this.filter);this.dedupe=z(a.dedupe,!1,this.dedupe);this.matcher=z((b=a.matcher)&&new Map(b),null,this.matcher);this.mapper=z((b=a.mapper)&&new Map(b),null,this.mapper);this.stemmer=z((b=a.stemmer)&&new Map(b), +null,this.stemmer);this.replacer=z(a.replacer,null,this.replacer);this.minlength=z(a.minlength,1,this.minlength);this.maxlength=z(a.maxlength,0,this.maxlength);this.rtl=z(a.rtl,!1,this.rtl);if(this.cache=b=z(a.cache,!0,this.cache))this.H=null,this.S="number"===typeof b?b:2E5,this.B=new Map,this.G=new Map,this.L=this.K=128;this.h="";this.M=null;this.A="";this.N=null;if(this.matcher)for(const d of this.matcher.keys())this.h+=(this.h?"|":"")+d;if(this.stemmer)for(const d of this.stemmer.keys())this.A+= +(this.A?"|":"")+d;return this};t.addStemmer=function(a,c){this.stemmer||(this.stemmer=new Map);this.stemmer.set(a,c);this.A+=(this.A?"|":"")+a;this.N=null;this.cache&&K(this);return this};t.addFilter=function(a){"function"===typeof a?this.filter=a:(this.filter||(this.filter=new Set),this.filter.add(a));this.cache&&K(this);return this}; +t.addMapper=function(a,c){if("object"===typeof a)return this.addReplacer(a,c);if(1a.length&&(this.dedupe||this.mapper))return this.addMapper(a,c);this.matcher||(this.matcher=new Map);this.matcher.set(a,c);this.h+=(this.h?"|":"")+a;this.M=null;this.cache&&K(this);return this}; +t.addReplacer=function(a,c){if("string"===typeof a)return this.addMatcher(a,c);this.replacer||(this.replacer=[]);this.replacer.push(a,c);this.cache&&K(this);return this}; +t.encode=function(a){if(this.cache&&a.length<=this.K)if(this.H){if(this.B.has(a))return this.B.get(a)}else this.H=setTimeout(K,50,this);this.normalize&&("function"===typeof this.normalize?a=this.normalize(a):a=ia?a.normalize("NFKD").replace(ia,"").toLowerCase():a.toLowerCase());this.prepare&&(a=this.prepare(a));this.numeric&&3this.stemmer.get(k)),d!==g&&this.filter&& +g.length>=this.minlength&&("function"===typeof this.filter?!this.filter(g):this.filter.has(g))&&(g=""));if(g&&(this.mapper||this.dedupe&&1this.matcher.get(k)));if(g&&this.replacer)for(d=0;g&&dthis.S&&(this.G.clear(),this.L=this.L/1.1|0));g&&b.push(g)}this.finalize&&(b=this.finalize(b)||b);this.cache&&a.length<=this.K&&(this.B.set(a,b),this.B.size>this.S&&(this.B.clear(),this.K=this.K/1.1|0));return b};function K(a){a.H=null;a.B.clear();a.G.clear()};let M,ja;async function ka(a){a=a.data;var c=a.task;const b=a.id;let e=a.args;switch(c){case "init":ja=a.options||{};(c=a.factory)?(Function("return "+c)()(self),M=new self.FlexSearch.Index(ja),delete self.FlexSearch):M=new N(ja);postMessage({id:b});break;default:let d;"export"===c&&(e[1]?(e[0]=ja.export,e[2]=0,e[3]=1):e=null);"import"===c?e[0]&&(a=await ja.import.call(M,e[0]),M.import(e[0],a)):(d=e&&M[c].apply(M,e))&&d.then&&(d=await d);postMessage("search"===c?{id:b,msg:d}:{id:b})}};function la(a){ma.call(a,"add");ma.call(a,"append");ma.call(a,"search");ma.call(a,"update");ma.call(a,"remove")}let na,oa,pa;function qa(){na=pa=0} +function ma(a){this[a+"Async"]=function(){const c=arguments;var b=c[c.length-1];let e;"function"===typeof b&&(e=b,delete c[c.length-1]);na?pa||(pa=Date.now()-oa>=this.priority*this.priority*3):(na=setTimeout(qa,0),oa=Date.now());if(pa){const f=this;return new Promise(g=>{setTimeout(function(){g(f[a+"Async"].apply(f,c))},0)})}const d=this[a].apply(this,c);b=d.then?d:new Promise(f=>f(d));e&&b.then(e);return b}};let O=0; +function P(a={}){function c(g){function h(k){k=k.data||k;const l=k.id,n=l&&d.h[l];n&&(n(k.msg),delete d.h[l])}this.worker=g;this.h=B();if(this.worker){e?this.worker.on("message",h):this.worker.onmessage=h;if(a.config)return new Promise(function(k){d.h[++O]=function(){k(d);1E9=g.length)c-=g.length;else{c=g[e?"splice":"slice"](c,b);const h=c.length;if(h&&(d=d.length?d.concat(c):c,b-=h,e&&(a.length-=h),!b))break;c=0}return d} +function R(a){if(!this||this.constructor!==R)return new R(a);this.index=a?[a]:[];this.length=a?a.length:0;const c=this;return new Proxy([],{get(b,e){if("length"===e)return c.length;if("push"===e)return function(d){c.index[c.index.length-1].push(d);c.length++};if("pop"===e)return function(){if(c.length)return c.length--,c.index[c.index.length-1].pop()};if("indexOf"===e)return function(d){let f=0;for(let g=0,h,k;gb||e?k.slice(e,b+e):k;else{if(ab||e)k=k.slice(e,b+e)}else{d=[];for(let m= +0,q;me)e-=q.length;else{if(q.length>b||e)q=q.slice(e,b+e),b-=q.length,e&&(e-=q.length);d.push(q);if(!b)break}k=1c?c?a.slice(b,b+c):a.slice(b):a,e?V.call(this,a):a;let d=[];for(let f=0,g,h;f=h){b-=h;continue}bc&&(g=g.slice(0,c),h=c);if(!d.length&&h>=c)return e?V.call(this,g):g;d.push(g);c-=h;if(!c)break}d=1a.length?this.result=a[0]:(this.result=Ga(a,b,e,!1,this.h),e=0));return f?this.resolve(b,e,d):this};W.prototype.and=function(){let a=this.result.length,c,b,e,d;if(!a){const f=arguments[0];f&&(a=!!f.suggest,d=f.resolve,c=f.limit,b=f.offset,e=f.enrich&&d)}if(a){const {O:f,P:g,limit:h,offset:k,enrich:l,resolve:n,suggest:m}=Ja(this,"and",arguments);return La.call(this,f,g,h,k,l,n,m)}return d?this.resolve(c,b,e):this}; +function La(a,c,b,e,d,f,g){if(c.length){const h=this;return Promise.all(c).then(function(k){a=[];for(let l=0,n;la.length)this.result=a[0];else{if(c=ca(a))return this.result=Fa(a,c,b,e,g,this.h,f),f?d?V.call(this.index,this.result):this.result:this;this.result=[]}else g||(this.result=a);return f?this.resolve(b,e,d):this};W.prototype.xor=function(){const {O:a,P:c,limit:b,offset:e,enrich:d,resolve:f,suggest:g}=Ja(this,"xor",arguments);return Ma.call(this,a,c,b,e,d,f,g)}; +function Ma(a,c,b,e,d,f,g){if(c.length){const h=this;return Promise.all(c).then(function(k){a=[];for(let l=0,n;la.length)this.result=a[0];else return this.result=Na.call(this,a,b,e,f,this.h),f?d?V.call(this.index,this.result):this.result:this;else g||(this.result=a);return f?this.resolve(b,e,d):this} +function Na(a,c,b,e,d){const f=[],g=B();let h=0;for(let k=0,l;kb||e)a=a.slice(e,e+b);d&&(a=V.call(this,a));return a}}function V(a){if(!this||!this.store)return a;const c=Array(a.length);for(let b=0,e;bthis.limit&&this.cache.delete(this.cache.keys().next().value)}; +X.prototype.get=function(a){const c=this.cache.get(a);c&&this.h!==a&&(this.cache.delete(a),this.cache.set(this.h=a,c));return c};X.prototype.remove=function(a){for(const c of this.cache){const b=c[0];c[1].includes(a)&&this.cache.delete(b)}};X.prototype.clear=function(){this.cache.clear();this.h=""};const Wa={normalize:!1,numeric:!1,split:/\s+/};const Xa={normalize:!0};const Ya={normalize:!0,dedupe:!0};const Za=new Map([["b","p"],["v","f"],["w","f"],["z","s"],["x","s"],["d","t"],["n","m"],["c","k"],["g","k"],["j","k"],["q","k"],["i","e"],["y","e"],["u","o"]]);const $a=new Map([["ae","a"],["oe","o"],["sh","s"],["kh","k"],["th","t"],["ph","f"],["pf","f"]]),ab=[/([^aeo])h(.)/g,"$1$2",/([aeo])h([^aeo]|$)/g,"$1$2",/(.)\1+/g,"$1"];const bb={a:"",e:"",i:"",o:"",u:"",y:"",b:1,f:1,p:1,v:1,c:2,g:2,j:2,k:2,q:2,s:2,x:2,z:2,"\u00df":2,d:3,t:3,l:4,m:5,n:5,r:6};var cb={X:Wa,W:Xa,Y:Ya,LatinBalance:{normalize:!0,dedupe:!0,mapper:Za},LatinAdvanced:{normalize:!0,dedupe:!0,mapper:Za,matcher:$a,replacer:ab},LatinExtra:{normalize:!0,dedupe:!0,mapper:Za,replacer:ab.concat([/(?!^)[aeo]/g,""]),matcher:$a},LatinSoundex:{normalize:!0,dedupe:!1,include:{letter:!0},finalize:function(a){for(let b=0;bu;f--){g=r.substring(u,f);v=this.rtl?d-1-u:u;var h=this.score?this.score(c,r,p,g,v):eb(q,e,p,d,v); +fb(this,n,g,h,a,b)}break}case "bidirectional":case "reverse":if(1g?0:1), +e,p,h-1,k-1),v=this.bidirectional&&r>f;fb(this,l,v?f:r,u,a,b,v?r:f)}}}}this.fastupdate||this.reg.add(a)}else c=""}this.db&&(c||this.commit_task.push({del:a}),this.T&&gb(this));return this}; +function fb(a,c,b,e,d,f,g){let h=g?a.ctx:a.map,k;if(!c[b]||g&&!(k=c[b])[g])if(g?(c=k||(c[b]=B()),c[g]=1,(k=h.get(g))?h=k:h.set(g,h=new Map)):c[b]=1,(k=h.get(b))?h=k:h.set(b,h=k=[]),h=h[e]||(h[e]=[]),!f||!h.includes(d)){if(h.length===2**31-1){c=new R(h);if(a.fastupdate)for(let l of a.reg.values())l.includes(h)&&(l[l.indexOf(h)]=c);k[e]=h=c}h.push(d);a.fastupdate&&((e=a.reg.get(d))?e.push(h):a.reg.set(d,[h]))}} +function eb(a,c,b,e,d){return b&&1b)&&(k=b,b=c,c=k);if(a.db)return a.db.get(c,b,e,d,f,g,h);a=b?(a=a.ctx.get(b))&&a.get(c):a.map.get(c);return a};N.prototype.remove=function(a,c){const b=this.reg.size&&(this.fastupdate?this.reg.get(a):this.reg.has(a));if(b){if(this.fastupdate)for(let e=0,d;ed.length)d.pop();else{const f=d.indexOf(a);f===b.length-1?d.pop():d.splice(f,1)}}else lb(this.map,a),this.depth&&lb(this.ctx,a);c||this.reg.delete(a)}this.db&&(this.commit_task.push({del:a}),this.T&&gb(this));this.cache&&this.cache.remove(a);return this}; +function lb(a,c){let b=0;if(a.constructor===Array)for(let e=0,d,f;eb.add(a,c)):this.add(a,c)}; +function mb(a){let c=0;if(a.constructor===Array)for(let b=0,e;b=n.length){e-=n.length;continue}const m=b?e+Math.min(n.length-e,b):n.length;for(let q=e;q=f.length)return[];if(!c&&!b)return f;f=f.slice(b,b+c);return e?d.enrich(f):f})}; +t.enrich=function(a){"object"!==typeof a&&(a=[a]);const c=this.db.transaction("reg","readonly").objectStore("reg"),b=[];for(let e=0;e{a.onsuccess=a.oncomplete=function(){c&&c(this.result);c=null;b(this.result)};a.onerror=a.onblocked=e;a=null})};const rb={Index:N,Charset:cb,Encoder:J,Document:U,Worker:P,Resolver:W,IndexedDB:pb,Language:{}},tb="undefined"!==typeof self?self:"undefined"!==typeof global?global:self;let ub;(ub=tb.define)&&ub.amd?ub([],function(){return rb}):"object"===typeof tb.exports?tb.exports=rb:tb.FlexSearch=rb;}(this||self)); diff --git a/js/main.min.ff7e61ddbaed1d0c971f6cc60dc28562f494db314fb9c0a3e3ddab8bcca7d31b.js b/js/main.min.ff7e61ddbaed1d0c971f6cc60dc28562f494db314fb9c0a3e3ddab8bcca7d31b.js new file mode 100644 index 000000000000..f5ea887efe0e --- /dev/null +++ b/js/main.min.ff7e61ddbaed1d0c971f6cc60dc28562f494db314fb9c0a3e3ddab8bcca7d31b.js @@ -0,0 +1,6 @@ +function computeMenuTranslation(e,t){const n=e.getBoundingClientRect();t.style.minWidth=`${Math.max(n.width,50)}px`;const o=e.dataset.location==="top",r=e.dataset.location==="bottom",c=e.dataset.location==="bottom-right",s=document.documentElement.dir==="rtl";let i=n.left;(o&&!s||r&&s||c&&!s)&&(i=n.right-t.clientWidth);let a=n.top-window.innerHeight-10;return o&&(a=n.top-window.innerHeight+t.clientHeight+e.clientHeight+4),{x:i,y:a}}function toggleMenu(e){const t=e.nextElementSibling;t.classList.toggle("hx:hidden");const n=computeMenuTranslation(e,t);t.style.transform=`translate3d(${n.x}px, ${n.y}px, 0)`}function resizeMenu(e){const t=e.nextElementSibling;if(t.classList.contains("hx:hidden"))return;const n=computeMenuTranslation(e,t);t.style.transform=`translate3d(${n.x}px, ${n.y}px, 0)`}(function(){const n="system",s=["light","dark"],e=document.querySelectorAll(".hextra-theme-toggle"),o=document.querySelectorAll(".hextra-theme-toggle-options p");function i(t){t=s.includes(t)?t:"system",e.forEach(e=>e.parentElement.dataset.theme=t),localStorage.setItem("color-theme",t)}function t(e){setTheme(e),i(e)}const a="color-theme"in localStorage?localStorage.getItem("color-theme"):n;t(a),o.forEach(e=>{e.addEventListener("click",function(n){n.preventDefault(),t(e.dataset.item)})}),e.forEach(e=>{e.addEventListener("click",function(t){t.preventDefault(),toggleMenu(e)})}),window.addEventListener("resize",()=>e.forEach(resizeMenu)),document.addEventListener("click",t=>{t.target.closest(".hextra-theme-toggle")===null&&e.forEach(e=>{e.dataset.state="closed",e.nextElementSibling.classList.add("hx:hidden")})}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{localStorage.getItem("color-theme")==="system"&&setTheme("system")})})(),function(){const e=document.querySelector(".hextra-banner");document.documentElement.style.setProperty("--hextra-banner-height",e.clientHeight+"px");const t=e.querySelector(".hextra-banner-close-button");t.addEventListener("click",()=>{document.documentElement.classList.add("hextra-banner-hidden"),document.documentElement.style.setProperty("--hextra-banner-height","0px"),localStorage.setItem("announcement-v2_4","0")})}(),document.addEventListener("DOMContentLoaded",function(){const t=document.querySelector(".hextra-hamburger-menu"),e=document.querySelector(".hextra-sidebar-container");function n(){t.querySelector("svg").classList.toggle("open"),e.classList.toggle("hx:max-md:[transform:translate3d(0,-100%,0)]"),e.classList.toggle("hx:max-md:[transform:translate3d(0,0,0)]"),document.body.classList.toggle("hx:overflow-hidden"),document.body.classList.toggle("hx:md:overflow-auto")}t.addEventListener("click",e=>{e.preventDefault(),n()});const s=e.querySelectorAll("a");s.forEach(e=>{e.addEventListener("click",t=>{e.getAttribute("href")&&e.getAttribute("href").startsWith("#")&&window.innerWidth<768&&n()})})}),document.addEventListener("DOMContentLoaded",function(){const e=()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.innerHTML=` + + `,e.setAttribute("fill","none"),e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e},t=()=>{const e=document.createElementNS("http://www.w3.org/2000/svg","svg");return e.innerHTML=` + + `,e.setAttribute("fill","none"),e.setAttribute("viewBox","0 0 24 24"),e.setAttribute("stroke","currentColor"),e.setAttribute("stroke-width","2"),e};document.querySelectorAll(".hextra-code-copy-btn").forEach(function(n){n.querySelector(".hextra-copy-icon")?.appendChild(e()),n.querySelector(".hextra-success-icon")?.appendChild(t()),n.addEventListener("click",function(e){e.preventDefault();const s=n.parentElement.previousElementSibling;let t;if(s.tagName==="CODE")t=s;else{const e=s.querySelectorAll("code");t=e[e.length-1]}if(t){let e=t.innerText;"lang"in t.dataset&&(e=e.replace(/\n\n/g,` +`)),navigator.clipboard.writeText(e).then(function(){n.classList.add("copied"),setTimeout(function(){n.classList.remove("copied")},1e3)}).catch(function(e){console.error("Failed to copy text: ",e)})}else console.error("Target element not found")})})}),function(){function e(e,t){const s=Array.from(e.querySelectorAll(".hextra-tabs-toggle"));s.forEach((e,n)=>{e.dataset.state=n===t?"selected":"",n===t?(e.setAttribute("aria-selected","true"),e.tabIndex=0):(e.removeAttribute("aria-selected"),e.removeAttribute("tabindex"))});const n=e.parentElement.nextElementSibling;if(!n)return;Array.from(n.children).forEach((e,n)=>{e.dataset.state=n===t?"selected":"",n===t?e.tabIndex=0:e.removeAttribute("tabindex")})}const t=document.querySelectorAll("[data-tab-group]");t.forEach(t=>{const s=encodeURIComponent(t.dataset.tabGroup),n=localStorage.getItem("hextra-tab-"+s);n!==null&&e(t,parseInt(n,10))}),document.querySelectorAll(".hextra-tabs-toggle").forEach(t=>{t.addEventListener("click",function(t){const n=t.target.parentElement,s=Array.from(n.querySelectorAll(".hextra-tabs-toggle")).indexOf(t.target);if(n.dataset.tabGroup){const t=n.dataset.tabGroup,o=encodeURIComponent(t);document.querySelectorAll('[data-tab-group="'+t+'"]').forEach(t=>e(t,s)),localStorage.setItem("hextra-tab-"+o,s.toString())}else e(n,s)})})}(),function(){const e=document.querySelectorAll(".hextra-language-switcher");e.forEach(e=>{e.addEventListener("click",t=>{t.preventDefault(),e.dataset.state=e.dataset.state==="open"?"closed":"open",toggleMenu(e)})}),window.addEventListener("resize",()=>e.forEach(resizeMenu)),document.addEventListener("click",t=>{t.target.closest(".hextra-language-switcher")===null&&e.forEach(e=>{e.dataset.state="closed";const t=e.nextElementSibling;t.classList.add("hx:hidden")})})}(),function(){const e="hx:hidden",t=document.querySelectorAll(".hextra-nav-menu-toggle");t.forEach(n=>{n.addEventListener("click",s=>{s.preventDefault(),s.stopPropagation(),t.forEach(t=>{if(t!==n){t.dataset.state="closed";const n=t.nextElementSibling;n.classList.add(e)}});const i=n.dataset.state==="open";n.dataset.state=i?"closed":"open";const o=n.nextElementSibling;i?o.classList.add(e):(o.style.position="absolute",o.style.top="100%",o.style.left="50%",o.style.transform="translateX(-50%)",o.style.zIndex="1000",o.classList.remove(e))})}),document.addEventListener("click",n=>{n.target.closest(".hextra-nav-menu-toggle")===null&&t.forEach(t=>{t.dataset.state="closed";const n=t.nextElementSibling;n.classList.add(e)})}),document.addEventListener("keydown",n=>{n.key==="Escape"&&t.forEach(t=>{t.dataset.state="closed";const n=t.nextElementSibling;n.classList.add(e)})})}(),document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll(".hextra-filetree-folder");e.forEach(function(e){e.addEventListener("click",function(){Array.from(e.children).forEach(function(e){e.dataset.state=e.dataset.state==="open"?"closed":"open"}),e.nextElementSibling.dataset.state=e.nextElementSibling.dataset.state==="open"?"closed":"open"})})}),document.addEventListener("DOMContentLoaded",function(){scrollToActiveItem(),enableCollapsibles()});function enableCollapsibles(){const e=document.querySelectorAll(".hextra-sidebar-collapsible-button");e.forEach(function(e){e.addEventListener("click",function(t){t.preventDefault();const n=e.parentElement.parentElement;n&&n.classList.toggle("open")})})}function scrollToActiveItem(){const t=document.querySelector("aside.hextra-sidebar-container > .hextra-scrollbar"),n=document.querySelectorAll(".hextra-sidebar-active-item"),e=Array.from(n).find(function(e){return e.getBoundingClientRect().height>0});if(!e)return;const s=e.clientHeight,o=e.getBoundingClientRect().top-t.getBoundingClientRect().top;t.scrollTo({behavior:"instant",top:o-s})}document.addEventListener("DOMContentLoaded",function(){const e=document.querySelector("#backToTop");e&&document.addEventListener("scroll",t=>{window.scrollY>300?e.classList.remove("hx:opacity-0"):e.classList.add("hx:opacity-0")})});function scrollUp(){window.scroll({top:0,left:0,behavior:"smooth"})}document.addEventListener("DOMContentLoaded",function(){const t=document.querySelector(".hextra-toc");if(!t)return;const s=t.querySelectorAll('a[href^="#"]');if(s.length===0)return;const a=Array.from(s).map(e=>e.getAttribute("href").substring(1)),o=a.map(e=>document.getElementById(decodeURIComponent(e))).filter(Boolean);if(o.length===0)return;let e=null,n=!1;const r=new IntersectionObserver(s=>{if(n)return;const i=s.filter(e=>e.isIntersecting).map(e=>e.target);if(i.length===0)return;const a=i.reduce((e,t)=>{const n=t.getBoundingClientRect().top,s=e.getBoundingClientRect().top;return(n<0?-n:n)<(s<0?-s:s)?t:e}),r=encodeURIComponent(a.id).toLowerCase(),o=t.querySelector(`a[href="#${r}"]`);o&&o!==e&&(e&&e.classList.remove("hextra-toc-active"),o.classList.add("hextra-toc-active"),e=o)},{rootMargin:"-20px 0px -60% 0px",threshold:[0,.1,.5,1]});o.forEach(e=>r.observe(e));function i(){const s=window.location.hash;if(s){const o=t.querySelector(`a[href="https://github.com/$%7Bs%7D"]`);if(o){n=!0,e&&e.classList.remove("hextra-toc-active"),o.classList.add("hextra-toc-active"),e=o,setTimeout(()=>{n=!1},500);return}}}window.addEventListener("hashchange",i),setTimeout(i,100)}),function(){const e=document.getElementById("favicon-svg"),n="true"==="true";if(e&&n){const s="/favicon.svg",o="/favicon-dark.svg",n=window.matchMedia("(prefers-color-scheme: dark)");function t(t){e.href=t.matches?o:s}t(n),n.addEventListener("change",t)}}() \ No newline at end of file diff --git a/js/mermaid.min.07e37dfa97b337ccc85365d57eddf99b9706f09db3b59b260d0333b23b343c4b.js b/js/mermaid.min.07e37dfa97b337ccc85365d57eddf99b9706f09db3b59b260d0333b23b343c4b.js new file mode 100644 index 000000000000..0f033c79e81c --- /dev/null +++ b/js/mermaid.min.07e37dfa97b337ccc85365d57eddf99b9706f09db3b59b260d0333b23b343c4b.js @@ -0,0 +1,2811 @@ +"use strict";var __esbuild_esm_mermaid_nm;(__esbuild_esm_mermaid_nm||={}).mermaid=(()=>{var V3e=Object.create;var _y=Object.defineProperty;var U3e=Object.getOwnPropertyDescriptor;var H3e=Object.getOwnPropertyNames;var q3e=Object.getPrototypeOf,W3e=Object.prototype.hasOwnProperty;var o=(t,e)=>_y(t,"name",{value:e,configurable:!0});var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var Da=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),dr=(t,e)=>{for(var r in e)_y(t,r,{get:e[r],enumerable:!0})},q4=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of H3e(e))!W3e.call(t,i)&&i!==r&&_y(t,i,{get:()=>e[i],enumerable:!(n=U3e(e,i))||n.enumerable});return t},Lr=(t,e,r)=>(q4(t,e,"default"),r&&q4(r,e,"default")),ja=(t,e,r)=>(r=t!=null?V3e(q3e(t)):{},q4(e||!t||!t.__esModule?_y(r,"default",{value:t,enumerable:!0}):r,t)),Y3e=t=>q4(_y({},"__esModule",{value:!0}),t);var X3e,y0,t7,Uz,W4=N(()=>{"use strict";X3e=Object.freeze({left:0,top:0,width:16,height:16}),y0=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),t7=Object.freeze({...X3e,...y0}),Uz=Object.freeze({...t7,body:"",hidden:!1})});var j3e,Hz,qz=N(()=>{"use strict";W4();j3e=Object.freeze({width:null,height:null}),Hz=Object.freeze({...j3e,...y0})});var r7,Y4,Wz=N(()=>{"use strict";r7=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!Y4(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!Y4(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!Y4(l,r)?null:l}return null},"stringToIcon"),Y4=o((t,e)=>t?!!((e&&t.prefix===""||t.prefix)&&t.name):!1,"validateIconName")});function Yz(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var Xz=N(()=>{"use strict";o(Yz,"mergeIconTransformations")});function n7(t,e){let r=Yz(t,e);for(let n in Uz)n in y0?n in t&&!(n in r)&&(r[n]=y0[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var jz=N(()=>{"use strict";W4();Xz();o(n7,"mergeIconData")});function Kz(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var Qz=N(()=>{"use strict";o(Kz,"getIconsTree")});function Zz(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=n7(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),n7(t,a)}function i7(t,e){if(t.icons[e])return Zz(t,e,[]);let r=Kz(t,[e])[e];return r?Zz(t,e,r):null}var Jz=N(()=>{"use strict";jz();Qz();o(Zz,"internalGetIconData");o(i7,"getIconData")});function a7(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(K3e);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=Q3e.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var K3e,Q3e,eG=N(()=>{"use strict";K3e=/(-?[0-9.]*[0-9]+[0-9.]*)/g,Q3e=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(a7,"calculateSize")});function Z3e(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function J3e(t,e){return t?""+t+""+e:e}function tG(t,e,r){let n=Z3e(t);return J3e(n.defs,e+n.content+r)}var rG=N(()=>{"use strict";o(Z3e,"splitSVGDefs");o(J3e,"mergeDefsAndContent");o(tG,"wrapSVGContent")});function s7(t,e){let r={...t7,...t},n={...Hz,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,T=y.rotate;x?b?T+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let S;switch(T<0&&(T-=Math.floor(T/4)*4),T=T%4,T){case 1:S=i.height/2+i.top,v.unshift("rotate(90 "+S.toString()+" "+S.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:S=i.width/2+i.left,v.unshift("rotate(-90 "+S.toString()+" "+S.toString()+")");break}T%2===1&&(i.left!==i.top&&(S=i.left,i.left=i.top,i.top=S),i.width!==i.height&&(S=i.width,i.width=i.height,i.height=S)),v.length&&(a=tG(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=a7(d,u/h)):(f=s==="auto"?u:s,d=l===null?a7(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{e5e(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var e5e,nG=N(()=>{"use strict";W4();qz();eG();rG();e5e=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(s7,"iconToSVG")});function o7(t,e=r5e){let r=[],n;for(;n=t5e.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(n5e++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var t5e,r5e,n5e,iG=N(()=>{"use strict";t5e=/\sid="(\S+)"/g,r5e="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),n5e=0;o(o7,"replaceIDs")});function l7(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var aG=N(()=>{"use strict";o(l7,"iconToHTML")});var sG=N(()=>{"use strict";Wz();Jz();nG();iG();aG()});var c7,Rn,v0=N(()=>{"use strict";c7=o((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>c7(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=c7(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Rn=c7});var X4=Da((u7,h7)=>{"use strict";(function(t,e){typeof u7=="object"&&typeof h7<"u"?h7.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(u7,(function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(E){var D=["th","st","nd","rd"],_=E%100;return"["+E+(D[(_-20)%10]||D[_]||D[0])+"]"},"ordinal")},x=o(function(E,D,_){var O=String(E);return!O||O.length>=D?E:""+Array(D+1-O.length).join(_)+E},"m"),b={s:x,z:o(function(E){var D=-E.utcOffset(),_=Math.abs(D),O=Math.floor(_/60),M=_%60;return(D<=0?"+":"-")+x(O,2,"0")+":"+x(M,2,"0")},"z"),m:o(function E(D,_){if(D.date()<_.date())return-E(_,D);var O=12*(_.year()-D.year())+(_.month()-D.month()),M=D.clone().add(O,h),P=_-M<0,B=D.clone().add(O+(P?-1:1),h);return+(-(O+(_-M)/(P?M-B:B-M))||0)},"t"),a:o(function(E){return E<0?Math.ceil(E)||0:Math.floor(E)},"a"),p:o(function(E){return{M:h,y:d,w:u,d:l,D:p,h:s,m:a,s:i,ms:n,Q:f}[E]||String(E||"").toLowerCase().replace(/s$/,"")},"p"),u:o(function(E){return E===void 0},"u")},T="en",S={};S[T]=v;var w="$isDayjsObject",k=o(function(E){return E instanceof I||!(!E||!E[w])},"S"),A=o(function E(D,_,O){var M;if(!D)return T;if(typeof D=="string"){var P=D.toLowerCase();S[P]&&(M=P),_&&(S[P]=_,M=P);var B=D.split("-");if(!M&&B.length>1)return E(B[0])}else{var F=D.name;S[F]=D,M=F}return!O&&M&&(T=M),M||!O&&T},"t"),C=o(function(E,D){if(k(E))return E.clone();var _=typeof D=="object"?D:{};return _.date=E,_.args=arguments,new I(_)},"O"),R=b;R.l=A,R.i=k,R.w=function(E,D){return C(E,{locale:D.$L,utc:D.$u,x:D.$x,$offset:D.$offset})};var I=(function(){function E(_){this.$L=A(_.locale,null,!0),this.parse(_),this.$x=this.$x||_.x||{},this[w]=!0}o(E,"M");var D=E.prototype;return D.parse=function(_){this.$d=(function(O){var M=O.date,P=O.utc;if(M===null)return new Date(NaN);if(R.u(M))return new Date;if(M instanceof Date)return new Date(M);if(typeof M=="string"&&!/Z$/i.test(M)){var B=M.match(g);if(B){var F=B[2]-1||0,G=(B[7]||"0").substring(0,3);return P?new Date(Date.UTC(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,G)):new Date(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,G)}}return new Date(M)})(_),this.init()},D.init=function(){var _=this.$d;this.$y=_.getFullYear(),this.$M=_.getMonth(),this.$D=_.getDate(),this.$W=_.getDay(),this.$H=_.getHours(),this.$m=_.getMinutes(),this.$s=_.getSeconds(),this.$ms=_.getMilliseconds()},D.$utils=function(){return R},D.isValid=function(){return this.$d.toString()!==m},D.isSame=function(_,O){var M=C(_);return this.startOf(O)<=M&&M<=this.endOf(O)},D.isAfter=function(_,O){return C(_){"use strict";oG=ja(X4(),1),au={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},X={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},Dy=o(function(t="fatal"){let e=au.fatal;typeof t=="string"?t.toLowerCase()in au&&(e=au[t]):typeof t=="number"&&(e=t),X.trace=()=>{},X.debug=()=>{},X.info=()=>{},X.warn=()=>{},X.error=()=>{},X.fatal=()=>{},e<=au.fatal&&(X.fatal=console.error?console.error.bind(console,Eo("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",Eo("FATAL"))),e<=au.error&&(X.error=console.error?console.error.bind(console,Eo("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",Eo("ERROR"))),e<=au.warn&&(X.warn=console.warn?console.warn.bind(console,Eo("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",Eo("WARN"))),e<=au.info&&(X.info=console.info?console.info.bind(console,Eo("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",Eo("INFO"))),e<=au.debug&&(X.debug=console.debug?console.debug.bind(console,Eo("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Eo("DEBUG"))),e<=au.trace&&(X.trace=console.debug?console.debug.bind(console,Eo("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Eo("TRACE")))},"setLogLevel"),Eo=o(t=>`%c${(0,oG.default)().format("ss.SSS")} : ${t} : `,"format")});var j4,lG,cG=N(()=>{"use strict";j4={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:o(t=>t>=255?255:t<0?0:t,"r"),g:o(t=>t>=255?255:t<0?0:t,"g"),b:o(t=>t>=255?255:t<0?0:t,"b"),h:o(t=>t%360,"h"),s:o(t=>t>=100?100:t<0?0:t,"s"),l:o(t=>t>=100?100:t<0?0:t,"l"),a:o(t=>t>=1?1:t<0?0:t,"a")},toLinear:o(t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},"toLinear"),hue2rgb:o((t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<.16666666666666666?t+(e-t)*6*r:r<.5?e:r<.6666666666666666?t+(e-t)*(.6666666666666666-r)*6:t),"hue2rgb"),hsl2rgb:o(({h:t,s:e,l:r},n)=>{if(!e)return r*2.55;t/=360,e/=100,r/=100;let i=r<.5?r*(1+e):r+e-r*e,a=2*r-i;switch(n){case"r":return j4.hue2rgb(a,i,t+.3333333333333333)*255;case"g":return j4.hue2rgb(a,i,t)*255;case"b":return j4.hue2rgb(a,i,t-.3333333333333333)*255}},"hsl2rgb"),rgb2hsl:o(({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;let i=Math.max(t,e,r),a=Math.min(t,e,r),s=(i+a)/2;if(n==="l")return s*100;if(i===a)return 0;let l=i-a,u=s>.5?l/(2-i-a):l/(i+a);if(n==="s")return u*100;switch(i){case t:return((e-r)/l+(e{"use strict";i5e={clamp:o((t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),"clamp"),round:o(t=>Math.round(t*1e10)/1e10,"round")},uG=i5e});var a5e,fG,dG=N(()=>{"use strict";a5e={dec2hex:o(t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`},"dec2hex")},fG=a5e});var s5e,Kt,Xl=N(()=>{"use strict";cG();hG();dG();s5e={channel:lG,lang:uG,unit:fG},Kt=s5e});var su,Ni,Ly=N(()=>{"use strict";Xl();su={};for(let t=0;t<=255;t++)su[t]=Kt.unit.dec2hex(t);Ni={ALL:0,RGB:1,HSL:2}});var f7,pG,mG=N(()=>{"use strict";Ly();f7=class{static{o(this,"Type")}constructor(){this.type=Ni.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Ni.ALL}is(e){return this.type===e}},pG=f7});var d7,gG,yG=N(()=>{"use strict";Xl();mG();Ly();d7=class{static{o(this,"Channels")}constructor(e,r){this.color=r,this.changed=!1,this.data=e,this.type=new pG}set(e,r){return this.color=r,this.changed=!1,this.data=e,this.type.type=Ni.ALL,this}_ensureHSL(){let e=this.data,{h:r,s:n,l:i}=e;r===void 0&&(e.h=Kt.channel.rgb2hsl(e,"h")),n===void 0&&(e.s=Kt.channel.rgb2hsl(e,"s")),i===void 0&&(e.l=Kt.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r,g:n,b:i}=e;r===void 0&&(e.r=Kt.channel.hsl2rgb(e,"r")),n===void 0&&(e.g=Kt.channel.hsl2rgb(e,"g")),i===void 0&&(e.b=Kt.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,r=e.r;return!this.type.is(Ni.HSL)&&r!==void 0?r:(this._ensureHSL(),Kt.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,r=e.g;return!this.type.is(Ni.HSL)&&r!==void 0?r:(this._ensureHSL(),Kt.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,r=e.b;return!this.type.is(Ni.HSL)&&r!==void 0?r:(this._ensureHSL(),Kt.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,r=e.h;return!this.type.is(Ni.RGB)&&r!==void 0?r:(this._ensureRGB(),Kt.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,r=e.s;return!this.type.is(Ni.RGB)&&r!==void 0?r:(this._ensureRGB(),Kt.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,r=e.l;return!this.type.is(Ni.RGB)&&r!==void 0?r:(this._ensureRGB(),Kt.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(Ni.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Ni.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Ni.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Ni.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Ni.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Ni.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},gG=d7});var o5e,fh,Ry=N(()=>{"use strict";yG();o5e=new gG({r:0,g:0,b:0,a:0},"transparent"),fh=o5e});var vG,od,p7=N(()=>{"use strict";Ry();Ly();vG={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:o(t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(vG.re);if(!e)return;let r=e[1],n=parseInt(r,16),i=r.length,a=i%4===0,s=i>4,l=s?1:17,u=s?8:4,h=a?0:-1,f=s?255:15;return fh.set({r:(n>>u*(h+3)&f)*l,g:(n>>u*(h+2)&f)*l,b:(n>>u*(h+1)&f)*l,a:a?(n&f)*l/255:1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`#${su[Math.round(e)]}${su[Math.round(r)]}${su[Math.round(n)]}${su[Math.round(i*255)]}`:`#${su[Math.round(e)]}${su[Math.round(r)]}${su[Math.round(n)]}`},"stringify")},od=vG});var K4,Ny,xG=N(()=>{"use strict";Xl();Ry();K4={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:o(t=>{let e=t.match(K4.hueRe);if(e){let[,r,n]=e;switch(n){case"grad":return Kt.channel.clamp.h(parseFloat(r)*.9);case"rad":return Kt.channel.clamp.h(parseFloat(r)*180/Math.PI);case"turn":return Kt.channel.clamp.h(parseFloat(r)*360)}}return Kt.channel.clamp.h(parseFloat(t))},"_hue2deg"),parse:o(t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let r=t.match(K4.re);if(!r)return;let[,n,i,a,s,l]=r;return fh.set({h:K4._hue2deg(n),s:Kt.channel.clamp.s(parseFloat(i)),l:Kt.channel.clamp.l(parseFloat(a)),a:s?Kt.channel.clamp.a(l?parseFloat(s)/100:parseFloat(s)):1},t)},"parse"),stringify:o(t=>{let{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${Kt.lang.round(e)}, ${Kt.lang.round(r)}%, ${Kt.lang.round(n)}%, ${i})`:`hsl(${Kt.lang.round(e)}, ${Kt.lang.round(r)}%, ${Kt.lang.round(n)}%)`},"stringify")},Ny=K4});var Q4,m7,bG=N(()=>{"use strict";p7();Q4={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:o(t=>{t=t.toLowerCase();let e=Q4.colors[t];if(e)return od.parse(e)},"parse"),stringify:o(t=>{let e=od.stringify(t);for(let r in Q4.colors)if(Q4.colors[r]===e)return r},"stringify")},m7=Q4});var TG,My,wG=N(()=>{"use strict";Xl();Ry();TG={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:o(t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let r=t.match(TG.re);if(!r)return;let[,n,i,a,s,l,u,h,f]=r;return fh.set({r:Kt.channel.clamp.r(i?parseFloat(n)*2.55:parseFloat(n)),g:Kt.channel.clamp.g(s?parseFloat(a)*2.55:parseFloat(a)),b:Kt.channel.clamp.b(u?parseFloat(l)*2.55:parseFloat(l)),a:h?Kt.channel.clamp.a(f?parseFloat(h)/100:parseFloat(h)):1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${Kt.lang.round(e)}, ${Kt.lang.round(r)}, ${Kt.lang.round(n)}, ${Kt.lang.round(i)})`:`rgb(${Kt.lang.round(e)}, ${Kt.lang.round(r)}, ${Kt.lang.round(n)})`},"stringify")},My=TG});var l5e,Mi,ou=N(()=>{"use strict";p7();xG();bG();wG();Ly();l5e={format:{keyword:m7,hex:od,rgb:My,rgba:My,hsl:Ny,hsla:Ny},parse:o(t=>{if(typeof t!="string")return t;let e=od.parse(t)||My.parse(t)||Ny.parse(t)||m7.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},"parse"),stringify:o(t=>!t.changed&&t.color?t.color:t.type.is(Ni.HSL)||t.data.r===void 0?Ny.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?My.stringify(t):od.stringify(t),"stringify")},Mi=l5e});var c5e,Z4,g7=N(()=>{"use strict";Xl();ou();c5e=o((t,e)=>{let r=Mi.parse(t);for(let n in e)r[n]=Kt.channel.clamp[n](e[n]);return Mi.stringify(r)},"change"),Z4=c5e});var u5e,Ka,y7=N(()=>{"use strict";Xl();Ry();ou();g7();u5e=o((t,e,r=0,n=1)=>{if(typeof t!="number")return Z4(t,{a:e});let i=fh.set({r:Kt.channel.clamp.r(t),g:Kt.channel.clamp.g(e),b:Kt.channel.clamp.b(r),a:Kt.channel.clamp.a(n)});return Mi.stringify(i)},"rgba"),Ka=u5e});var h5e,ld,kG=N(()=>{"use strict";Xl();ou();h5e=o((t,e)=>Kt.lang.round(Mi.parse(t)[e]),"channel"),ld=h5e});var f5e,EG,SG=N(()=>{"use strict";Xl();ou();f5e=o(t=>{let{r:e,g:r,b:n}=Mi.parse(t),i=.2126*Kt.channel.toLinear(e)+.7152*Kt.channel.toLinear(r)+.0722*Kt.channel.toLinear(n);return Kt.lang.round(i)},"luminance"),EG=f5e});var d5e,CG,AG=N(()=>{"use strict";SG();d5e=o(t=>EG(t)>=.5,"isLight"),CG=d5e});var p5e,sa,_G=N(()=>{"use strict";AG();p5e=o(t=>!CG(t),"isDark"),sa=p5e});var m5e,J4,v7=N(()=>{"use strict";Xl();ou();m5e=o((t,e,r)=>{let n=Mi.parse(t),i=n[e],a=Kt.channel.clamp[e](i+r);return i!==a&&(n[e]=a),Mi.stringify(n)},"adjustChannel"),J4=m5e});var g5e,Rt,DG=N(()=>{"use strict";v7();g5e=o((t,e)=>J4(t,"l",e),"lighten"),Rt=g5e});var y5e,Pt,LG=N(()=>{"use strict";v7();y5e=o((t,e)=>J4(t,"l",-e),"darken"),Pt=y5e});var v5e,Pe,RG=N(()=>{"use strict";ou();g7();v5e=o((t,e)=>{let r=Mi.parse(t),n={};for(let i in e)e[i]&&(n[i]=r[i]+e[i]);return Z4(t,n)},"adjust"),Pe=v5e});var x5e,NG,MG=N(()=>{"use strict";ou();y7();x5e=o((t,e,r=50)=>{let{r:n,g:i,b:a,a:s}=Mi.parse(t),{r:l,g:u,b:h,a:f}=Mi.parse(e),d=r/100,p=d*2-1,m=s-f,y=((p*m===-1?p:(p+m)/(1+p*m))+1)/2,v=1-y,x=n*y+l*v,b=i*y+u*v,T=a*y+h*v,S=s*d+f*(1-d);return Ka(x,b,T,S)},"mix"),NG=x5e});var b5e,Et,IG=N(()=>{"use strict";ou();MG();b5e=o((t,e=100)=>{let r=Mi.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,NG(r,t,e)},"invert"),Et=b5e});var OG=N(()=>{"use strict";y7();kG();_G();DG();LG();RG();IG()});var eo=N(()=>{"use strict";OG()});var dh,ph,Iy=N(()=>{"use strict";dh="#ffffff",ph="#f2f2f2"});var wi,x0=N(()=>{"use strict";eo();wi=o((t,e)=>e?Pe(t,{s:-40,l:10}):Pe(t,{s:-40,l:-10}),"mkBorder")});var b7,PG,BG=N(()=>{"use strict";eo();Iy();x0();b7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Pe(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Pe(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||wi(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||wi(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||Et(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||Et(this.tertiaryColor),this.lineColor=this.lineColor||Et(this.background),this.arrowheadColor=this.arrowheadColor||Et(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?Pt(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||Pt(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||Et(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||Rt(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||Pt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Pt(this.mainBkg,10)):(this.rowOdd=this.rowOdd||Rt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||Rt(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330}),this.darkMode)for(let r=0;r{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},PG=o(t=>{let e=new b7;return e.calculate(t),e},"getThemeVariables")});var T7,FG,$G=N(()=>{"use strict";eo();x0();T7=class{static{o(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=Rt(this.primaryColor,16),this.tertiaryColor=Pe(this.primaryColor,{h:-160}),this.primaryBorderColor=Et(this.background),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.tertiaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=Rt(Et("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=Ka(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=Pt("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=Pt(this.sectionBkgColor,10),this.taskBorderColor=Ka(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=Ka(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Rt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Pt(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=Rt(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=Rt(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=Rt(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Pe(this.primaryColor,{h:64}),this.fillType3=Pe(this.secondaryColor,{h:64}),this.fillType4=Pe(this.primaryColor,{h:-64}),this.fillType5=Pe(this.secondaryColor,{h:-64}),this.fillType6=Pe(this.primaryColor,{h:128}),this.fillType7=Pe(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330});for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},FG=o(t=>{let e=new T7;return e.calculate(t),e},"getThemeVariables")});var w7,mh,Oy=N(()=>{"use strict";eo();x0();Iy();w7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Pe(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Pe(this.primaryColor,{h:-160}),this.primaryBorderColor=wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.tertiaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=Ka(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Pt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Pt(this.tertiaryColor,40);for(let e=0;e{this[n]==="calculated"&&(this[n]=void 0)}),typeof e!="object"){this.updateColors();return}let r=Object.keys(e);r.forEach(n=>{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},mh=o(t=>{let e=new w7;return e.calculate(t),e},"getThemeVariables")});var k7,zG,GG=N(()=>{"use strict";eo();Iy();x0();k7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=Rt("#cde498",10),this.primaryBorderColor=wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.primaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=Pt(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Pe(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Pe(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Pe(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Pe(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Pe(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Pe(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Pe(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Pe(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Pe(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Pt(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Pt(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},zG=o(t=>{let e=new k7;return e.calculate(t),e},"getThemeVariables")});var E7,VG,UG=N(()=>{"use strict";eo();x0();Iy();E7=class{static{o(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=Rt(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Pe(this.primaryColor,{h:-160}),this.primaryBorderColor=wi(this.primaryColor,this.darkMode),this.secondaryBorderColor=wi(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=wi(this.tertiaryColor,this.darkMode),this.primaryTextColor=Et(this.primaryColor),this.secondaryTextColor=Et(this.secondaryColor),this.tertiaryTextColor=Et(this.tertiaryColor),this.lineColor=Et(this.background),this.textColor=Et(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Rt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=Rt(this.contrast,55),this.border2=this.contrast,this.actorBorder=Rt(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},VG=o(t=>{let e=new E7;return e.calculate(t),e},"getThemeVariables")});var So,e3=N(()=>{"use strict";BG();$G();Oy();GG();UG();So={base:{getThemeVariables:PG},dark:{getThemeVariables:FG},default:{getThemeVariables:mh},forest:{getThemeVariables:zG},neutral:{getThemeVariables:VG}}});var ul,HG=N(()=>{"use strict";ul={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200,layoutAlgorithm:"cose-bilkent"},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}});var qG,WG,YG,ur,La=N(()=>{"use strict";e3();HG();qG={...ul,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF",forceNodeModelOrder:!1,considerModelOrder:"NODES_AND_EDGES"},themeCSS:void 0,themeVariables:So.default.getThemeVariables(),sequence:{...ul.sequence,messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:o(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:o(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...ul.gantt,tickInterval:void 0,useWidth:void 0},c4:{...ul.c4,useWidth:void 0,personFont:o(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:{...ul.flowchart,inheritDir:!1},external_personFont:o(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:o(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:o(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:o(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:o(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:o(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:o(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:o(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:o(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:o(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:o(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:o(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:o(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:o(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:o(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:o(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:o(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:o(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:o(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:o(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...ul.pie,useWidth:984},xyChart:{...ul.xyChart,useWidth:void 0},requirement:{...ul.requirement,useWidth:void 0},packet:{...ul.packet},radar:{...ul.radar},treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","}},WG=o((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...WG(t[n],"")]:[...r,e+n],[]),"keyify"),YG=new Set(WG(qG,"")),ur=qG});var b0,T5e,S7=N(()=>{"use strict";La();pt();b0=o(t=>{if(X.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>b0(e));return}for(let e of Object.keys(t)){if(X.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!YG.has(e)||t[e]==null){X.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){X.debug("sanitizing object",e),b0(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(X.debug("sanitizing css option",e),t[e]=T5e(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}X.debug("After sanitization",t)}},"sanitizeDirective"),T5e=o(t=>{let e=0,r=0;for(let n of t){if(e{"use strict";v0();pt();e3();La();S7();gh=Object.freeze(ur),Es=Rn({},gh),cd=[],Py=Rn({},gh),r3=o((t,e)=>{let r=Rn({},t),n={};for(let i of e)QG(i),n=Rn(n,i);if(r=Rn(r,n),n.theme&&n.theme in So){let i=Rn({},t3),a=Rn(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in So&&(r.themeVariables=So[r.theme].getThemeVariables(a))}return Py=r,JG(Py),Py},"updateCurrentConfig"),C7=o(t=>(Es=Rn({},gh),Es=Rn(Es,t),t.theme&&So[t.theme]&&(Es.themeVariables=So[t.theme].getThemeVariables(t.themeVariables)),r3(Es,cd),Es),"setSiteConfig"),jG=o(t=>{t3=Rn({},t)},"saveConfigFromInitialize"),KG=o(t=>(Es=Rn(Es,t),r3(Es,cd),Es),"updateSiteConfig"),A7=o(()=>Rn({},Es),"getSiteConfig"),n3=o(t=>(JG(t),Rn(Py,t),Qt()),"setConfig"),Qt=o(()=>Rn({},Py),"getConfig"),QG=o(t=>{t&&(["secure",...Es.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(X.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&QG(t[e])}))},"sanitize"),ZG=o(t=>{b0(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),cd.push(t),r3(Es,cd)},"addDirective"),By=o((t=Es)=>{cd=[],r3(t,cd)},"reset"),w5e={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},XG={},k5e=o(t=>{XG[t]||(X.warn(w5e[t]),XG[t]=!0)},"issueWarning"),JG=o(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&k5e("LAZY_LOAD_DEPRECATED")},"checkConfig"),eV=o(()=>{let t={};t3&&(t=Rn(t,t3));for(let e of cd)t=Rn(t,e);return t},"getUserDefinedConfig")});function Ja(t){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:s3;tV&&tV(t,null);let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){let a=r(i);a!==i&&(E5e(e)||(e[n]=a),i=a)}t[i]=!0}return t}function N5e(t){for(let e=0;e0&&arguments[0]!==void 0?arguments[0]:U5e(),e=o(Ct=>pV(Ct),"DOMPurify");if(e.version="3.2.6",e.removed=[],!t||!t.document||t.document.nodeType!==Vy.document||!t.Element)return e.isSupported=!1,e;let{document:r}=t,n=r,i=n.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:l,Element:u,NodeFilter:h,NamedNodeMap:f=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:d,DOMParser:p,trustedTypes:m}=t,g=u.prototype,y=Gy(g,"cloneNode"),v=Gy(g,"remove"),x=Gy(g,"nextSibling"),b=Gy(g,"childNodes"),T=Gy(g,"parentNode");if(typeof s=="function"){let Ct=r.createElement("template");Ct.content&&Ct.content.ownerDocument&&(r=Ct.content.ownerDocument)}let S,w="",{implementation:k,createNodeIterator:A,createDocumentFragment:C,getElementsByTagName:R}=r,{importNode:I}=n,L=cV();e.isSupported=typeof uV=="function"&&typeof T=="function"&&k&&k.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:E,ERB_EXPR:D,TMPLIT_EXPR:_,DATA_ATTR:O,ARIA_ATTR:M,IS_SCRIPT_OR_DATA:P,ATTR_WHITESPACE:B,CUSTOM_ELEMENT:F}=lV,{IS_ALLOWED_URI:G}=lV,$=null,U=Nr({},[...iV,...D7,...L7,...R7,...aV]),j=null,te=Nr({},[...sV,...N7,...oV,...a3]),Y=Object.seal(hV(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),oe=null,J=null,ue=!0,re=!0,ee=!1,Z=!0,K=!1,ae=!0,Q=!1,de=!1,ne=!1,Te=!1,q=!1,Ve=!1,pe=!0,Be=!1,Ye="user-content-",He=!0,Le=!1,Ie={},Ne=null,Ce=Nr({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),Fe=null,fe=Nr({},["audio","video","img","source","image","track"]),xe=null,W=Nr({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),he="http://www.w3.org/1998/Math/MathML",z="http://www.w3.org/2000/svg",se="http://www.w3.org/1999/xhtml",le=se,ke=!1,ve=null,ye=Nr({},[he,z,se],_7),Re=Nr({},["mi","mo","mn","ms","mtext"]),_e=Nr({},["annotation-xml"]),ze=Nr({},["title","style","font","a","script"]),Ke=null,xt=["application/xhtml+xml","text/html"],We="text/html",Oe=null,et=null,Ue=r.createElement("form"),lt=o(function(Se){return Se instanceof RegExp||Se instanceof Function},"isRegexOrFunction"),Gt=o(function(){let Se=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(et&&et===Se)){if((!Se||typeof Se!="object")&&(Se={}),Se=lu(Se),Ke=xt.indexOf(Se.PARSER_MEDIA_TYPE)===-1?We:Se.PARSER_MEDIA_TYPE,Oe=Ke==="application/xhtml+xml"?_7:s3,$=hl(Se,"ALLOWED_TAGS")?Nr({},Se.ALLOWED_TAGS,Oe):U,j=hl(Se,"ALLOWED_ATTR")?Nr({},Se.ALLOWED_ATTR,Oe):te,ve=hl(Se,"ALLOWED_NAMESPACES")?Nr({},Se.ALLOWED_NAMESPACES,_7):ye,xe=hl(Se,"ADD_URI_SAFE_ATTR")?Nr(lu(W),Se.ADD_URI_SAFE_ATTR,Oe):W,Fe=hl(Se,"ADD_DATA_URI_TAGS")?Nr(lu(fe),Se.ADD_DATA_URI_TAGS,Oe):fe,Ne=hl(Se,"FORBID_CONTENTS")?Nr({},Se.FORBID_CONTENTS,Oe):Ce,oe=hl(Se,"FORBID_TAGS")?Nr({},Se.FORBID_TAGS,Oe):lu({}),J=hl(Se,"FORBID_ATTR")?Nr({},Se.FORBID_ATTR,Oe):lu({}),Ie=hl(Se,"USE_PROFILES")?Se.USE_PROFILES:!1,ue=Se.ALLOW_ARIA_ATTR!==!1,re=Se.ALLOW_DATA_ATTR!==!1,ee=Se.ALLOW_UNKNOWN_PROTOCOLS||!1,Z=Se.ALLOW_SELF_CLOSE_IN_ATTR!==!1,K=Se.SAFE_FOR_TEMPLATES||!1,ae=Se.SAFE_FOR_XML!==!1,Q=Se.WHOLE_DOCUMENT||!1,Te=Se.RETURN_DOM||!1,q=Se.RETURN_DOM_FRAGMENT||!1,Ve=Se.RETURN_TRUSTED_TYPE||!1,ne=Se.FORCE_BODY||!1,pe=Se.SANITIZE_DOM!==!1,Be=Se.SANITIZE_NAMED_PROPS||!1,He=Se.KEEP_CONTENT!==!1,Le=Se.IN_PLACE||!1,G=Se.ALLOWED_URI_REGEXP||fV,le=Se.NAMESPACE||se,Re=Se.MATHML_TEXT_INTEGRATION_POINTS||Re,_e=Se.HTML_INTEGRATION_POINTS||_e,Y=Se.CUSTOM_ELEMENT_HANDLING||{},Se.CUSTOM_ELEMENT_HANDLING&<(Se.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Y.tagNameCheck=Se.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Se.CUSTOM_ELEMENT_HANDLING&<(Se.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Y.attributeNameCheck=Se.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Se.CUSTOM_ELEMENT_HANDLING&&typeof Se.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(Y.allowCustomizedBuiltInElements=Se.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),K&&(re=!1),q&&(Te=!0),Ie&&($=Nr({},aV),j=[],Ie.html===!0&&(Nr($,iV),Nr(j,sV)),Ie.svg===!0&&(Nr($,D7),Nr(j,N7),Nr(j,a3)),Ie.svgFilters===!0&&(Nr($,L7),Nr(j,N7),Nr(j,a3)),Ie.mathMl===!0&&(Nr($,R7),Nr(j,oV),Nr(j,a3))),Se.ADD_TAGS&&($===U&&($=lu($)),Nr($,Se.ADD_TAGS,Oe)),Se.ADD_ATTR&&(j===te&&(j=lu(j)),Nr(j,Se.ADD_ATTR,Oe)),Se.ADD_URI_SAFE_ATTR&&Nr(xe,Se.ADD_URI_SAFE_ATTR,Oe),Se.FORBID_CONTENTS&&(Ne===Ce&&(Ne=lu(Ne)),Nr(Ne,Se.FORBID_CONTENTS,Oe)),He&&($["#text"]=!0),Q&&Nr($,["html","head","body"]),$.table&&(Nr($,["tbody"]),delete oe.tbody),Se.TRUSTED_TYPES_POLICY){if(typeof Se.TRUSTED_TYPES_POLICY.createHTML!="function")throw zy('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Se.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw zy('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');S=Se.TRUSTED_TYPES_POLICY,w=S.createHTML("")}else S===void 0&&(S=H5e(m,i)),S!==null&&typeof w=="string"&&(w=S.createHTML(""));Za&&Za(Se),et=Se}},"_parseConfig"),vt=Nr({},[...D7,...L7,...M5e]),Lt=Nr({},[...R7,...I5e]),dt=o(function(Se){let at=T(Se);(!at||!at.tagName)&&(at={namespaceURI:le,tagName:"template"});let Nt=s3(Se.tagName),wr=s3(at.tagName);return ve[Se.namespaceURI]?Se.namespaceURI===z?at.namespaceURI===se?Nt==="svg":at.namespaceURI===he?Nt==="svg"&&(wr==="annotation-xml"||Re[wr]):!!vt[Nt]:Se.namespaceURI===he?at.namespaceURI===se?Nt==="math":at.namespaceURI===z?Nt==="math"&&_e[wr]:!!Lt[Nt]:Se.namespaceURI===se?at.namespaceURI===z&&!_e[wr]||at.namespaceURI===he&&!Re[wr]?!1:!Lt[Nt]&&(ze[Nt]||!vt[Nt]):!!(Ke==="application/xhtml+xml"&&ve[Se.namespaceURI]):!1},"_checkValidNamespace"),nt=o(function(Se){Fy(e.removed,{element:Se});try{T(Se).removeChild(Se)}catch{v(Se)}},"_forceRemove"),bt=o(function(Se,at){try{Fy(e.removed,{attribute:at.getAttributeNode(Se),from:at})}catch{Fy(e.removed,{attribute:null,from:at})}if(at.removeAttribute(Se),Se==="is")if(Te||q)try{nt(at)}catch{}else try{at.setAttribute(Se,"")}catch{}},"_removeAttribute"),wt=o(function(Se){let at=null,Nt=null;if(ne)Se=""+Se;else{let yn=nV(Se,/^[\r\n\t ]+/);Nt=yn&&yn[0]}Ke==="application/xhtml+xml"&&le===se&&(Se=''+Se+"");let wr=S?S.createHTML(Se):Se;if(le===se)try{at=new p().parseFromString(wr,Ke)}catch{}if(!at||!at.documentElement){at=k.createDocument(le,"template",null);try{at.documentElement.innerHTML=ke?w:wr}catch{}}let Tn=at.body||at.documentElement;return Se&&Nt&&Tn.insertBefore(r.createTextNode(Nt),Tn.childNodes[0]||null),le===se?R.call(at,Q?"html":"body")[0]:Q?at.documentElement:Tn},"_initDocument"),yt=o(function(Se){return A.call(Se.ownerDocument||Se,Se,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),ft=o(function(Se){return Se instanceof d&&(typeof Se.nodeName!="string"||typeof Se.textContent!="string"||typeof Se.removeChild!="function"||!(Se.attributes instanceof f)||typeof Se.removeAttribute!="function"||typeof Se.setAttribute!="function"||typeof Se.namespaceURI!="string"||typeof Se.insertBefore!="function"||typeof Se.hasChildNodes!="function")},"_isClobbered"),Ur=o(function(Se){return typeof l=="function"&&Se instanceof l},"_isNode");function _t(Ct,Se,at){i3(Ct,Nt=>{Nt.call(e,Se,at,et)})}o(_t,"_executeHooks");let bn=o(function(Se){let at=null;if(_t(L.beforeSanitizeElements,Se,null),ft(Se))return nt(Se),!0;let Nt=Oe(Se.nodeName);if(_t(L.uponSanitizeElement,Se,{tagName:Nt,allowedTags:$}),ae&&Se.hasChildNodes()&&!Ur(Se.firstElementChild)&&Qa(/<[/\w!]/g,Se.innerHTML)&&Qa(/<[/\w!]/g,Se.textContent)||Se.nodeType===Vy.progressingInstruction||ae&&Se.nodeType===Vy.comment&&Qa(/<[/\w]/g,Se.data))return nt(Se),!0;if(!$[Nt]||oe[Nt]){if(!oe[Nt]&&cr(Nt)&&(Y.tagNameCheck instanceof RegExp&&Qa(Y.tagNameCheck,Nt)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Nt)))return!1;if(He&&!Ne[Nt]){let wr=T(Se)||Se.parentNode,Tn=b(Se)||Se.childNodes;if(Tn&&wr){let yn=Tn.length;for(let sn=yn-1;sn>=0;--sn){let Hi=y(Tn[sn],!0);Hi.__removalCount=(Se.__removalCount||0)+1,wr.insertBefore(Hi,x(Se))}}}return nt(Se),!0}return Se instanceof u&&!dt(Se)||(Nt==="noscript"||Nt==="noembed"||Nt==="noframes")&&Qa(/<\/no(script|embed|frames)/i,Se.innerHTML)?(nt(Se),!0):(K&&Se.nodeType===Vy.text&&(at=Se.textContent,i3([E,D,_],wr=>{at=$y(at,wr," ")}),Se.textContent!==at&&(Fy(e.removed,{element:Se.cloneNode()}),Se.textContent=at)),_t(L.afterSanitizeElements,Se,null),!1)},"_sanitizeElements"),Br=o(function(Se,at,Nt){if(pe&&(at==="id"||at==="name")&&(Nt in r||Nt in Ue))return!1;if(!(re&&!J[at]&&Qa(O,at))){if(!(ue&&Qa(M,at))){if(!j[at]||J[at]){if(!(cr(Se)&&(Y.tagNameCheck instanceof RegExp&&Qa(Y.tagNameCheck,Se)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Se))&&(Y.attributeNameCheck instanceof RegExp&&Qa(Y.attributeNameCheck,at)||Y.attributeNameCheck instanceof Function&&Y.attributeNameCheck(at))||at==="is"&&Y.allowCustomizedBuiltInElements&&(Y.tagNameCheck instanceof RegExp&&Qa(Y.tagNameCheck,Nt)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Nt))))return!1}else if(!xe[at]){if(!Qa(G,$y(Nt,B,""))){if(!((at==="src"||at==="xlink:href"||at==="href")&&Se!=="script"&&D5e(Nt,"data:")===0&&Fe[Se])){if(!(ee&&!Qa(P,$y(Nt,B,"")))){if(Nt)return!1}}}}}}return!0},"_isValidAttribute"),cr=o(function(Se){return Se!=="annotation-xml"&&nV(Se,F)},"_isBasicCustomElement"),ar=o(function(Se){_t(L.beforeSanitizeAttributes,Se,null);let{attributes:at}=Se;if(!at||ft(Se))return;let Nt={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:j,forceKeepAttr:void 0},wr=at.length;for(;wr--;){let Tn=at[wr],{name:yn,namespaceURI:sn,value:Hi}=Tn,Zs=Oe(yn),_a=Hi,fr=yn==="value"?_a:L5e(_a);if(Nt.attrName=Zs,Nt.attrValue=fr,Nt.keepAttr=!0,Nt.forceKeepAttr=void 0,_t(L.uponSanitizeAttribute,Se,Nt),fr=Nt.attrValue,Be&&(Zs==="id"||Zs==="name")&&(bt(yn,Se),fr=Ye+fr),ae&&Qa(/((--!?|])>)|<\/(style|title)/i,fr)){bt(yn,Se);continue}if(Nt.forceKeepAttr)continue;if(!Nt.keepAttr){bt(yn,Se);continue}if(!Z&&Qa(/\/>/i,fr)){bt(yn,Se);continue}K&&i3([E,D,_],kt=>{fr=$y(fr,kt," ")});let it=Oe(Se.nodeName);if(!Br(it,Zs,fr)){bt(yn,Se);continue}if(S&&typeof m=="object"&&typeof m.getAttributeType=="function"&&!sn)switch(m.getAttributeType(it,Zs)){case"TrustedHTML":{fr=S.createHTML(fr);break}case"TrustedScriptURL":{fr=S.createScriptURL(fr);break}}if(fr!==_a)try{sn?Se.setAttributeNS(sn,yn,fr):Se.setAttribute(yn,fr),ft(Se)?nt(Se):rV(e.removed)}catch{bt(yn,Se)}}_t(L.afterSanitizeAttributes,Se,null)},"_sanitizeAttributes"),_r=o(function Ct(Se){let at=null,Nt=yt(Se);for(_t(L.beforeSanitizeShadowDOM,Se,null);at=Nt.nextNode();)_t(L.uponSanitizeShadowNode,at,null),bn(at),ar(at),at.content instanceof a&&Ct(at.content);_t(L.afterSanitizeShadowDOM,Se,null)},"_sanitizeShadowDOM");return e.sanitize=function(Ct){let Se=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},at=null,Nt=null,wr=null,Tn=null;if(ke=!Ct,ke&&(Ct=""),typeof Ct!="string"&&!Ur(Ct))if(typeof Ct.toString=="function"){if(Ct=Ct.toString(),typeof Ct!="string")throw zy("dirty is not a string, aborting")}else throw zy("toString is not a function");if(!e.isSupported)return Ct;if(de||Gt(Se),e.removed=[],typeof Ct=="string"&&(Le=!1),Le){if(Ct.nodeName){let Hi=Oe(Ct.nodeName);if(!$[Hi]||oe[Hi])throw zy("root node is forbidden and cannot be sanitized in-place")}}else if(Ct instanceof l)at=wt(""),Nt=at.ownerDocument.importNode(Ct,!0),Nt.nodeType===Vy.element&&Nt.nodeName==="BODY"||Nt.nodeName==="HTML"?at=Nt:at.appendChild(Nt);else{if(!Te&&!K&&!Q&&Ct.indexOf("<")===-1)return S&&Ve?S.createHTML(Ct):Ct;if(at=wt(Ct),!at)return Te?null:Ve?w:""}at&&ne&&nt(at.firstChild);let yn=yt(Le?Ct:at);for(;wr=yn.nextNode();)bn(wr),ar(wr),wr.content instanceof a&&_r(wr.content);if(Le)return Ct;if(Te){if(q)for(Tn=C.call(at.ownerDocument);at.firstChild;)Tn.appendChild(at.firstChild);else Tn=at;return(j.shadowroot||j.shadowrootmode)&&(Tn=I.call(n,Tn,!0)),Tn}let sn=Q?at.outerHTML:at.innerHTML;return Q&&$["!doctype"]&&at.ownerDocument&&at.ownerDocument.doctype&&at.ownerDocument.doctype.name&&Qa(dV,at.ownerDocument.doctype.name)&&(sn=" +`+sn),K&&i3([E,D,_],Hi=>{sn=$y(sn,Hi," ")}),S&&Ve?S.createHTML(sn):sn},e.setConfig=function(){let Ct=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Gt(Ct),de=!0},e.clearConfig=function(){et=null,de=!1},e.isValidAttribute=function(Ct,Se,at){et||Gt({});let Nt=Oe(Ct),wr=Oe(Se);return Br(Nt,wr,at)},e.addHook=function(Ct,Se){typeof Se=="function"&&Fy(L[Ct],Se)},e.removeHook=function(Ct,Se){if(Se!==void 0){let at=A5e(L[Ct],Se);return at===-1?void 0:_5e(L[Ct],at,1)[0]}return rV(L[Ct])},e.removeHooks=function(Ct){L[Ct]=[]},e.removeAllHooks=function(){L=cV()},e}var uV,tV,E5e,S5e,C5e,Za,Co,hV,M7,I7,i3,A5e,rV,Fy,_5e,s3,_7,nV,$y,D5e,L5e,hl,Qa,zy,iV,D7,L7,M5e,R7,I5e,aV,sV,N7,oV,a3,O5e,P5e,B5e,F5e,$5e,fV,z5e,G5e,dV,V5e,lV,Vy,U5e,H5e,cV,yh,O7=N(()=>{"use strict";({entries:uV,setPrototypeOf:tV,isFrozen:E5e,getPrototypeOf:S5e,getOwnPropertyDescriptor:C5e}=Object),{freeze:Za,seal:Co,create:hV}=Object,{apply:M7,construct:I7}=typeof Reflect<"u"&&Reflect;Za||(Za=o(function(e){return e},"freeze"));Co||(Co=o(function(e){return e},"seal"));M7||(M7=o(function(e,r,n){return e.apply(r,n)},"apply"));I7||(I7=o(function(e,r){return new e(...r)},"construct"));i3=Ja(Array.prototype.forEach),A5e=Ja(Array.prototype.lastIndexOf),rV=Ja(Array.prototype.pop),Fy=Ja(Array.prototype.push),_5e=Ja(Array.prototype.splice),s3=Ja(String.prototype.toLowerCase),_7=Ja(String.prototype.toString),nV=Ja(String.prototype.match),$y=Ja(String.prototype.replace),D5e=Ja(String.prototype.indexOf),L5e=Ja(String.prototype.trim),hl=Ja(Object.prototype.hasOwnProperty),Qa=Ja(RegExp.prototype.test),zy=R5e(TypeError);o(Ja,"unapply");o(R5e,"unconstruct");o(Nr,"addToSet");o(N5e,"cleanArray");o(lu,"clone");o(Gy,"lookupGetter");iV=Za(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),D7=Za(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),L7=Za(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),M5e=Za(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),R7=Za(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),I5e=Za(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),aV=Za(["#text"]),sV=Za(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),N7=Za(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),oV=Za(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),a3=Za(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),O5e=Co(/\{\{[\w\W]*|[\w\W]*\}\}/gm),P5e=Co(/<%[\w\W]*|[\w\W]*%>/gm),B5e=Co(/\$\{[\w\W]*/gm),F5e=Co(/^data-[\-\w.\u00B7-\uFFFF]+$/),$5e=Co(/^aria-[\-\w]+$/),fV=Co(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),z5e=Co(/^(?:\w+script|data):/i),G5e=Co(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),dV=Co(/^html$/i),V5e=Co(/^[a-z][.\w]*(-[.\w]+)+$/i),lV=Object.freeze({__proto__:null,ARIA_ATTR:$5e,ATTR_WHITESPACE:G5e,CUSTOM_ELEMENT:V5e,DATA_ATTR:F5e,DOCTYPE_NAME:dV,ERB_EXPR:P5e,IS_ALLOWED_URI:fV,IS_SCRIPT_OR_DATA:z5e,MUSTACHE_EXPR:O5e,TMPLIT_EXPR:B5e}),Vy={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},U5e=o(function(){return typeof window>"u"?null:window},"getGlobal"),H5e=o(function(e,r){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(n=r.getAttribute(i));let a="dompurify"+(n?"#"+n:"");try{return e.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},"_createTrustedTypesPolicy"),cV=o(function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},"_createHooksMap");o(pV,"createDOMPurify");yh=pV()});var WU={};dr(WU,{ParseError:()=>gt,SETTINGS_SCHEMA:()=>Wy,__defineFunction:()=>Mt,__defineMacro:()=>ce,__defineSymbol:()=>V,__domTree:()=>qU,__parse:()=>GU,__renderToDomTree:()=>M3,__renderToHTMLTree:()=>UU,__setFontMetrics:()=>XV,default:()=>Owe,render:()=>EA,renderToString:()=>zU,version:()=>HU});function Q5e(t){return String(t).replace(K5e,e=>j5e[e])}function tTe(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function lTe(t){for(var e=0;e=i[0]&&t<=i[1])return r.name}return null}function YV(t){for(var e=0;e=v3[e]&&t<=v3[e+1])return!0;return!1}function XV(t,e){Ql[t]=e}function lA(t,e,r){if(!Ql[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=Ql[e][n];if(!i&&t[0]in gV&&(n=gV[t[0]].charCodeAt(0),i=Ql[e][n]),!i&&r==="text"&&YV(n)&&(i=Ql[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function xTe(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!P7[e]){var r=P7[e]={cssEmPerMu:o3.quad[e]/18};for(var n in o3)o3.hasOwnProperty(n)&&(r[n]=o3[n][e])}return P7[e]}function xV(t){if(t instanceof Cs)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function ETe(t){if(t instanceof fd)return t;throw new Error("Expected span but got "+String(t)+".")}function V(t,e,r,n,i,a){Nn[t][i]={font:e,group:r,replace:n},a&&n&&(Nn[t][n]=Nn[t][i])}function Mt(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},u=0;u0&&(a.push(p3(s,e)),s=[]),a.push(n[l]));s.length>0&&a.push(p3(s,e));var h;r?(h=p3(Ii(r,e,!0)),h.classes=["tag"],a.push(h)):i&&a.push(i);var f=du(["katex-html"],a);if(f.setAttribute("aria-hidden","true"),h){var d=h.children[0];d.style.height=St(f.height+f.depth),f.depth&&(d.style.verticalAlign=St(-f.depth))}return f}function sU(t){return new hd(t)}function $7(t){if(!t)return!1;if(t.type==="mi"&&t.children.length===1){var e=t.children[0];return e instanceof _o&&e.text==="."}else if(t.type==="mo"&&t.children.length===1&&t.getAttribute("separator")==="true"&&t.getAttribute("lspace")==="0em"&&t.getAttribute("rspace")==="0em"){var r=t.children[0];return r instanceof _o&&r.text===","}else return!1}function EV(t,e,r,n,i){var a=As(t,r),s;a.length===1&&a[0]instanceof es&&er.contains(["mrow","mtable"],a[0].type)?s=a[0]:s=new mt.MathNode("mrow",a);var l=new mt.MathNode("annotation",[new mt.TextNode(e)]);l.setAttribute("encoding","application/x-tex");var u=new mt.MathNode("semantics",[s,l]),h=new mt.MathNode("math",[u]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&h.setAttribute("display","block");var f=i?"katex":"katex-mathml";return $e.makeSpan([f],[h])}function Tr(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function fA(t){var e=D3(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function D3(t){return t&&(t.type==="atom"||CTe.hasOwnProperty(t.type))?t:null}function uU(t,e){var r=Ii(t.body,e,!0);return rwe([t.mclass],r,e)}function hU(t,e){var r,n=As(t.body,e);return t.mclass==="minner"?r=new mt.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new mt.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new mt.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function awe(t,e,r){var n=nwe[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),l=r.callFunction("\\\\cdright",[e[1]],[]),u={type:"ordgroup",mode:"math",body:[i,s,l]};return r.callFunction("\\\\cdparent",[u],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var h={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[h],[])}default:return{type:"textord",text:" ",mode:"math"}}}function swe(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new gt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(h)>-1)for(var d=0;d<2;d++){for(var p=!0,m=u+1;mAV=|." after @',s[u]);var g=awe(h,f,t),y={type:"styling",body:[g],mode:"math",style:"display"};n.push(y),l=SV()}a%2===0?n.push(l):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var v=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:v,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function R3(t,e){var r=D3(t);if(r&&er.contains(xwe,r.text))return r;throw r?new gt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new gt("Invalid delimiter type '"+t.type+"'",t)}function _V(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function Jl(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},u=0;u1||!f)&&y.pop(),x.length{"use strict";to=class t{static{o(this,"SourceLocation")}constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},Do=class t{static{o(this,"Token")}constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,to.range(this,e))}},gt=class t{static{o(this,"ParseError")}constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var l=s.lexer.input;i=s.start,a=s.end,i===l.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var u=l.slice(i,a).replace(/[^]/g,"$&\u0332"),h;i>15?h="\u2026"+l.slice(i-15,i):h=l.slice(0,i);var f;a+15":">","<":"<",'"':""","'":"'"},K5e=/[&><"']/g;o(Q5e,"escape");WV=o(function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},"getBaseElem"),Z5e=o(function(e){var r=WV(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},"isCharacterBox"),J5e=o(function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},"assert"),eTe=o(function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},"protocolFromUrl"),er={contains:q5e,deflt:W5e,escape:Q5e,hyphenate:X5e,getBaseElem:WV,isCharacterBox:Z5e,protocolFromUrl:eTe},Wy={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:o(t=>"#"+t,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:o((t,e)=>(e.push(t),e),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:o(t=>Math.max(0,t),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:o(t=>Math.max(0,t),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:o(t=>Math.max(0,t),"processor"),cli:"-e, --max-expand ",cliProcessor:o(t=>t==="Infinity"?1/0:parseInt(t),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}};o(tTe,"getDefaultValue");Xy=class{static{o(this,"Settings")}constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in Wy)if(Wy.hasOwnProperty(r)){var n=Wy[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:tTe(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new gt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=er.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},jl=class{static{o(this,"Style")}constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return Kl[rTe[this.id]]}sub(){return Kl[nTe[this.id]]}fracNum(){return Kl[iTe[this.id]]}fracDen(){return Kl[aTe[this.id]]}cramp(){return Kl[sTe[this.id]]}text(){return Kl[oTe[this.id]]}isTight(){return this.size>=2}},oA=0,x3=1,k0=2,hu=3,jy=4,Ao=5,E0=6,ts=7,Kl=[new jl(oA,0,!1),new jl(x3,0,!0),new jl(k0,1,!1),new jl(hu,1,!0),new jl(jy,2,!1),new jl(Ao,2,!0),new jl(E0,3,!1),new jl(ts,3,!0)],rTe=[jy,Ao,jy,Ao,E0,ts,E0,ts],nTe=[Ao,Ao,Ao,Ao,ts,ts,ts,ts],iTe=[k0,hu,jy,Ao,E0,ts,E0,ts],aTe=[hu,hu,Ao,Ao,ts,ts,ts,ts],sTe=[x3,x3,hu,hu,Ao,Ao,ts,ts],oTe=[oA,x3,k0,hu,k0,hu,k0,hu],nr={DISPLAY:Kl[oA],TEXT:Kl[k0],SCRIPT:Kl[jy],SCRIPTSCRIPT:Kl[E0]},j7=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];o(lTe,"scriptFromCodepoint");v3=[];j7.forEach(t=>t.blocks.forEach(e=>v3.push(...e)));o(YV,"supportedCodepoint");w0=80,cTe=o(function(e,r){return"M95,"+(622+e+r)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+e/2.075+" -"+e+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+e)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),uTe=o(function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+e/2.084+" -"+e+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+e)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),hTe=o(function(e,r){return"M983 "+(10+e+r)+` +l`+e/3.13+" -"+e+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),fTe=o(function(e,r){return"M424,"+(2398+e+r)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+e)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` +h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),dTe=o(function(e,r){return"M473,"+(2713+e+r)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),pTe=o(function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),mTe=o(function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` +H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},"sqrtTall"),gTe=o(function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=cTe(r,w0);break;case"sqrtSize1":i=uTe(r,w0);break;case"sqrtSize2":i=hTe(r,w0);break;case"sqrtSize3":i=fTe(r,w0);break;case"sqrtSize4":i=dTe(r,w0);break;case"sqrtTall":i=mTe(r,w0,n)}return i},"sqrtPath"),yTe=o(function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},"innerPath"),mV={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z +M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z +M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z +M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z +M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},vTe=o(function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z +M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z +M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z +M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),hd=class{static{o(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return er.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText(),"toText");return this.children.map(e).join("")}},Ql={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},o3={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},gV={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};o(XV,"setFontMetrics");o(lA,"getCharacterMetrics");P7={};o(xTe,"getGlobalMetrics");bTe=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],yV=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],vV=o(function(e,r){return r.size<2?e:bTe[e-1][r.size-1]},"sizeAtStyle"),b3=class t{static{o(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=yV[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:vV(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:yV[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=vV(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=xTe(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};b3.BASESIZE=6;K7={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},TTe={ex:!0,em:!0,mu:!0},jV=o(function(e){return typeof e!="string"&&(e=e.unit),e in K7||e in TTe||e==="ex"},"validUnit"),ii=o(function(e,r){var n;if(e.unit in K7)n=K7[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new gt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},"calculateSize"),St=o(function(e){return+e.toFixed(4)+"em"},"makeEm"),bh=o(function(e){return e.filter(r=>r).join(" ")},"createClass"),KV=o(function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},"initNode"),QV=o(function(e){var r=document.createElement(e);r.className=bh(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a/=\x00-\x1f]/,ZV=o(function(e){var r="<"+e;this.classes.length&&(r+=' class="'+er.escape(bh(this.classes))+'"');var n="";for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=er.hyphenate(i)+":"+this.style[i]+";");n&&(r+=' style="'+er.escape(n)+'"');for(var a in this.attributes)if(this.attributes.hasOwnProperty(a)){if(wTe.test(a))throw new gt("Invalid attribute name '"+a+"'");r+=" "+a+'="'+er.escape(this.attributes[a])+'"'}r+=">";for(var s=0;s",r},"toMarkup"),fd=class{static{o(this,"Span")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,KV.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return er.contains(this.classes,e)}toNode(){return QV.call(this,"span")}toMarkup(){return ZV.call(this,"span")}},Ky=class{static{o(this,"Anchor")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,KV.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return er.contains(this.classes,e)}toNode(){return QV.call(this,"a")}toMarkup(){return ZV.call(this,"a")}},Q7=class{static{o(this,"Img")}constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return er.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+er.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=St(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=bh(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=er.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+er.escape(n)+'"');var a=er.escape(this.text);return e?(r+=">",r+=a,r+="",r):a}},dl=class{static{o(this,"SvgNode")}constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},Qy=class{static{o(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);V(H,ie,Ee,"\u2208","\\in",!0);V(H,ie,Ee,"\uE020","\\@not");V(H,ie,Ee,"\u2282","\\subset",!0);V(H,ie,Ee,"\u2283","\\supset",!0);V(H,ie,Ee,"\u2286","\\subseteq",!0);V(H,ie,Ee,"\u2287","\\supseteq",!0);V(H,we,Ee,"\u2288","\\nsubseteq",!0);V(H,we,Ee,"\u2289","\\nsupseteq",!0);V(H,ie,Ee,"\u22A8","\\models");V(H,ie,Ee,"\u2190","\\leftarrow",!0);V(H,ie,Ee,"\u2264","\\le");V(H,ie,Ee,"\u2264","\\leq",!0);V(H,ie,Ee,"<","\\lt",!0);V(H,ie,Ee,"\u2192","\\rightarrow",!0);V(H,ie,Ee,"\u2192","\\to");V(H,we,Ee,"\u2271","\\ngeq",!0);V(H,we,Ee,"\u2270","\\nleq",!0);V(H,ie,mu,"\xA0","\\ ");V(H,ie,mu,"\xA0","\\space");V(H,ie,mu,"\xA0","\\nobreakspace");V(ct,ie,mu,"\xA0","\\ ");V(ct,ie,mu,"\xA0"," ");V(ct,ie,mu,"\xA0","\\space");V(ct,ie,mu,"\xA0","\\nobreakspace");V(H,ie,mu,null,"\\nobreak");V(H,ie,mu,null,"\\allowbreak");V(H,ie,A3,",",",");V(H,ie,A3,";",";");V(H,we,Ot,"\u22BC","\\barwedge",!0);V(H,we,Ot,"\u22BB","\\veebar",!0);V(H,ie,Ot,"\u2299","\\odot",!0);V(H,ie,Ot,"\u2295","\\oplus",!0);V(H,ie,Ot,"\u2297","\\otimes",!0);V(H,ie,De,"\u2202","\\partial",!0);V(H,ie,Ot,"\u2298","\\oslash",!0);V(H,we,Ot,"\u229A","\\circledcirc",!0);V(H,we,Ot,"\u22A1","\\boxdot",!0);V(H,ie,Ot,"\u25B3","\\bigtriangleup");V(H,ie,Ot,"\u25BD","\\bigtriangledown");V(H,ie,Ot,"\u2020","\\dagger");V(H,ie,Ot,"\u22C4","\\diamond");V(H,ie,Ot,"\u22C6","\\star");V(H,ie,Ot,"\u25C3","\\triangleleft");V(H,ie,Ot,"\u25B9","\\triangleright");V(H,ie,ro,"{","\\{");V(ct,ie,De,"{","\\{");V(ct,ie,De,"{","\\textbraceleft");V(H,ie,rs,"}","\\}");V(ct,ie,De,"}","\\}");V(ct,ie,De,"}","\\textbraceright");V(H,ie,ro,"{","\\lbrace");V(H,ie,rs,"}","\\rbrace");V(H,ie,ro,"[","\\lbrack",!0);V(ct,ie,De,"[","\\lbrack",!0);V(H,ie,rs,"]","\\rbrack",!0);V(ct,ie,De,"]","\\rbrack",!0);V(H,ie,ro,"(","\\lparen",!0);V(H,ie,rs,")","\\rparen",!0);V(ct,ie,De,"<","\\textless",!0);V(ct,ie,De,">","\\textgreater",!0);V(H,ie,ro,"\u230A","\\lfloor",!0);V(H,ie,rs,"\u230B","\\rfloor",!0);V(H,ie,ro,"\u2308","\\lceil",!0);V(H,ie,rs,"\u2309","\\rceil",!0);V(H,ie,De,"\\","\\backslash");V(H,ie,De,"\u2223","|");V(H,ie,De,"\u2223","\\vert");V(ct,ie,De,"|","\\textbar",!0);V(H,ie,De,"\u2225","\\|");V(H,ie,De,"\u2225","\\Vert");V(ct,ie,De,"\u2225","\\textbardbl");V(ct,ie,De,"~","\\textasciitilde");V(ct,ie,De,"\\","\\textbackslash");V(ct,ie,De,"^","\\textasciicircum");V(H,ie,Ee,"\u2191","\\uparrow",!0);V(H,ie,Ee,"\u21D1","\\Uparrow",!0);V(H,ie,Ee,"\u2193","\\downarrow",!0);V(H,ie,Ee,"\u21D3","\\Downarrow",!0);V(H,ie,Ee,"\u2195","\\updownarrow",!0);V(H,ie,Ee,"\u21D5","\\Updownarrow",!0);V(H,ie,ki,"\u2210","\\coprod");V(H,ie,ki,"\u22C1","\\bigvee");V(H,ie,ki,"\u22C0","\\bigwedge");V(H,ie,ki,"\u2A04","\\biguplus");V(H,ie,ki,"\u22C2","\\bigcap");V(H,ie,ki,"\u22C3","\\bigcup");V(H,ie,ki,"\u222B","\\int");V(H,ie,ki,"\u222B","\\intop");V(H,ie,ki,"\u222C","\\iint");V(H,ie,ki,"\u222D","\\iiint");V(H,ie,ki,"\u220F","\\prod");V(H,ie,ki,"\u2211","\\sum");V(H,ie,ki,"\u2A02","\\bigotimes");V(H,ie,ki,"\u2A01","\\bigoplus");V(H,ie,ki,"\u2A00","\\bigodot");V(H,ie,ki,"\u222E","\\oint");V(H,ie,ki,"\u222F","\\oiint");V(H,ie,ki,"\u2230","\\oiiint");V(H,ie,ki,"\u2A06","\\bigsqcup");V(H,ie,ki,"\u222B","\\smallint");V(ct,ie,S0,"\u2026","\\textellipsis");V(H,ie,S0,"\u2026","\\mathellipsis");V(ct,ie,S0,"\u2026","\\ldots",!0);V(H,ie,S0,"\u2026","\\ldots",!0);V(H,ie,S0,"\u22EF","\\@cdots",!0);V(H,ie,S0,"\u22F1","\\ddots",!0);V(H,ie,De,"\u22EE","\\varvdots");V(ct,ie,De,"\u22EE","\\varvdots");V(H,ie,Wn,"\u02CA","\\acute");V(H,ie,Wn,"\u02CB","\\grave");V(H,ie,Wn,"\xA8","\\ddot");V(H,ie,Wn,"~","\\tilde");V(H,ie,Wn,"\u02C9","\\bar");V(H,ie,Wn,"\u02D8","\\breve");V(H,ie,Wn,"\u02C7","\\check");V(H,ie,Wn,"^","\\hat");V(H,ie,Wn,"\u20D7","\\vec");V(H,ie,Wn,"\u02D9","\\dot");V(H,ie,Wn,"\u02DA","\\mathring");V(H,ie,rr,"\uE131","\\@imath");V(H,ie,rr,"\uE237","\\@jmath");V(H,ie,De,"\u0131","\u0131");V(H,ie,De,"\u0237","\u0237");V(ct,ie,De,"\u0131","\\i",!0);V(ct,ie,De,"\u0237","\\j",!0);V(ct,ie,De,"\xDF","\\ss",!0);V(ct,ie,De,"\xE6","\\ae",!0);V(ct,ie,De,"\u0153","\\oe",!0);V(ct,ie,De,"\xF8","\\o",!0);V(ct,ie,De,"\xC6","\\AE",!0);V(ct,ie,De,"\u0152","\\OE",!0);V(ct,ie,De,"\xD8","\\O",!0);V(ct,ie,Wn,"\u02CA","\\'");V(ct,ie,Wn,"\u02CB","\\`");V(ct,ie,Wn,"\u02C6","\\^");V(ct,ie,Wn,"\u02DC","\\~");V(ct,ie,Wn,"\u02C9","\\=");V(ct,ie,Wn,"\u02D8","\\u");V(ct,ie,Wn,"\u02D9","\\.");V(ct,ie,Wn,"\xB8","\\c");V(ct,ie,Wn,"\u02DA","\\r");V(ct,ie,Wn,"\u02C7","\\v");V(ct,ie,Wn,"\xA8",'\\"');V(ct,ie,Wn,"\u02DD","\\H");V(ct,ie,Wn,"\u25EF","\\textcircled");JV={"--":!0,"---":!0,"``":!0,"''":!0};V(ct,ie,De,"\u2013","--",!0);V(ct,ie,De,"\u2013","\\textendash");V(ct,ie,De,"\u2014","---",!0);V(ct,ie,De,"\u2014","\\textemdash");V(ct,ie,De,"\u2018","`",!0);V(ct,ie,De,"\u2018","\\textquoteleft");V(ct,ie,De,"\u2019","'",!0);V(ct,ie,De,"\u2019","\\textquoteright");V(ct,ie,De,"\u201C","``",!0);V(ct,ie,De,"\u201C","\\textquotedblleft");V(ct,ie,De,"\u201D","''",!0);V(ct,ie,De,"\u201D","\\textquotedblright");V(H,ie,De,"\xB0","\\degree",!0);V(ct,ie,De,"\xB0","\\degree");V(ct,ie,De,"\xB0","\\textdegree",!0);V(H,ie,De,"\xA3","\\pounds");V(H,ie,De,"\xA3","\\mathsterling",!0);V(ct,ie,De,"\xA3","\\pounds");V(ct,ie,De,"\xA3","\\textsterling",!0);V(H,we,De,"\u2720","\\maltese");V(ct,we,De,"\u2720","\\maltese");bV='0123456789/@."';for(l3=0;l30)return fl(a,h,i,r,s.concat(f));if(u){var d,p;if(u==="boldsymbol"){var m=DTe(a,i,r,s,n);d=m.fontName,p=[m.fontClass]}else l?(d=rU[u].fontName,p=[u]):(d=d3(u,r.fontWeight,r.fontShape),p=[u,r.fontWeight,r.fontShape]);if(_3(a,d,i).metrics)return fl(a,d,i,r,s.concat(p));if(JV.hasOwnProperty(a)&&d.slice(0,10)==="Typewriter"){for(var g=[],y=0;y{if(bh(t.classes)!==bh(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},"canCombine"),NTe=o(t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},"sizeElementFromChildren"),Ss=o(function(e,r,n,i){var a=new fd(e,r,n,i);return cA(a),a},"makeSpan"),eU=o((t,e,r,n)=>new fd(t,e,r,n),"makeSvgSpan"),MTe=o(function(e,r,n){var i=Ss([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=St(i.height),i.maxFontSize=1,i},"makeLineSpan"),ITe=o(function(e,r,n,i){var a=new Ky(e,r,n,i);return cA(a),a},"makeAnchor"),tU=o(function(e){var r=new hd(e);return cA(r),r},"makeFragment"),OTe=o(function(e,r){return e instanceof hd?Ss([],[e],r):e},"wrapFragment"),PTe=o(function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=Ss(["mspace"],[],e),n=ii(t,e);return r.style.marginRight=St(n),r},"makeGlue"),d3=o(function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},"retrieveTextFontName"),rU={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},nU={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},$Te=o(function(e,r){var[n,i,a]=nU[e],s=new Zl(n),l=new dl([s],{width:St(i),height:St(a),style:"width:"+St(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),u=eU(["overlay"],[l],r);return u.height=a,u.style.height=St(a),u.style.width=St(i),u},"staticSvg"),$e={fontMap:rU,makeSymbol:fl,mathsym:_Te,makeSpan:Ss,makeSvgSpan:eU,makeLineSpan:MTe,makeAnchor:ITe,makeFragment:tU,wrapFragment:OTe,makeVList:BTe,makeOrd:LTe,makeGlue:FTe,staticSvg:$Te,svgData:nU,tryCombineChars:NTe},ni={number:3,unit:"mu"},ud={number:4,unit:"mu"},uu={number:5,unit:"mu"},zTe={mord:{mop:ni,mbin:ud,mrel:uu,minner:ni},mop:{mord:ni,mop:ni,mrel:uu,minner:ni},mbin:{mord:ud,mop:ud,mopen:ud,minner:ud},mrel:{mord:uu,mop:uu,mopen:uu,minner:uu},mopen:{},mclose:{mop:ni,mbin:ud,mrel:uu,minner:ni},mpunct:{mord:ni,mop:ni,mrel:uu,mopen:ni,mclose:ni,mpunct:ni,minner:ni},minner:{mord:ni,mop:ni,mbin:ud,mrel:uu,mopen:ni,mpunct:ni,minner:ni}},GTe={mord:{mop:ni},mop:{mord:ni,mop:ni},mbin:{},mrel:{},mopen:{},mclose:{mop:ni},mpunct:{},minner:{mop:ni}},iU={},w3={},k3={};o(Mt,"defineFunction");o(dd,"defineFunctionBuilders");E3=o(function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},"normalizeArgument"),gi=o(function(e){return e.type==="ordgroup"?e.body:[e]},"ordargument"),du=$e.makeSpan,VTe=["leftmost","mbin","mopen","mrel","mop","mpunct"],UTe=["rightmost","mrel","mclose","mpunct"],HTe={display:nr.DISPLAY,text:nr.TEXT,script:nr.SCRIPT,scriptscript:nr.SCRIPTSCRIPT},qTe={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},Ii=o(function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var v=y.classes[0],x=g.classes[0];v==="mbin"&&er.contains(UTe,x)?y.classes[0]="mord":x==="mbin"&&er.contains(VTe,v)&&(g.classes[0]="mord")},{node:d},p,m),kV(a,(g,y)=>{var v=J7(y),x=J7(g),b=v&&x?g.hasClass("mtight")?GTe[v][x]:zTe[v][x]:null;if(b)return $e.makeGlue(b,h)},{node:d},p,m),a},"buildExpression"),kV=o(function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sp=>{e.splice(d+1,0,p),s++})(s)}i&&e.pop()},"traverseNonSpaceNodes"),aU=o(function(e){return e instanceof hd||e instanceof Ky||e instanceof fd&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),WTe=o(function t(e,r){var n=aU(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},"getOutermostNode"),J7=o(function(e,r){return e?(r&&(e=WTe(e,r)),qTe[e.classes[0]]||null):null},"getTypeOfDomTree"),Zy=o(function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return du(r.concat(n))},"makeNullDelimiter"),Hr=o(function(e,r,n){if(!e)return du();if(w3[e.type]){var i=w3[e.type](e,r);if(n&&r.size!==n.size){i=du(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new gt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(p3,"buildHTMLUnbreakable");o(eA,"buildHTML");o(sU,"newDocumentFragment");es=class{static{o(this,"MathNode")}constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=bh(this.classes));for(var n=0;n0&&(e+=' class ="'+er.escape(bh(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},_o=class{static{o(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return er.escape(this.toText())}toText(){return this.text}},tA=class{static{o(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",St(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},mt={MathNode:es,TextNode:_o,SpaceNode:tA,newDocumentFragment:sU},Lo=o(function(e,r,n){return Nn[r][e]&&Nn[r][e].replace&&e.charCodeAt(0)!==55349&&!(JV.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=Nn[r][e].replace),new mt.TextNode(e)},"makeText"),uA=o(function(e){return e.length===1?e[0]:new mt.MathNode("mrow",e)},"makeRow"),hA=o(function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathsfit")return"sans-serif-italic";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(er.contains(["\\imath","\\jmath"],a))return null;Nn[i][a]&&Nn[i][a].replace&&(a=Nn[i][a].replace);var s=$e.fontMap[n].fontName;return lA(a,s,i)?$e.fontMap[n].variant:null},"getVariant");o($7,"isNumberPunctuation");As=o(function(e,r,n){if(e.length===1){var i=wn(e[0],r);return n&&i instanceof es&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,l=0;l=1&&(s.type==="mn"||$7(s))){var h=u.children[0];h instanceof es&&h.type==="mn"&&(h.children=[...s.children,...h.children],a.pop())}else if(s.type==="mi"&&s.children.length===1){var f=s.children[0];if(f instanceof _o&&f.text==="\u0338"&&(u.type==="mo"||u.type==="mi"||u.type==="mn")){var d=u.children[0];d instanceof _o&&d.text.length>0&&(d.text=d.text.slice(0,1)+"\u0338"+d.text.slice(1),a.pop())}}}a.push(u),s=u}return a},"buildExpression"),Th=o(function(e,r,n){return uA(As(e,r,n))},"buildExpressionRow"),wn=o(function(e,r){if(!e)return new mt.MathNode("mrow");if(k3[e.type]){var n=k3[e.type](e,r);return n}else throw new gt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(EV,"buildMathML");oU=o(function(e){return new b3({style:e.displayMode?nr.DISPLAY:nr.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},"optionsFromSettings"),lU=o(function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=$e.makeSpan(n,[e])}return e},"displayWrap"),YTe=o(function(e,r,n){var i=oU(n),a;if(n.output==="mathml")return EV(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=eA(e,i);a=$e.makeSpan(["katex"],[s])}else{var l=EV(e,r,i,n.displayMode,!1),u=eA(e,i);a=$e.makeSpan(["katex"],[l,u])}return lU(a,n)},"buildTree"),XTe=o(function(e,r,n){var i=oU(n),a=eA(e,i),s=$e.makeSpan(["katex"],[a]);return lU(s,n)},"buildHTMLTree"),jTe={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},KTe=o(function(e){var r=new mt.MathNode("mo",[new mt.TextNode(jTe[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},"mathMLnode"),QTe={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},ZTe=o(function(e){return e.type==="ordgroup"?e.body.length:1},"groupLength"),JTe=o(function(e,r){function n(){var l=4e5,u=e.label.slice(1);if(er.contains(["widehat","widecheck","widetilde","utilde"],u)){var h=e,f=ZTe(h.base),d,p,m;if(f>5)u==="widehat"||u==="widecheck"?(d=420,l=2364,m=.42,p=u+"4"):(d=312,l=2340,m=.34,p="tilde4");else{var g=[1,1,2,2,3,3][f];u==="widehat"||u==="widecheck"?(l=[0,1062,2364,2364,2364][g],d=[0,239,300,360,420][g],m=[0,.24,.3,.3,.36,.42][g],p=u+g):(l=[0,600,1033,2339,2340][g],d=[0,260,286,306,312][g],m=[0,.26,.286,.3,.306,.34][g],p="tilde"+g)}var y=new Zl(p),v=new dl([y],{width:"100%",height:St(m),viewBox:"0 0 "+l+" "+d,preserveAspectRatio:"none"});return{span:$e.makeSvgSpan([],[v],r),minWidth:0,height:m}}else{var x=[],b=QTe[u],[T,S,w]=b,k=w/1e3,A=T.length,C,R;if(A===1){var I=b[3];C=["hide-tail"],R=[I]}else if(A===2)C=["halfarrow-left","halfarrow-right"],R=["xMinYMin","xMaxYMin"];else if(A===3)C=["brace-left","brace-center","brace-right"],R=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+A+" children.");for(var L=0;L0&&(i.style.minWidth=St(a)),i},"svgSpan"),ewe=o(function(e,r,n,i,a){var s,l=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=$e.makeSpan(["stretchy",r],[],a),r==="fbox"){var u=a.color&&a.getColor();u&&(s.style.borderColor=u)}}else{var h=[];/^[bx]cancel$/.test(r)&&h.push(new Qy({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&h.push(new Qy({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var f=new dl(h,{width:"100%",height:St(l)});s=$e.makeSvgSpan([],[f],a)}return s.height=l,s.style.height=St(l),s},"encloseSpan"),pu={encloseSpan:ewe,mathMLnode:KTe,svgSpan:JTe};o(Tr,"assertNodeType");o(fA,"assertSymbolNodeType");o(D3,"checkSymbolNodeType");dA=o((t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=Tr(t.base,"accent"),r=n.base,t.base=r,i=ETe(Hr(t,e)),t.base=n):(n=Tr(t,"accent"),r=n.base);var a=Hr(r,e.havingCrampedStyle()),s=n.isShifty&&er.isCharacterBox(r),l=0;if(s){var u=er.getBaseElem(r),h=Hr(u,e.havingCrampedStyle());l=xV(h).skew}var f=n.label==="\\c",d=f?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),p;if(n.isStretchy)p=pu.svgSpan(n,e),p=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:p,wrapperClasses:["svg-align"],wrapperStyle:l>0?{width:"calc(100% - "+St(2*l)+")",marginLeft:St(2*l)}:void 0}]},e);else{var m,g;n.label==="\\vec"?(m=$e.staticSvg("vec",e),g=$e.svgData.vec[1]):(m=$e.makeOrd({mode:n.mode,text:n.label},e,"textord"),m=xV(m),m.italic=0,g=m.width,f&&(d+=m.depth)),p=$e.makeSpan(["accent-body"],[m]);var y=n.label==="\\textcircled";y&&(p.classes.push("accent-full"),d=a.height);var v=l;y||(v-=g/2),p.style.left=St(v),n.label==="\\textcircled"&&(p.style.top=".2em"),p=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-d},{type:"elem",elem:p}]},e)}var x=$e.makeSpan(["mord","accent"],[p],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},"htmlBuilder$a"),cU=o((t,e)=>{var r=t.isStretchy?pu.mathMLnode(t.label):new mt.MathNode("mo",[Lo(t.label,t.mode)]),n=new mt.MathNode("mover",[wn(t.base,e),r]);return n.setAttribute("accent","true"),n},"mathmlBuilder$9"),twe=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));Mt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:o((t,e)=>{var r=E3(e[0]),n=!twe.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},"handler"),htmlBuilder:dA,mathmlBuilder:cU});Mt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:o((t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},"handler"),htmlBuilder:dA,mathmlBuilder:cU});Mt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},"handler"),htmlBuilder:o((t,e)=>{var r=Hr(t.base,e),n=pu.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=$e.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return $e.makeSpan(["mord","accentunder"],[a],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=pu.mathMLnode(t.label),n=new mt.MathNode("munder",[wn(t.base,e),r]);return n.setAttribute("accentunder","true"),n},"mathmlBuilder")});m3=o(t=>{var e=new mt.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e},"paddedNode");Mt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=$e.wrapFragment(Hr(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=$e.wrapFragment(Hr(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var l=pu.svgSpan(t,e),u=-e.fontMetrics().axisHeight+.5*l.height,h=-e.fontMetrics().axisHeight-.5*l.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(h-=i.depth);var f;if(s){var d=-e.fontMetrics().axisHeight+s.height+.5*l.height+.111;f=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u},{type:"elem",elem:s,shift:d}]},e)}else f=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u}]},e);return f.children[0].children[0].children[1].classes.push("svg-align"),$e.makeSpan(["mrel","x-arrow"],[f],e)},mathmlBuilder(t,e){var r=pu.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=m3(wn(t.body,e));if(t.below){var a=m3(wn(t.below,e));n=new mt.MathNode("munderover",[r,a,i])}else n=new mt.MathNode("mover",[r,i])}else if(t.below){var s=m3(wn(t.below,e));n=new mt.MathNode("munder",[r,s])}else n=m3(),n=new mt.MathNode("mover",[r,n]);return n}});rwe=$e.makeSpan;o(uU,"htmlBuilder$9");o(hU,"mathmlBuilder$8");Mt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:gi(i),isCharacterBox:er.isCharacterBox(i)}},htmlBuilder:uU,mathmlBuilder:hU});L3=o(t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"},"binrelClass");Mt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:L3(e[0]),body:gi(e[1]),isCharacterBox:er.isCharacterBox(e[1])}}});Mt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=L3(i):s="mrel";var l={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:gi(i)},u={type:"supsub",mode:a.mode,base:l,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[u],isCharacterBox:er.isCharacterBox(u)}},htmlBuilder:uU,mathmlBuilder:hU});Mt({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:L3(e[0]),body:gi(e[0])}},htmlBuilder(t,e){var r=Ii(t.body,e,!0),n=$e.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=As(t.body,e),n=new mt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});nwe={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},SV=o(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),CV=o(t=>t.type==="textord"&&t.text==="@","isStartOfArrow"),iwe=o((t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e,"isLabelEnd");o(awe,"cdArrow");o(swe,"parseCD");Mt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=$e.wrapFragment(Hr(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=St(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new mt.MathNode("mrow",[wn(t.label,e)]);return r=new mt.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new mt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});Mt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=$e.wrapFragment(Hr(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new mt.MathNode("mrow",[wn(t.fragment,e)])}});Mt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=Tr(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new gt("\\@char with invalid code point "+a);return u<=65535?h=String.fromCharCode(u):(u-=65536,h=String.fromCharCode((u>>10)+55296,(u&1023)+56320)),{type:"textord",mode:r.mode,text:h}}});fU=o((t,e)=>{var r=Ii(t.body,e.withColor(t.color),!1);return $e.makeFragment(r)},"htmlBuilder$8"),dU=o((t,e)=>{var r=As(t.body,e.withColor(t.color)),n=new mt.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n},"mathmlBuilder$7");Mt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=Tr(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:gi(i)}},htmlBuilder:fU,mathmlBuilder:dU});Mt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=Tr(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:fU,mathmlBuilder:dU});Mt({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&Tr(i,"size").value}},htmlBuilder(t,e){var r=$e.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=St(ii(t.size,e)))),r},mathmlBuilder(t,e){var r=new mt.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",St(ii(t.size,e)))),r}});rA={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},pU=o(t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new gt("Expected a control sequence",t);return e},"checkControlSequence"),owe=o(t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},"getRHS"),mU=o((t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)},"letCommand");Mt({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(rA[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=rA[n.text]),Tr(e.parseFunction(),"internal");throw new gt("Invalid token after macro prefix",n)}});Mt({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new gt("Expected a control sequence",n);for(var a=0,s,l=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),l[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new gt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new gt('Argument number "'+n.text+'" out of order');a++,l.push([])}else{if(n.text==="EOF")throw new gt("Expected a macro definition");l[a].push(n.text)}var{tokens:u}=e.gullet.consumeArg();return s&&u.unshift(s),(r==="\\edef"||r==="\\xdef")&&(u=e.gullet.expandTokens(u),u.reverse()),e.gullet.macros.set(i,{tokens:u,numArgs:a,delimiters:l},r===rA[r]),{type:"internal",mode:e.mode}}});Mt({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=pU(e.gullet.popToken());e.gullet.consumeSpaces();var i=owe(e);return mU(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});Mt({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=pU(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return mU(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});qy=o(function(e,r,n){var i=Nn.math[e]&&Nn.math[e].replace,a=lA(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},"getMetrics"),pA=o(function(e,r,n,i){var a=n.havingBaseStyle(r),s=$e.makeSpan(i.concat(a.sizingClasses(n)),[e],n),l=a.sizeMultiplier/n.sizeMultiplier;return s.height*=l,s.depth*=l,s.maxFontSize=a.sizeMultiplier,s},"styleWrap"),gU=o(function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=St(a),e.height-=a,e.depth+=a},"centerSpan"),lwe=o(function(e,r,n,i,a,s){var l=$e.makeSymbol(e,"Main-Regular",a,i),u=pA(l,r,i,s);return n&&gU(u,i,r),u},"makeSmallDelim"),cwe=o(function(e,r,n,i){return $e.makeSymbol(e,"Size"+r+"-Regular",n,i)},"mathrmSize"),yU=o(function(e,r,n,i,a,s){var l=cwe(e,r,a,i),u=pA($e.makeSpan(["delimsizing","size"+r],[l],i),nr.TEXT,i,s);return n&&gU(u,i,nr.TEXT),u},"makeLargeDelim"),z7=o(function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=$e.makeSpan(["delimsizinginner",i],[$e.makeSpan([],[$e.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},"makeGlyphSpan"),G7=o(function(e,r,n){var i=Ql["Size4-Regular"][e.charCodeAt(0)]?Ql["Size4-Regular"][e.charCodeAt(0)][4]:Ql["Size1-Regular"][e.charCodeAt(0)][4],a=new Zl("inner",yTe(e,Math.round(1e3*r))),s=new dl([a],{width:St(i),height:St(r),style:"width:"+St(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),l=$e.makeSvgSpan([],[s],n);return l.height=r,l.style.height=St(r),l.style.width=St(i),{type:"elem",elem:l}},"makeInner"),nA=.008,g3={type:"kern",size:-1*nA},uwe=["|","\\lvert","\\rvert","\\vert"],hwe=["\\|","\\lVert","\\rVert","\\Vert"],vU=o(function(e,r,n,i,a,s){var l,u,h,f,d="",p=0;l=h=f=e,u=null;var m="Size1-Regular";e==="\\uparrow"?h=f="\u23D0":e==="\\Uparrow"?h=f="\u2016":e==="\\downarrow"?l=h="\u23D0":e==="\\Downarrow"?l=h="\u2016":e==="\\updownarrow"?(l="\\uparrow",h="\u23D0",f="\\downarrow"):e==="\\Updownarrow"?(l="\\Uparrow",h="\u2016",f="\\Downarrow"):er.contains(uwe,e)?(h="\u2223",d="vert",p=333):er.contains(hwe,e)?(h="\u2225",d="doublevert",p=556):e==="["||e==="\\lbrack"?(l="\u23A1",h="\u23A2",f="\u23A3",m="Size4-Regular",d="lbrack",p=667):e==="]"||e==="\\rbrack"?(l="\u23A4",h="\u23A5",f="\u23A6",m="Size4-Regular",d="rbrack",p=667):e==="\\lfloor"||e==="\u230A"?(h=l="\u23A2",f="\u23A3",m="Size4-Regular",d="lfloor",p=667):e==="\\lceil"||e==="\u2308"?(l="\u23A1",h=f="\u23A2",m="Size4-Regular",d="lceil",p=667):e==="\\rfloor"||e==="\u230B"?(h=l="\u23A5",f="\u23A6",m="Size4-Regular",d="rfloor",p=667):e==="\\rceil"||e==="\u2309"?(l="\u23A4",h=f="\u23A5",m="Size4-Regular",d="rceil",p=667):e==="("||e==="\\lparen"?(l="\u239B",h="\u239C",f="\u239D",m="Size4-Regular",d="lparen",p=875):e===")"||e==="\\rparen"?(l="\u239E",h="\u239F",f="\u23A0",m="Size4-Regular",d="rparen",p=875):e==="\\{"||e==="\\lbrace"?(l="\u23A7",u="\u23A8",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(l="\u23AB",u="\u23AC",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(l="\u23A7",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(l="\u23AB",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(l="\u23A7",f="\u23AD",h="\u23AA",m="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(l="\u23AB",f="\u23A9",h="\u23AA",m="Size4-Regular");var g=qy(l,m,a),y=g.height+g.depth,v=qy(h,m,a),x=v.height+v.depth,b=qy(f,m,a),T=b.height+b.depth,S=0,w=1;if(u!==null){var k=qy(u,m,a);S=k.height+k.depth,w=2}var A=y+T+S,C=Math.max(0,Math.ceil((r-A)/(w*x))),R=A+C*w*x,I=i.fontMetrics().axisHeight;n&&(I*=i.sizeMultiplier);var L=R/2-I,E=[];if(d.length>0){var D=R-y-T,_=Math.round(R*1e3),O=vTe(d,Math.round(D*1e3)),M=new Zl(d,O),P=(p/1e3).toFixed(3)+"em",B=(_/1e3).toFixed(3)+"em",F=new dl([M],{width:P,height:B,viewBox:"0 0 "+p+" "+_}),G=$e.makeSvgSpan([],[F],i);G.height=_/1e3,G.style.width=P,G.style.height=B,E.push({type:"elem",elem:G})}else{if(E.push(z7(f,m,a)),E.push(g3),u===null){var $=R-y-T+2*nA;E.push(G7(h,$,i))}else{var U=(R-y-T-S)/2+2*nA;E.push(G7(h,U,i)),E.push(g3),E.push(z7(u,m,a)),E.push(g3),E.push(G7(h,U,i))}E.push(g3),E.push(z7(l,m,a))}var j=i.havingBaseStyle(nr.TEXT),te=$e.makeVList({positionType:"bottom",positionData:L,children:E},j);return pA($e.makeSpan(["delimsizing","mult"],[te],j),nr.TEXT,i,s)},"makeStackedDelim"),V7=80,U7=.08,H7=o(function(e,r,n,i,a){var s=gTe(e,i,n),l=new Zl(e,s),u=new dl([l],{width:"400em",height:St(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return $e.makeSvgSpan(["hide-tail"],[u],a)},"sqrtSvg"),fwe=o(function(e,r){var n=r.havingBaseSizing(),i=wU("\\surd",e*n.sizeMultiplier,TU,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),l,u=0,h=0,f=0,d;return i.type==="small"?(f=1e3+1e3*s+V7,e<1?a=1:e<1.4&&(a=.7),u=(1+s+U7)/a,h=(1+s)/a,l=H7("sqrtMain",u,f,s,r),l.style.minWidth="0.853em",d=.833/a):i.type==="large"?(f=(1e3+V7)*Yy[i.size],h=(Yy[i.size]+s)/a,u=(Yy[i.size]+s+U7)/a,l=H7("sqrtSize"+i.size,u,f,s,r),l.style.minWidth="1.02em",d=1/a):(u=e+s+U7,h=e+s,f=Math.floor(1e3*e+s)+V7,l=H7("sqrtTall",u,f,s,r),l.style.minWidth="0.742em",d=1.056),l.height=h,l.style.height=St(u),{span:l,advanceWidth:d,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},"makeSqrtImage"),xU=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],dwe=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],bU=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Yy=[0,1.2,1.8,2.4,3],pwe=o(function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),er.contains(xU,e)||er.contains(bU,e))return yU(e,r,!1,n,i,a);if(er.contains(dwe,e))return vU(e,Yy[r],!1,n,i,a);throw new gt("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),mwe=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],gwe=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"stack"}],TU=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],ywe=o(function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),wU=o(function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},"traverseSequence"),kU=o(function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var l;er.contains(bU,e)?l=mwe:er.contains(xU,e)?l=TU:l=gwe;var u=wU(e,r,l,i);return u.type==="small"?lwe(e,u.style,n,i,a,s):u.type==="large"?yU(e,u.size,n,i,a,s):vU(e,r,n,i,a,s)},"makeCustomSizedDelim"),vwe=o(function(e,r,n,i,a,s){var l=i.fontMetrics().axisHeight*i.sizeMultiplier,u=901,h=5/i.fontMetrics().ptPerEm,f=Math.max(r-l,n+l),d=Math.max(f/500*u,2*f-h);return kU(e,d,!0,i,a,s)},"makeLeftRightDelim"),fu={sqrtImage:fwe,sizedDelim:pwe,sizeToMaxHeight:Yy,customSizedDelim:kU,leftRightDelim:vwe},AV={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},xwe=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];o(R3,"checkDelimiter");Mt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:o((t,e)=>{var r=R3(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:AV[t.funcName].size,mclass:AV[t.funcName].mclass,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>t.delim==="."?$e.makeSpan([t.mclass]):fu.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),"htmlBuilder"),mathmlBuilder:o(t=>{var e=[];t.delim!=="."&&e.push(Lo(t.delim,t.mode));var r=new mt.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=St(fu.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r},"mathmlBuilder")});o(_V,"assertParsed");Mt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new gt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:R3(e[0],t).text,color:r}},"handler")});Mt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=R3(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=Tr(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},"handler"),htmlBuilder:o((t,e)=>{_V(t);for(var r=Ii(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{_V(t);var r=As(t.body,e);if(t.left!=="."){var n=new mt.MathNode("mo",[Lo(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new mt.MathNode("mo",[Lo(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return uA(r)},"mathmlBuilder")});Mt({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=R3(e[0],t);if(!t.parser.leftrightDepth)throw new gt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>{var r;if(t.delim===".")r=Zy(e,[]);else{r=fu.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?Lo("|","text"):Lo(t.delim,t.mode),n=new mt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n},"mathmlBuilder")});mA=o((t,e)=>{var r=$e.wrapFragment(Hr(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,l=er.isCharacterBox(t.body);if(n==="sout")a=$e.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var u=ii({number:.6,unit:"pt"},e),h=ii({number:.35,unit:"ex"},e),f=e.havingBaseSizing();i=i/f.sizeMultiplier;var d=r.height+r.depth+u+h;r.style.paddingLeft=St(d/2+u);var p=Math.floor(1e3*d*i),m=pTe(p),g=new dl([new Zl("phase",m)],{width:"400em",height:St(p/1e3),viewBox:"0 0 400000 "+p,preserveAspectRatio:"xMinYMin slice"});a=$e.makeSvgSpan(["hide-tail"],[g],e),a.style.height=St(d),s=r.depth+u+h}else{/cancel/.test(n)?l||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var y=0,v=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),y=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),v=y):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),y=4*x,v=Math.max(0,.25-r.depth)):(y=l?.2:0,v=y),a=pu.encloseSpan(r,n,y,v,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=St(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=St(x),a.style.borderRightWidth=St(x)),s=r.depth+v,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var T=/cancel|phase/.test(n)?["svg-align"]:[];b=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:T}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!l?$e.makeSpan(["mord","cancel-lap"],[b],e):$e.makeSpan(["mord"],[b],e)},"htmlBuilder$7"),gA=o((t,e)=>{var r=0,n=new mt.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[wn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n},"mathmlBuilder$6");Mt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=Tr(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:mA,mathmlBuilder:gA});Mt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=Tr(e[0],"color-token").color,s=Tr(e[1],"color-token").color,l=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:l}},htmlBuilder:mA,mathmlBuilder:gA});Mt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});Mt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:mA,mathmlBuilder:gA});Mt({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});EU={};o(Jl,"defineEnvironment");SU={};o(ce,"defineMacro");o(DV,"getHLines");N3=o(t=>{var e=t.parser.settings;if(!e.displayMode)throw new gt("{"+t.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext");o(yA,"getAutoTag");o(wh,"parseArray");o(vA,"dCellStyle");ec=o(function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,l=0,u=new Array(a),h=[],f=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),d=1/r.fontMetrics().ptPerEm,p=5*d;if(e.colSeparationType&&e.colSeparationType==="small"){var m=r.havingStyle(nr.SCRIPT).sizeMultiplier;p=.2778*(m/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?ii({number:3,unit:"ex"},r):12*d,y=3*d,v=e.arraystretch*g,x=.7*v,b=.3*v,T=0;function S(q){for(var Ve=0;Ve0&&(T+=.25),h.push({pos:T,isDashed:q[Ve]})}for(o(S,"setHLinePos"),S(s[0]),n=0;n0&&(L+=b,Aq))for(n=0;n=l)){var J=void 0;(i>0||e.hskipBeforeAndAfter)&&(J=er.deflt(U.pregap,p),J!==0&&(O=$e.makeSpan(["arraycolsep"],[]),O.style.width=St(J),_.push(O)));var ue=[];for(n=0;n0){for(var K=$e.makeLineSpan("hline",r,f),ae=$e.makeLineSpan("hdashline",r,f),Q=[{type:"elem",elem:u,shift:0}];h.length>0;){var de=h.pop(),ne=de.pos-E;de.isDashed?Q.push({type:"elem",elem:ae,shift:ne}):Q.push({type:"elem",elem:K,shift:ne})}u=$e.makeVList({positionType:"individualShift",children:Q},r)}if(P.length===0)return $e.makeSpan(["mord"],[u],r);var Te=$e.makeVList({positionType:"individualShift",children:P},r);return Te=$e.makeSpan(["tag"],[Te],r),$e.makeFragment([u,Te])},"htmlBuilder"),bwe={c:"center ",l:"left ",r:"right "},tc=o(function(e,r){for(var n=[],i=new mt.MathNode("mtd",[],["mtr-glue"]),a=new mt.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,y="",v=!1,x=0,b=g.length;g[0].type==="separator"&&(p+="top ",x=1),g[g.length-1].type==="separator"&&(p+="bottom ",b-=1);for(var T=x;T0?"left ":"",p+=C[C.length-1].length>0?"right ":"";for(var R=1;R-1?"alignat":"align",a=e.envName==="split",s=wh(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:yA(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),l,u=0,h={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var f="",d=0;d0&&m&&(v=1),n[g]={type:"align",align:y,pregap:v,postgap:0}}return s.colSeparationType=m?"align":"alignat",s},"alignedHandler");Jl({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=D3(e[0]),n=r?[e[0]]:Tr(e[0],"ordgroup").body,i=n.map(function(s){var l=fA(s),u=l.text;if("lcr".indexOf(u)!==-1)return{type:"align",align:u};if(u==="|")return{type:"separator",separator:"|"};if(u===":")return{type:"separator",separator:":"};throw new gt("Unknown column alignment: "+u,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return wh(t.parser,a,vA(t.envName))},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new gt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=wh(t.parser,n,vA(t.envName)),s=Math.max(0,...a.body.map(l=>l.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=wh(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=D3(e[0]),n=r?[e[0]]:Tr(e[0],"ordgroup").body,i=n.map(function(s){var l=fA(s),u=l.text;if("lc".indexOf(u)!==-1)return{type:"align",align:u};throw new gt("Unknown column alignment: "+u,s)});if(i.length>1)throw new gt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=wh(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new gt("{subarray} can contain only one column");return a},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=wh(t.parser,e,vA(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:CU,htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){er.contains(["gather","gather*"],t.envName)&&N3(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:yA(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return wh(t.parser,e,"display")},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:CU,htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){N3(t);var e={autoTag:yA(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return wh(t.parser,e,"display")},htmlBuilder:ec,mathmlBuilder:tc});Jl({type:"array",names:["CD"],props:{numArgs:0},handler(t){return N3(t),swe(t.parser)},htmlBuilder:ec,mathmlBuilder:tc});ce("\\nonumber","\\gdef\\@eqnsw{0}");ce("\\notag","\\nonumber");Mt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new gt(t.funcName+" valid only within array environment")}});LV=EU;Mt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new gt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return Hr(t.body,n)},"htmlBuilder$5"),_U=o((t,e)=>{var r=t.font,n=e.withFont(r);return wn(t.body,n)},"mathmlBuilder$4"),RV={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};Mt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=E3(e[0]),a=n;return a in RV&&(a=RV[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},"handler"),htmlBuilder:AU,mathmlBuilder:_U});Mt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r}=t,n=e[0],i=er.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:L3(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}},"handler")});Mt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),l="math"+n.slice(1);return{type:"font",mode:a,font:l,body:{type:"ordgroup",mode:r.mode,body:s}}},"handler"),htmlBuilder:AU,mathmlBuilder:_U});DU=o((t,e)=>{var r=e;return t==="display"?r=r.id>=nr.SCRIPT.id?r.text():nr.DISPLAY:t==="text"&&r.size===nr.DISPLAY.size?r=nr.TEXT:t==="script"?r=nr.SCRIPT:t==="scriptscript"&&(r=nr.SCRIPTSCRIPT),r},"adjustStyle"),xA=o((t,e)=>{var r=DU(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=Hr(t.numer,a,e);if(t.continued){var l=8.5/e.fontMetrics().ptPerEm,u=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*p:g=7*p,y=e.fontMetrics().denom1):(d>0?(m=e.fontMetrics().num2,g=p):(m=e.fontMetrics().num3,g=3*p),y=e.fontMetrics().denom2);var v;if(f){var b=e.fontMetrics().axisHeight;m-s.depth-(b+.5*d){var r=new mt.MathNode("mfrac",[wn(t.numer,e),wn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=ii(t.barSize,e);r.setAttribute("linethickness",St(n))}var i=DU(t.size,e.style);if(i.size!==e.style.size){r=new mt.MathNode("mstyle",[r]);var a=i.size===nr.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var l=new mt.MathNode("mo",[new mt.TextNode(t.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}if(s.push(r),t.rightDelim!=null){var u=new mt.MathNode("mo",[new mt.TextNode(t.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),s.push(u)}return uA(s)}return r},"mathmlBuilder$3");Mt({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,l=null,u=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,l="(",u=")";break;case"\\\\bracefrac":s=!1,l="\\{",u="\\}";break;case"\\\\brackfrac":s=!1,l="[",u="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:l,rightDelim:u,size:h,barSize:null}},"handler"),htmlBuilder:xA,mathmlBuilder:bA});Mt({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")});Mt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});NV=["display","text","script","scriptscript"],MV=o(function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r},"delimFromValue");Mt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=E3(e[0]),s=a.type==="atom"&&a.family==="open"?MV(a.text):null,l=E3(e[1]),u=l.type==="atom"&&l.family==="close"?MV(l.text):null,h=Tr(e[2],"size"),f,d=null;h.isBlank?f=!0:(d=h.value,f=d.number>0);var p="auto",m=e[3];if(m.type==="ordgroup"){if(m.body.length>0){var g=Tr(m.body[0],"textord");p=NV[Number(g.text)]}}else m=Tr(m,"textord"),p=NV[Number(m.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:f,barSize:d,leftDelim:s,rightDelim:u,size:p}},htmlBuilder:xA,mathmlBuilder:bA});Mt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Tr(e[0],"size").value,token:i}}});Mt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=J5e(Tr(e[1],"infix").size),s=e[2],l=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:l,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},"handler"),htmlBuilder:xA,mathmlBuilder:bA});LU=o((t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?Hr(t.sup,e.havingStyle(r.sup()),e):Hr(t.sub,e.havingStyle(r.sub()),e),i=Tr(t.base,"horizBrace")):i=Tr(t,"horizBrace");var a=Hr(i.base,e.havingBaseStyle(nr.DISPLAY)),s=pu.svgSpan(i,e),l;if(i.isOver?(l=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),l.children[0].children[0].children[1].classes.push("svg-align")):(l=$e.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),l.children[0].children[0].children[0].classes.push("svg-align")),n){var u=$e.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e);i.isOver?l=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:u},{type:"kern",size:.2},{type:"elem",elem:n}]},e):l=$e.makeVList({positionType:"bottom",positionData:u.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:u}]},e)}return $e.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e)},"htmlBuilder$3"),Twe=o((t,e)=>{var r=pu.mathMLnode(t.label);return new mt.MathNode(t.isOver?"mover":"munder",[wn(t.base,e),r])},"mathmlBuilder$2");Mt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:LU,mathmlBuilder:Twe});Mt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[1],i=Tr(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:gi(n)}:r.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:o((t,e)=>{var r=Ii(t.body,e,!1);return $e.makeAnchor(t.href,[],r,e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Th(t.body,e);return r instanceof es||(r=new es("mrow",[r])),r.setAttribute("href",t.href),r},"mathmlBuilder")});Mt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=Tr(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=Tr(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l,u={};switch(n){case"\\htmlClass":u.class=a,l={command:"\\htmlClass",class:a};break;case"\\htmlId":u.id=a,l={command:"\\htmlId",id:a};break;case"\\htmlStyle":u.style=a,l={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var h=a.split(","),f=0;f{var r=Ii(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=$e.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},"htmlBuilder"),mathmlBuilder:o((t,e)=>Th(t.body,e),"mathmlBuilder")});Mt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:gi(e[0]),mathml:gi(e[1])}},"handler"),htmlBuilder:o((t,e)=>{var r=Ii(t.html,e,!1);return $e.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>Th(t.mathml,e),"mathmlBuilder")});q7=o(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new gt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!jV(n))throw new gt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n},"sizeData");Mt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:o((t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var u=Tr(r[0],"raw").string,h=u.split(","),f=0;f{var r=ii(t.height,e),n=0;t.totalheight.number>0&&(n=ii(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=ii(t.width,e));var a={height:St(r+n)};i>0&&(a.width=St(i)),n>0&&(a.verticalAlign=St(-n));var s=new Q7(t.src,t.alt,a);return s.height=r,s.depth=n,s},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new mt.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=ii(t.height,e),i=0;if(t.totalheight.number>0&&(i=ii(t.totalheight,e)-n,r.setAttribute("valign",St(-i))),r.setAttribute("height",St(n+i)),t.width.number>0){var a=ii(t.width,e);r.setAttribute("width",St(a))}return r.setAttribute("src",t.src),r},"mathmlBuilder")});Mt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=Tr(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return $e.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=ii(t.dimension,e);return new mt.SpaceNode(r)}});Mt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},"handler"),htmlBuilder:o((t,e)=>{var r;t.alignment==="clap"?(r=$e.makeSpan([],[Hr(t.body,e)]),r=$e.makeSpan(["inner"],[r],e)):r=$e.makeSpan(["inner"],[Hr(t.body,e)]);var n=$e.makeSpan(["fix"],[]),i=$e.makeSpan([t.alignment],[r,n],e),a=$e.makeSpan(["strut"]);return a.style.height=St(i.height+i.depth),i.depth&&(a.style.verticalAlign=St(-i.depth)),i.children.unshift(a),i=$e.makeSpan(["thinbox"],[i],e),$e.makeSpan(["mord","vbox"],[i],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new mt.MathNode("mpadded",[wn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r},"mathmlBuilder")});Mt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});Mt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new gt("Mismatched "+t.funcName)}});IV=o((t,e)=>{switch(e.style.size){case nr.DISPLAY.size:return t.display;case nr.TEXT.size:return t.text;case nr.SCRIPT.size:return t.script;case nr.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}},"chooseMathStyle");Mt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:gi(e[0]),text:gi(e[1]),script:gi(e[2]),scriptscript:gi(e[3])}},"handler"),htmlBuilder:o((t,e)=>{var r=IV(t,e),n=Ii(r,e,!1);return $e.makeFragment(n)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=IV(t,e);return Th(r,e)},"mathmlBuilder")});RU=o((t,e,r,n,i,a,s)=>{t=$e.makeSpan([],[t]);var l=r&&er.isCharacterBox(r),u,h;if(e){var f=Hr(e,n.havingStyle(i.sup()),n);h={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-f.depth)}}if(r){var d=Hr(r,n.havingStyle(i.sub()),n);u={elem:d,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-d.height)}}var p;if(h&&u){var m=n.fontMetrics().bigOpSpacing5+u.elem.height+u.elem.depth+u.kern+t.depth+s;p=$e.makeVList({positionType:"bottom",positionData:m,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:St(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:St(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(u){var g=t.height-s;p=$e.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:St(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t}]},n)}else if(h){var y=t.depth+s;p=$e.makeVList({positionType:"bottom",positionData:y,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:St(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var v=[p];if(u&&a!==0&&!l){var x=$e.makeSpan(["mspace"],[],n);x.style.marginRight=St(a),v.unshift(x)}return $e.makeSpan(["mop","op-limits"],v,n)},"assembleSupSub"),NU=["\\smallint"],C0=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=Tr(t.base,"op"),i=!0):a=Tr(t,"op");var s=e.style,l=!1;s.size===nr.DISPLAY.size&&a.symbol&&!er.contains(NU,a.name)&&(l=!0);var u;if(a.symbol){var h=l?"Size2-Regular":"Size1-Regular",f="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(f=a.name.slice(1),a.name=f==="oiint"?"\\iint":"\\iiint"),u=$e.makeSymbol(a.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),f.length>0){var d=u.italic,p=$e.staticSvg(f+"Size"+(l?"2":"1"),e);u=$e.makeVList({positionType:"individualShift",children:[{type:"elem",elem:u,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),a.name="\\"+f,u.classes.unshift("mop"),u.italic=d}}else if(a.body){var m=Ii(a.body,e,!0);m.length===1&&m[0]instanceof Cs?(u=m[0],u.classes[0]="mop"):u=$e.makeSpan(["mop"],m,e)}else{for(var g=[],y=1;y{var r;if(t.symbol)r=new es("mo",[Lo(t.name,t.mode)]),er.contains(NU,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new es("mo",As(t.body,e));else{r=new es("mi",[new _o(t.name.slice(1))]);var n=new es("mo",[Lo("\u2061","text")]);t.parentIsSupSub?r=new es("mrow",[r,n]):r=sU([r,n])}return r},"mathmlBuilder$1"),wwe={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};Mt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=wwe[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},"handler"),htmlBuilder:C0,mathmlBuilder:Jy});Mt({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:gi(n)}},"handler"),htmlBuilder:C0,mathmlBuilder:Jy});kwe={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};Mt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:C0,mathmlBuilder:Jy});Mt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:C0,mathmlBuilder:Jy});Mt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=kwe[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:C0,mathmlBuilder:Jy});MU=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=Tr(t.base,"operatorname"),i=!0):a=Tr(t,"operatorname");var s;if(a.body.length>0){for(var l=a.body.map(d=>{var p=d.text;return typeof p=="string"?{type:"textord",mode:d.mode,text:p}:d}),u=Ii(l,e.withFont("mathrm"),!0),h=0;h{for(var r=As(t.body,e.withFont("mathrm")),n=!0,i=0;if.toText()).join("");r=[new mt.TextNode(l)]}var u=new mt.MathNode("mi",r);u.setAttribute("mathvariant","normal");var h=new mt.MathNode("mo",[Lo("\u2061","text")]);return t.parentIsSupSub?new mt.MathNode("mrow",[u,h]):mt.newDocumentFragment([u,h])},"mathmlBuilder");Mt({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:gi(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:MU,mathmlBuilder:Ewe});ce("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");dd({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?$e.makeFragment(Ii(t.body,e,!1)):$e.makeSpan(["mord"],Ii(t.body,e,!0),e)},mathmlBuilder(t,e){return Th(t.body,e,!0)}});Mt({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=Hr(t.body,e.havingCrampedStyle()),n=$e.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return $e.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new mt.MathNode("mo",[new mt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new mt.MathNode("mover",[wn(t.body,e),r]);return n.setAttribute("accent","true"),n}});Mt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:gi(n)}},"handler"),htmlBuilder:o((t,e)=>{var r=Ii(t.body,e.withPhantom(),!1);return $e.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=As(t.body,e);return new mt.MathNode("mphantom",r)},"mathmlBuilder")});Mt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=$e.makeSpan([],[Hr(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=As(gi(t.body),e),n=new mt.MathNode("mphantom",r),i=new mt.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i},"mathmlBuilder")});Mt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=$e.makeSpan(["inner"],[Hr(t.body,e.withPhantom())]),n=$e.makeSpan(["fix"],[]);return $e.makeSpan(["mord","rlap"],[r,n],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=As(gi(t.body),e),n=new mt.MathNode("mphantom",r),i=new mt.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i},"mathmlBuilder")});Mt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=Tr(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=Hr(t.body,e),n=ii(t.dy,e);return $e.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new mt.MathNode("mpadded",[wn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});Mt({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});Mt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=Tr(e[0],"size"),s=Tr(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&Tr(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=$e.makeSpan(["mord","rule"],[],e),n=ii(t.width,e),i=ii(t.height,e),a=t.shift?ii(t.shift,e):0;return r.style.borderRightWidth=St(n),r.style.borderTopWidth=St(i),r.style.bottom=St(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=ii(t.width,e),n=ii(t.height,e),i=t.shift?ii(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new mt.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",St(r)),s.setAttribute("height",St(n));var l=new mt.MathNode("mpadded",[s]);return i>=0?l.setAttribute("height",St(i)):(l.setAttribute("height",St(i)),l.setAttribute("depth",St(-i))),l.setAttribute("voffset",St(i)),l}});o(IU,"sizingGroup");OV=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],Swe=o((t,e)=>{var r=e.havingSize(t.size);return IU(t.body,r,e)},"htmlBuilder");Mt({type:"sizing",names:OV,props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:OV.indexOf(n)+1,body:a}},"handler"),htmlBuilder:Swe,mathmlBuilder:o((t,e)=>{var r=e.havingSize(t.size),n=As(t.body,r),i=new mt.MathNode("mstyle",n);return i.setAttribute("mathsize",St(r.sizeMultiplier)),i},"mathmlBuilder")});Mt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:o((t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&Tr(r[0],"ordgroup");if(s)for(var l="",u=0;u{var r=$e.makeSpan([],[Hr(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new mt.MathNode("mpadded",[wn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r},"mathmlBuilder")});Mt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=Hr(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=$e.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+d-r.height-r.depth)/2);var p=u.height-r.height-s-h;r.style.paddingLeft=St(f);var m=$e.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:u},{type:"kern",size:h}]},e);if(t.index){var g=e.havingStyle(nr.SCRIPTSCRIPT),y=Hr(t.index,g,e),v=.6*(m.height-m.depth),x=$e.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:y}]},e),b=$e.makeSpan(["root"],[x]);return $e.makeSpan(["mord","sqrt"],[b,m],e)}else return $e.makeSpan(["mord","sqrt"],[m],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new mt.MathNode("mroot",[wn(r,e),wn(n,e)]):new mt.MathNode("msqrt",[wn(r,e)])}});PV={display:nr.DISPLAY,text:nr.TEXT,script:nr.SCRIPT,scriptscript:nr.SCRIPTSCRIPT};Mt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=PV[t.style],n=e.havingStyle(r).withFont("");return IU(t.body,n,e)},mathmlBuilder(t,e){var r=PV[t.style],n=e.havingStyle(r),i=As(t.body,n),a=new mt.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},l=s[t.style];return a.setAttribute("scriptlevel",l[0]),a.setAttribute("displaystyle",l[1]),a}});Cwe=o(function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===nr.DISPLAY.size||n.alwaysHandleSupSub);return i?C0:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===nr.DISPLAY.size||n.limits);return a?MU:null}else{if(n.type==="accent")return er.isCharacterBox(n.base)?dA:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?LU:null}else return null}else return null},"htmlBuilderDelegate");dd({type:"supsub",htmlBuilder(t,e){var r=Cwe(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=Hr(n,e),l,u,h=e.fontMetrics(),f=0,d=0,p=n&&er.isCharacterBox(n);if(i){var m=e.havingStyle(e.style.sup());l=Hr(i,m,e),p||(f=s.height-m.fontMetrics().supDrop*m.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());u=Hr(a,g,e),p||(d=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var y;e.style===nr.DISPLAY?y=h.sup1:e.style.cramped?y=h.sup3:y=h.sup2;var v=e.sizeMultiplier,x=St(.5/h.ptPerEm/v),b=null;if(u){var T=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof Cs||T)&&(b=St(-s.italic))}var S;if(l&&u){f=Math.max(f,y,l.depth+.25*h.xHeight),d=Math.max(d,h.sub2);var w=h.defaultRuleThickness,k=4*w;if(f-l.depth-(u.height-d)0&&(f+=A,d-=A)}var C=[{type:"elem",elem:u,shift:d,marginRight:x,marginLeft:b},{type:"elem",elem:l,shift:-f,marginRight:x}];S=$e.makeVList({positionType:"individualShift",children:C},e)}else if(u){d=Math.max(d,h.sub1,u.height-.8*h.xHeight);var R=[{type:"elem",elem:u,marginLeft:b,marginRight:x}];S=$e.makeVList({positionType:"shift",positionData:d,children:R},e)}else if(l)f=Math.max(f,y,l.depth+.25*h.xHeight),S=$e.makeVList({positionType:"shift",positionData:-f,children:[{type:"elem",elem:l,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var I=J7(s,"right")||"mord";return $e.makeSpan([I],[s,$e.makeSpan(["msupsub"],[S])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[wn(t.base,e)];t.sub&&a.push(wn(t.sub,e)),t.sup&&a.push(wn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var h=t.base;h&&h.type==="op"&&h.limits&&e.style===nr.DISPLAY||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(e.style===nr.DISPLAY||h.limits)?s="munderover":s="msubsup"}else{var u=t.base;u&&u.type==="op"&&u.limits&&(e.style===nr.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===nr.DISPLAY)?s="munder":s="msub"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===nr.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===nr.DISPLAY)?s="mover":s="msup"}return new mt.MathNode(s,a)}});dd({type:"atom",htmlBuilder(t,e){return $e.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new mt.MathNode("mo",[Lo(t.text,t.mode)]);if(t.family==="bin"){var n=hA(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});OU={mi:"italic",mn:"normal",mtext:"normal"};dd({type:"mathord",htmlBuilder(t,e){return $e.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new mt.MathNode("mi",[Lo(t.text,t.mode,e)]),n=hA(t,e)||"italic";return n!==OU[r.type]&&r.setAttribute("mathvariant",n),r}});dd({type:"textord",htmlBuilder(t,e){return $e.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=Lo(t.text,t.mode,e),n=hA(t,e)||"normal",i;return t.mode==="text"?i=new mt.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new mt.MathNode("mn",[r]):t.text==="\\prime"?i=new mt.MathNode("mo",[r]):i=new mt.MathNode("mi",[r]),n!==OU[i.type]&&i.setAttribute("mathvariant",n),i}});W7={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Y7={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};dd({type:"spacing",htmlBuilder(t,e){if(Y7.hasOwnProperty(t.text)){var r=Y7[t.text].className||"";if(t.mode==="text"){var n=$e.makeOrd(t,e,"textord");return n.classes.push(r),n}else return $e.makeSpan(["mspace",r],[$e.mathsym(t.text,t.mode,e)],e)}else{if(W7.hasOwnProperty(t.text))return $e.makeSpan(["mspace",W7[t.text]],[],e);throw new gt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(Y7.hasOwnProperty(t.text))r=new mt.MathNode("mtext",[new mt.TextNode("\xA0")]);else{if(W7.hasOwnProperty(t.text))return new mt.MathNode("mspace");throw new gt('Unknown type of space "'+t.text+'"')}return r}});BV=o(()=>{var t=new mt.MathNode("mtd",[]);return t.setAttribute("width","50%"),t},"pad");dd({type:"tag",mathmlBuilder(t,e){var r=new mt.MathNode("mtable",[new mt.MathNode("mtr",[BV(),new mt.MathNode("mtd",[Th(t.body,e)]),BV(),new mt.MathNode("mtd",[Th(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});FV={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},$V={"\\textbf":"textbf","\\textmd":"textmd"},Awe={"\\textit":"textit","\\textup":"textup"},zV=o((t,e)=>{var r=t.font;if(r){if(FV[r])return e.withTextFontFamily(FV[r]);if($V[r])return e.withTextFontWeight($V[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(Awe[r])},"optionsWithFont");Mt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:gi(i),font:n}},htmlBuilder(t,e){var r=zV(t,e),n=Ii(t.body,r,!0);return $e.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=zV(t,e);return Th(t.body,r)}});Mt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Hr(t.body,e),n=$e.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=$e.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return $e.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new mt.MathNode("mo",[new mt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new mt.MathNode("munder",[wn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});Mt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Hr(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return $e.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new mt.MathNode("mpadded",[wn(t.body,e)],["vcenter"])}});Mt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new gt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=GV(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),"makeVerb"),xh=iU,PU=`[ \r + ]`,_we="\\\\[a-zA-Z@]+",Dwe="\\\\[^\uD800-\uDFFF]",Lwe="("+_we+")"+PU+"*",Rwe=`\\\\( +|[ \r ]+ +?)[ \r ]*`,iA="[\u0300-\u036F]",Nwe=new RegExp(iA+"+$"),Mwe="("+PU+"+)|"+(Rwe+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(iA+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(iA+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+Lwe)+("|"+Dwe+")"),S3=class{static{o(this,"Lexer")}constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp(Mwe,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new Do("EOF",new to(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new gt("Unexpected character: '"+e[r]+"'",new Do(e[r],new to(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` +`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new Do(i,new to(this,r,this.tokenRegex.lastIndex))}},aA=class{static{o(this,"Namespace")}constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new gt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},Iwe=SU;ce("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});ce("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});ce("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});ce("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});ce("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});ce("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");ce("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});VV={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};ce("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new gt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=VV[e.text],n==null||n>=r)throw new gt("Invalid base-"+r+" digit "+e.text);for(var i;(i=VV[t.future().text])!=null&&i{var i=t.consumeArg().tokens;if(i.length!==1)throw new gt("\\newcommand's first argument must be a macro name");var a=i[0].text,s=t.isDefined(a);if(s&&!e)throw new gt("\\newcommand{"+a+"} attempting to redefine "+(a+"; use \\renewcommand"));if(!s&&!r)throw new gt("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");var l=0;if(i=t.consumeArg().tokens,i.length===1&&i[0].text==="["){for(var u="",h=t.expandNextToken();h.text!=="]"&&h.text!=="EOF";)u+=h.text,h=t.expandNextToken();if(!u.match(/^\s*[0-9]+\s*$/))throw new gt("Invalid number of arguments: "+u);l=parseInt(u),i=t.consumeArg().tokens}return s&&n||t.macros.set(a,{tokens:i,numArgs:l}),""},"newcommand");ce("\\newcommand",t=>TA(t,!1,!0,!1));ce("\\renewcommand",t=>TA(t,!0,!1,!1));ce("\\providecommand",t=>TA(t,!0,!0,!0));ce("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});ce("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});ce("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),xh[r],Nn.math[r],Nn.text[r]),""});ce("\\bgroup","{");ce("\\egroup","}");ce("~","\\nobreakspace");ce("\\lq","`");ce("\\rq","'");ce("\\aa","\\r a");ce("\\AA","\\r A");ce("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");ce("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");ce("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");ce("\u212C","\\mathscr{B}");ce("\u2130","\\mathscr{E}");ce("\u2131","\\mathscr{F}");ce("\u210B","\\mathscr{H}");ce("\u2110","\\mathscr{I}");ce("\u2112","\\mathscr{L}");ce("\u2133","\\mathscr{M}");ce("\u211B","\\mathscr{R}");ce("\u212D","\\mathfrak{C}");ce("\u210C","\\mathfrak{H}");ce("\u2128","\\mathfrak{Z}");ce("\\Bbbk","\\Bbb{k}");ce("\xB7","\\cdotp");ce("\\llap","\\mathllap{\\textrm{#1}}");ce("\\rlap","\\mathrlap{\\textrm{#1}}");ce("\\clap","\\mathclap{\\textrm{#1}}");ce("\\mathstrut","\\vphantom{(}");ce("\\underbar","\\underline{\\text{#1}}");ce("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');ce("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");ce("\\ne","\\neq");ce("\u2260","\\neq");ce("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");ce("\u2209","\\notin");ce("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");ce("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");ce("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");ce("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");ce("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");ce("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");ce("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");ce("\u27C2","\\perp");ce("\u203C","\\mathclose{!\\mkern-0.8mu!}");ce("\u220C","\\notni");ce("\u231C","\\ulcorner");ce("\u231D","\\urcorner");ce("\u231E","\\llcorner");ce("\u231F","\\lrcorner");ce("\xA9","\\copyright");ce("\xAE","\\textregistered");ce("\uFE0F","\\textregistered");ce("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');ce("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');ce("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');ce("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');ce("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");ce("\u22EE","\\vdots");ce("\\varGamma","\\mathit{\\Gamma}");ce("\\varDelta","\\mathit{\\Delta}");ce("\\varTheta","\\mathit{\\Theta}");ce("\\varLambda","\\mathit{\\Lambda}");ce("\\varXi","\\mathit{\\Xi}");ce("\\varPi","\\mathit{\\Pi}");ce("\\varSigma","\\mathit{\\Sigma}");ce("\\varUpsilon","\\mathit{\\Upsilon}");ce("\\varPhi","\\mathit{\\Phi}");ce("\\varPsi","\\mathit{\\Psi}");ce("\\varOmega","\\mathit{\\Omega}");ce("\\substack","\\begin{subarray}{c}#1\\end{subarray}");ce("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");ce("\\boxed","\\fbox{$\\displaystyle{#1}$}");ce("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");ce("\\implies","\\DOTSB\\;\\Longrightarrow\\;");ce("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");ce("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");ce("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");UV={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};ce("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in UV?e=UV[r]:(r.slice(0,4)==="\\not"||r in Nn.math&&er.contains(["bin","rel"],Nn.math[r].group))&&(e="\\dotsb"),e});wA={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};ce("\\dotso",function(t){var e=t.future().text;return e in wA?"\\ldots\\,":"\\ldots"});ce("\\dotsc",function(t){var e=t.future().text;return e in wA&&e!==","?"\\ldots\\,":"\\ldots"});ce("\\cdots",function(t){var e=t.future().text;return e in wA?"\\@cdots\\,":"\\@cdots"});ce("\\dotsb","\\cdots");ce("\\dotsm","\\cdots");ce("\\dotsi","\\!\\cdots");ce("\\dotsx","\\ldots\\,");ce("\\DOTSI","\\relax");ce("\\DOTSB","\\relax");ce("\\DOTSX","\\relax");ce("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");ce("\\,","\\tmspace+{3mu}{.1667em}");ce("\\thinspace","\\,");ce("\\>","\\mskip{4mu}");ce("\\:","\\tmspace+{4mu}{.2222em}");ce("\\medspace","\\:");ce("\\;","\\tmspace+{5mu}{.2777em}");ce("\\thickspace","\\;");ce("\\!","\\tmspace-{3mu}{.1667em}");ce("\\negthinspace","\\!");ce("\\negmedspace","\\tmspace-{4mu}{.2222em}");ce("\\negthickspace","\\tmspace-{5mu}{.277em}");ce("\\enspace","\\kern.5em ");ce("\\enskip","\\hskip.5em\\relax");ce("\\quad","\\hskip1em\\relax");ce("\\qquad","\\hskip2em\\relax");ce("\\tag","\\@ifstar\\tag@literal\\tag@paren");ce("\\tag@paren","\\tag@literal{({#1})}");ce("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new gt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});ce("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");ce("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");ce("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");ce("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");ce("\\newline","\\\\\\relax");ce("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");BU=St(Ql["Main-Regular"][84][1]-.7*Ql["Main-Regular"][65][1]);ce("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+BU+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");ce("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+BU+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");ce("\\hspace","\\@ifstar\\@hspacer\\@hspace");ce("\\@hspace","\\hskip #1\\relax");ce("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");ce("\\ordinarycolon",":");ce("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");ce("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');ce("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');ce("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');ce("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');ce("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');ce("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');ce("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');ce("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');ce("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');ce("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');ce("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');ce("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');ce("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');ce("\u2237","\\dblcolon");ce("\u2239","\\eqcolon");ce("\u2254","\\coloneqq");ce("\u2255","\\eqqcolon");ce("\u2A74","\\Coloneqq");ce("\\ratio","\\vcentcolon");ce("\\coloncolon","\\dblcolon");ce("\\colonequals","\\coloneqq");ce("\\coloncolonequals","\\Coloneqq");ce("\\equalscolon","\\eqqcolon");ce("\\equalscoloncolon","\\Eqqcolon");ce("\\colonminus","\\coloneq");ce("\\coloncolonminus","\\Coloneq");ce("\\minuscolon","\\eqcolon");ce("\\minuscoloncolon","\\Eqcolon");ce("\\coloncolonapprox","\\Colonapprox");ce("\\coloncolonsim","\\Colonsim");ce("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");ce("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");ce("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");ce("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");ce("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");ce("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");ce("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");ce("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");ce("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");ce("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");ce("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");ce("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");ce("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");ce("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");ce("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");ce("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");ce("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");ce("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");ce("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");ce("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");ce("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");ce("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");ce("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");ce("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");ce("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");ce("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");ce("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");ce("\\imath","\\html@mathml{\\@imath}{\u0131}");ce("\\jmath","\\html@mathml{\\@jmath}{\u0237}");ce("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");ce("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");ce("\u27E6","\\llbracket");ce("\u27E7","\\rrbracket");ce("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");ce("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");ce("\u2983","\\lBrace");ce("\u2984","\\rBrace");ce("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");ce("\u29B5","\\minuso");ce("\\darr","\\downarrow");ce("\\dArr","\\Downarrow");ce("\\Darr","\\Downarrow");ce("\\lang","\\langle");ce("\\rang","\\rangle");ce("\\uarr","\\uparrow");ce("\\uArr","\\Uparrow");ce("\\Uarr","\\Uparrow");ce("\\N","\\mathbb{N}");ce("\\R","\\mathbb{R}");ce("\\Z","\\mathbb{Z}");ce("\\alef","\\aleph");ce("\\alefsym","\\aleph");ce("\\Alpha","\\mathrm{A}");ce("\\Beta","\\mathrm{B}");ce("\\bull","\\bullet");ce("\\Chi","\\mathrm{X}");ce("\\clubs","\\clubsuit");ce("\\cnums","\\mathbb{C}");ce("\\Complex","\\mathbb{C}");ce("\\Dagger","\\ddagger");ce("\\diamonds","\\diamondsuit");ce("\\empty","\\emptyset");ce("\\Epsilon","\\mathrm{E}");ce("\\Eta","\\mathrm{H}");ce("\\exist","\\exists");ce("\\harr","\\leftrightarrow");ce("\\hArr","\\Leftrightarrow");ce("\\Harr","\\Leftrightarrow");ce("\\hearts","\\heartsuit");ce("\\image","\\Im");ce("\\infin","\\infty");ce("\\Iota","\\mathrm{I}");ce("\\isin","\\in");ce("\\Kappa","\\mathrm{K}");ce("\\larr","\\leftarrow");ce("\\lArr","\\Leftarrow");ce("\\Larr","\\Leftarrow");ce("\\lrarr","\\leftrightarrow");ce("\\lrArr","\\Leftrightarrow");ce("\\Lrarr","\\Leftrightarrow");ce("\\Mu","\\mathrm{M}");ce("\\natnums","\\mathbb{N}");ce("\\Nu","\\mathrm{N}");ce("\\Omicron","\\mathrm{O}");ce("\\plusmn","\\pm");ce("\\rarr","\\rightarrow");ce("\\rArr","\\Rightarrow");ce("\\Rarr","\\Rightarrow");ce("\\real","\\Re");ce("\\reals","\\mathbb{R}");ce("\\Reals","\\mathbb{R}");ce("\\Rho","\\mathrm{P}");ce("\\sdot","\\cdot");ce("\\sect","\\S");ce("\\spades","\\spadesuit");ce("\\sub","\\subset");ce("\\sube","\\subseteq");ce("\\supe","\\supseteq");ce("\\Tau","\\mathrm{T}");ce("\\thetasym","\\vartheta");ce("\\weierp","\\wp");ce("\\Zeta","\\mathrm{Z}");ce("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");ce("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");ce("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");ce("\\bra","\\mathinner{\\langle{#1}|}");ce("\\ket","\\mathinner{|{#1}\\rangle}");ce("\\braket","\\mathinner{\\langle{#1}\\rangle}");ce("\\Bra","\\left\\langle#1\\right|");ce("\\Ket","\\left|#1\\right\\rangle");FU=o(t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),l=e.macros.get("\\|");e.macros.beginGroup();var u=o(d=>p=>{t&&(p.macros.set("|",s),i.length&&p.macros.set("\\|",l));var m=d;if(!d&&i.length){var g=p.future();g.text==="|"&&(p.popToken(),m=!0)}return{tokens:m?i:n,numArgs:0}},"midMacro");e.macros.set("|",u(!1)),i.length&&e.macros.set("\\|",u(!0));var h=e.consumeArg().tokens,f=e.expandTokens([...a,...h,...r]);return e.macros.endGroup(),{tokens:f.reverse(),numArgs:0}},"braketHelper");ce("\\bra@ket",FU(!1));ce("\\bra@set",FU(!0));ce("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");ce("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");ce("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");ce("\\angln","{\\angl n}");ce("\\blue","\\textcolor{##6495ed}{#1}");ce("\\orange","\\textcolor{##ffa500}{#1}");ce("\\pink","\\textcolor{##ff00af}{#1}");ce("\\red","\\textcolor{##df0030}{#1}");ce("\\green","\\textcolor{##28ae7b}{#1}");ce("\\gray","\\textcolor{gray}{#1}");ce("\\purple","\\textcolor{##9d38bd}{#1}");ce("\\blueA","\\textcolor{##ccfaff}{#1}");ce("\\blueB","\\textcolor{##80f6ff}{#1}");ce("\\blueC","\\textcolor{##63d9ea}{#1}");ce("\\blueD","\\textcolor{##11accd}{#1}");ce("\\blueE","\\textcolor{##0c7f99}{#1}");ce("\\tealA","\\textcolor{##94fff5}{#1}");ce("\\tealB","\\textcolor{##26edd5}{#1}");ce("\\tealC","\\textcolor{##01d1c1}{#1}");ce("\\tealD","\\textcolor{##01a995}{#1}");ce("\\tealE","\\textcolor{##208170}{#1}");ce("\\greenA","\\textcolor{##b6ffb0}{#1}");ce("\\greenB","\\textcolor{##8af281}{#1}");ce("\\greenC","\\textcolor{##74cf70}{#1}");ce("\\greenD","\\textcolor{##1fab54}{#1}");ce("\\greenE","\\textcolor{##0d923f}{#1}");ce("\\goldA","\\textcolor{##ffd0a9}{#1}");ce("\\goldB","\\textcolor{##ffbb71}{#1}");ce("\\goldC","\\textcolor{##ff9c39}{#1}");ce("\\goldD","\\textcolor{##e07d10}{#1}");ce("\\goldE","\\textcolor{##a75a05}{#1}");ce("\\redA","\\textcolor{##fca9a9}{#1}");ce("\\redB","\\textcolor{##ff8482}{#1}");ce("\\redC","\\textcolor{##f9685d}{#1}");ce("\\redD","\\textcolor{##e84d39}{#1}");ce("\\redE","\\textcolor{##bc2612}{#1}");ce("\\maroonA","\\textcolor{##ffbde0}{#1}");ce("\\maroonB","\\textcolor{##ff92c6}{#1}");ce("\\maroonC","\\textcolor{##ed5fa6}{#1}");ce("\\maroonD","\\textcolor{##ca337c}{#1}");ce("\\maroonE","\\textcolor{##9e034e}{#1}");ce("\\purpleA","\\textcolor{##ddd7ff}{#1}");ce("\\purpleB","\\textcolor{##c6b9fc}{#1}");ce("\\purpleC","\\textcolor{##aa87ff}{#1}");ce("\\purpleD","\\textcolor{##7854ab}{#1}");ce("\\purpleE","\\textcolor{##543b78}{#1}");ce("\\mintA","\\textcolor{##f5f9e8}{#1}");ce("\\mintB","\\textcolor{##edf2df}{#1}");ce("\\mintC","\\textcolor{##e0e5cc}{#1}");ce("\\grayA","\\textcolor{##f6f7f7}{#1}");ce("\\grayB","\\textcolor{##f0f1f2}{#1}");ce("\\grayC","\\textcolor{##e3e5e6}{#1}");ce("\\grayD","\\textcolor{##d6d8da}{#1}");ce("\\grayE","\\textcolor{##babec2}{#1}");ce("\\grayF","\\textcolor{##888d93}{#1}");ce("\\grayG","\\textcolor{##626569}{#1}");ce("\\grayH","\\textcolor{##3b3e40}{#1}");ce("\\grayI","\\textcolor{##21242c}{#1}");ce("\\kaBlue","\\textcolor{##314453}{#1}");ce("\\kaGreen","\\textcolor{##71B307}{#1}");$U={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},sA=class{static{o(this,"MacroExpander")}constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new aA(Iwe,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new S3(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new Do("EOF",n.loc)),this.pushTokens(i),r.range(n,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,l=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new gt("Extra }",a)}else if(a.text==="EOF")throw new gt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[l]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[l]==="{")&&a.text===e[l]){if(++l,l===e.length){r.splice(-l,l);break}}else l=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new gt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new gt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new gt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var l=a.length-1;l>=0;--l){var u=a[l];if(u.text==="#"){if(l===0)throw new gt("Incomplete placeholder at end of macro body",u);if(u=a[--l],u.text==="#")a.splice(l+1,1);else if(/^[1-9]$/.test(u.text))a.splice(l,2,...s[+u.text-1]);else throw new gt("Not a valid argument number",u)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Do(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var l=new S3(i,this.settings),u=[],h=l.lex();h.text!=="EOF";)u.push(h),h=l.lex();u.reverse();var f={tokens:u,numArgs:a};return f}return i}isDefined(e){return this.macros.has(e)||xh.hasOwnProperty(e)||Nn.math.hasOwnProperty(e)||Nn.text.hasOwnProperty(e)||$U.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:xh.hasOwnProperty(e)&&!xh[e].primitive}},HV=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,y3=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),X7={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},qV={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},C3=class t{static{o(this,"Parser")}constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new sA(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new gt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new Do("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&xh[i.text]&&xh[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var l=Nn[this.mode][r].group,u=to.range(e),h;if(STe.hasOwnProperty(l)){var f=l;h={type:"atom",mode:this.mode,family:f,loc:u,text:r}}else h={type:l,mode:this.mode,loc:u,text:r};s=h}else if(r.charCodeAt(0)>=128)this.settings.strict&&(YV(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:to.range(e),text:r};else return null;if(this.consume(),a)for(var d=0;d{e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),yh.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var pd,Pwe,Bwe,KU,XU,sr,$we,zwe,Gwe,Vwe,QU,md,vr,Uwe,Hwe,rc,SA,qwe,Wwe,jU,I3,kn,gd,Ywe,kh,tt,gr=N(()=>{"use strict";O7();pd=//gi,Pwe=o(t=>t?QU(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),Bwe=(()=>{let t=!1;return()=>{t||(Fwe(),t=!0)}})();o(Fwe,"setupDompurifyHooks");KU=o(t=>(Bwe(),yh.sanitize(t)),"removeScript"),XU=o((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;r==="antiscript"||r==="strict"?t=KU(t):r!=="loose"&&(t=QU(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=Vwe(t))}return t},"sanitizeMore"),sr=o((t,e)=>t&&(e.dompurifyConfig?t=yh.sanitize(XU(t,e),e.dompurifyConfig).toString():t=yh.sanitize(XU(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),$we=o((t,e)=>typeof t=="string"?sr(t,e):t.flat().map(r=>sr(r,e)),"sanitizeTextOrArray"),zwe=o(t=>pd.test(t),"hasBreaks"),Gwe=o(t=>t.split(pd),"splitBreaks"),Vwe=o(t=>t.replace(/#br#/g,"
      "),"placeholderToBreak"),QU=o(t=>t.replace(pd,"#br#"),"breakToPlaceholder"),md=o(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),vr=o(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),Uwe=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),Hwe=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),rc=o(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),qwe=o((t,e)=>{let r=SA(t,"~"),n=SA(e,"~");return r===1&&n===1},"shouldCombineSets"),Wwe=o(t=>{let e=SA(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),jU=o(()=>window.MathMLElement!==void 0,"isMathMLSupported"),I3=/\$\$(.*)\$\$/g,kn=o(t=>(t.match(I3)?.length??0)>0,"hasKatex"),gd=o(async(t,e)=>{let r=document.createElement("div");r.innerHTML=await kh(t,e),r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),Ywe=o(async(t,e)=>{if(!kn(t))return t;if(!(jU()||e.legacyMathML||e.forceLegacyMathML))return t.replace(I3,"MathML is unsupported in this environment.");{let{default:r}=await Promise.resolve().then(()=>(YU(),WU)),n=e.forceLegacyMathML||!jU()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(pd).map(i=>kn(i)?`
      ${i}
      `:`
      ${i}
      `).join("").replace(I3,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))}return t.replace(I3,"Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.")},"renderKatexUnsanitized"),kh=o(async(t,e)=>sr(await Ywe(t,e),e),"renderKatexSanitized"),tt={getRows:Pwe,sanitizeText:sr,sanitizeTextOrArray:$we,hasBreaks:zwe,splitBreaks:Gwe,lineBreakRegex:pd,removeScript:KU,getUrl:md,evaluate:vr,getMax:Uwe,getMin:Hwe}});var AA,CA,ZU,O3,JU,eH,_s,nc=N(()=>{"use strict";sG();qn();gr();pt();AA={body:'?',height:80,width:80},CA=new Map,ZU=new Map,O3=o(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(X.debug("Registering icon pack:",e.name),"loader"in e)ZU.set(e.name,e.loader);else if("icons"in e)CA.set(e.name,e.icons);else throw X.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),JU=o(async(t,e)=>{let r=r7(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=CA.get(n);if(!i){let s=ZU.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},CA.set(n,i)}catch(l){throw X.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=i7(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),eH=o(async t=>{try{return await JU(t),!0}catch{return!1}},"isIconAvailable"),_s=o(async(t,e,r)=>{let n;try{n=await JU(t,e?.fallbackPrefix)}catch(s){X.error(s),n=AA}let i=s7(n,e),a=l7(o7(i.body),{...i.attributes,...r});return sr(a,Qt())},"getIconSVG")});function P3(t){for(var e=[],r=1;r{"use strict";o(P3,"dedent")});var B3,yd,tH,F3=N(()=>{"use strict";B3=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,yd=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,tH=/\s*%%.*\n/gm});var A0,DA=N(()=>{"use strict";A0=class extends Error{static{o(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}});var gu,_0,ev,LA,rH,vd=N(()=>{"use strict";pt();F3();DA();gu={},_0=o(function(t,e){t=t.replace(B3,"").replace(yd,"").replace(tH,` +`);for(let[r,{detector:n}]of Object.entries(gu))if(n(t,e))return r;throw new A0(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),ev=o((...t)=>{for(let{id:e,detector:r,loader:n}of t)LA(e,r,n)},"registerLazyLoadedDiagrams"),LA=o((t,e,r)=>{gu[t]&&X.warn(`Detector with key ${t} already exists. Overwriting.`),gu[t]={detector:e,loader:r},X.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),rH=o(t=>gu[t].loader,"getDiagramLoader")});var tv,nH,RA=N(()=>{"use strict";tv=(function(){var t=o(function(He,Le,Ie,Ne){for(Ie=Ie||{},Ne=He.length;Ne--;Ie[He[Ne]]=Le);return Ie},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],l=[1,64],u=[1,65],h=[1,66],f=[1,67],d=[1,68],p=[1,69],m=[1,29],g=[1,30],y=[1,31],v=[1,32],x=[1,33],b=[1,34],T=[1,35],S=[1,36],w=[1,37],k=[1,38],A=[1,39],C=[1,40],R=[1,41],I=[1,42],L=[1,43],E=[1,44],D=[1,45],_=[1,46],O=[1,47],M=[1,48],P=[1,50],B=[1,51],F=[1,52],G=[1,53],$=[1,54],U=[1,55],j=[1,56],te=[1,57],Y=[1,58],oe=[1,59],J=[1,60],ue=[14,42],re=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],ee=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Z=[1,82],K=[1,83],ae=[1,84],Q=[1,85],de=[12,14,42],ne=[12,14,33,42],Te=[12,14,33,42,76,77,79,80],q=[12,33],Ve=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],pe={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:o(function(Le,Ie,Ne,Ce,Fe,fe,xe){var W=fe.length-1;switch(Fe){case 3:Ce.setDirection("TB");break;case 4:Ce.setDirection("BT");break;case 5:Ce.setDirection("RL");break;case 6:Ce.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:Ce.setC4Type(fe[W-3]);break;case 19:Ce.setTitle(fe[W].substring(6)),this.$=fe[W].substring(6);break;case 20:Ce.setAccDescription(fe[W].substring(15)),this.$=fe[W].substring(15);break;case 21:this.$=fe[W].trim(),Ce.setTitle(this.$);break;case 22:case 23:this.$=fe[W].trim(),Ce.setAccDescription(this.$);break;case 28:fe[W].splice(2,0,"ENTERPRISE"),Ce.addPersonOrSystemBoundary(...fe[W]),this.$=fe[W];break;case 29:fe[W].splice(2,0,"SYSTEM"),Ce.addPersonOrSystemBoundary(...fe[W]),this.$=fe[W];break;case 30:Ce.addPersonOrSystemBoundary(...fe[W]),this.$=fe[W];break;case 31:fe[W].splice(2,0,"CONTAINER"),Ce.addContainerBoundary(...fe[W]),this.$=fe[W];break;case 32:Ce.addDeploymentNode("node",...fe[W]),this.$=fe[W];break;case 33:Ce.addDeploymentNode("nodeL",...fe[W]),this.$=fe[W];break;case 34:Ce.addDeploymentNode("nodeR",...fe[W]),this.$=fe[W];break;case 35:Ce.popBoundaryParseStack();break;case 39:Ce.addPersonOrSystem("person",...fe[W]),this.$=fe[W];break;case 40:Ce.addPersonOrSystem("external_person",...fe[W]),this.$=fe[W];break;case 41:Ce.addPersonOrSystem("system",...fe[W]),this.$=fe[W];break;case 42:Ce.addPersonOrSystem("system_db",...fe[W]),this.$=fe[W];break;case 43:Ce.addPersonOrSystem("system_queue",...fe[W]),this.$=fe[W];break;case 44:Ce.addPersonOrSystem("external_system",...fe[W]),this.$=fe[W];break;case 45:Ce.addPersonOrSystem("external_system_db",...fe[W]),this.$=fe[W];break;case 46:Ce.addPersonOrSystem("external_system_queue",...fe[W]),this.$=fe[W];break;case 47:Ce.addContainer("container",...fe[W]),this.$=fe[W];break;case 48:Ce.addContainer("container_db",...fe[W]),this.$=fe[W];break;case 49:Ce.addContainer("container_queue",...fe[W]),this.$=fe[W];break;case 50:Ce.addContainer("external_container",...fe[W]),this.$=fe[W];break;case 51:Ce.addContainer("external_container_db",...fe[W]),this.$=fe[W];break;case 52:Ce.addContainer("external_container_queue",...fe[W]),this.$=fe[W];break;case 53:Ce.addComponent("component",...fe[W]),this.$=fe[W];break;case 54:Ce.addComponent("component_db",...fe[W]),this.$=fe[W];break;case 55:Ce.addComponent("component_queue",...fe[W]),this.$=fe[W];break;case 56:Ce.addComponent("external_component",...fe[W]),this.$=fe[W];break;case 57:Ce.addComponent("external_component_db",...fe[W]),this.$=fe[W];break;case 58:Ce.addComponent("external_component_queue",...fe[W]),this.$=fe[W];break;case 60:Ce.addRel("rel",...fe[W]),this.$=fe[W];break;case 61:Ce.addRel("birel",...fe[W]),this.$=fe[W];break;case 62:Ce.addRel("rel_u",...fe[W]),this.$=fe[W];break;case 63:Ce.addRel("rel_d",...fe[W]),this.$=fe[W];break;case 64:Ce.addRel("rel_l",...fe[W]),this.$=fe[W];break;case 65:Ce.addRel("rel_r",...fe[W]),this.$=fe[W];break;case 66:Ce.addRel("rel_b",...fe[W]),this.$=fe[W];break;case 67:fe[W].splice(0,1),Ce.addRel("rel",...fe[W]),this.$=fe[W];break;case 68:Ce.updateElStyle("update_el_style",...fe[W]),this.$=fe[W];break;case 69:Ce.updateRelStyle("update_rel_style",...fe[W]),this.$=fe[W];break;case 70:Ce.updateLayoutConfig("update_layout_config",...fe[W]),this.$=fe[W];break;case 71:this.$=[fe[W]];break;case 72:fe[W].unshift(fe[W-1]),this.$=fe[W];break;case 73:case 75:this.$=fe[W].trim();break;case 74:let he={};he[fe[W-1].trim()]=fe[W].trim(),this.$=he;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{14:[1,74]},t(ue,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J}),t(ue,[2,14]),t(re,[2,16],{12:[1,76]}),t(ue,[2,36],{12:[1,77]}),t(ee,[2,19]),t(ee,[2,20]),{25:[1,78]},{27:[1,79]},t(ee,[2,23]),{35:80,75:81,76:Z,77:K,79:ae,80:Q},{35:86,75:81,76:Z,77:K,79:ae,80:Q},{35:87,75:81,76:Z,77:K,79:ae,80:Q},{35:88,75:81,76:Z,77:K,79:ae,80:Q},{35:89,75:81,76:Z,77:K,79:ae,80:Q},{35:90,75:81,76:Z,77:K,79:ae,80:Q},{35:91,75:81,76:Z,77:K,79:ae,80:Q},{35:92,75:81,76:Z,77:K,79:ae,80:Q},{35:93,75:81,76:Z,77:K,79:ae,80:Q},{35:94,75:81,76:Z,77:K,79:ae,80:Q},{35:95,75:81,76:Z,77:K,79:ae,80:Q},{35:96,75:81,76:Z,77:K,79:ae,80:Q},{35:97,75:81,76:Z,77:K,79:ae,80:Q},{35:98,75:81,76:Z,77:K,79:ae,80:Q},{35:99,75:81,76:Z,77:K,79:ae,80:Q},{35:100,75:81,76:Z,77:K,79:ae,80:Q},{35:101,75:81,76:Z,77:K,79:ae,80:Q},{35:102,75:81,76:Z,77:K,79:ae,80:Q},{35:103,75:81,76:Z,77:K,79:ae,80:Q},{35:104,75:81,76:Z,77:K,79:ae,80:Q},t(de,[2,59]),{35:105,75:81,76:Z,77:K,79:ae,80:Q},{35:106,75:81,76:Z,77:K,79:ae,80:Q},{35:107,75:81,76:Z,77:K,79:ae,80:Q},{35:108,75:81,76:Z,77:K,79:ae,80:Q},{35:109,75:81,76:Z,77:K,79:ae,80:Q},{35:110,75:81,76:Z,77:K,79:ae,80:Q},{35:111,75:81,76:Z,77:K,79:ae,80:Q},{35:112,75:81,76:Z,77:K,79:ae,80:Q},{35:113,75:81,76:Z,77:K,79:ae,80:Q},{35:114,75:81,76:Z,77:K,79:ae,80:Q},{35:115,75:81,76:Z,77:K,79:ae,80:Q},{20:116,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J},{12:[1,118],33:[1,117]},{35:119,75:81,76:Z,77:K,79:ae,80:Q},{35:120,75:81,76:Z,77:K,79:ae,80:Q},{35:121,75:81,76:Z,77:K,79:ae,80:Q},{35:122,75:81,76:Z,77:K,79:ae,80:Q},{35:123,75:81,76:Z,77:K,79:ae,80:Q},{35:124,75:81,76:Z,77:K,79:ae,80:Q},{35:125,75:81,76:Z,77:K,79:ae,80:Q},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(ue,[2,15]),t(re,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(ue,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:k,54:A,55:C,56:R,57:I,58:L,59:E,60:D,61:_,62:O,63:M,64:P,65:B,66:F,67:G,68:$,69:U,70:j,71:te,72:Y,73:oe,74:J}),t(ee,[2,21]),t(ee,[2,22]),t(de,[2,39]),t(ne,[2,71],{75:81,35:132,76:Z,77:K,79:ae,80:Q}),t(Te,[2,73]),{78:[1,133]},t(Te,[2,75]),t(Te,[2,76]),t(de,[2,40]),t(de,[2,41]),t(de,[2,42]),t(de,[2,43]),t(de,[2,44]),t(de,[2,45]),t(de,[2,46]),t(de,[2,47]),t(de,[2,48]),t(de,[2,49]),t(de,[2,50]),t(de,[2,51]),t(de,[2,52]),t(de,[2,53]),t(de,[2,54]),t(de,[2,55]),t(de,[2,56]),t(de,[2,57]),t(de,[2,58]),t(de,[2,60]),t(de,[2,61]),t(de,[2,62]),t(de,[2,63]),t(de,[2,64]),t(de,[2,65]),t(de,[2,66]),t(de,[2,67]),t(de,[2,68]),t(de,[2,69]),t(de,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(q,[2,28]),t(q,[2,29]),t(q,[2,30]),t(q,[2,31]),t(q,[2,32]),t(q,[2,33]),t(q,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(re,[2,18]),t(ue,[2,38]),t(ne,[2,72]),t(Te,[2,74]),t(de,[2,24]),t(de,[2,35]),t(Ve,[2,25]),t(Ve,[2,26],{12:[1,138]}),t(Ve,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:o(function(Le,Ie){if(Ie.recoverable)this.trace(Le);else{var Ne=new Error(Le);throw Ne.hash=Ie,Ne}},"parseError"),parse:o(function(Le){var Ie=this,Ne=[0],Ce=[],Fe=[null],fe=[],xe=this.table,W="",he=0,z=0,se=0,le=2,ke=1,ve=fe.slice.call(arguments,1),ye=Object.create(this.lexer),Re={yy:{}};for(var _e in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_e)&&(Re.yy[_e]=this.yy[_e]);ye.setInput(Le,Re.yy),Re.yy.lexer=ye,Re.yy.parser=this,typeof ye.yylloc>"u"&&(ye.yylloc={});var ze=ye.yylloc;fe.push(ze);var Ke=ye.options&&ye.options.ranges;typeof Re.yy.parseError=="function"?this.parseError=Re.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xt(ft){Ne.length=Ne.length-2*ft,Fe.length=Fe.length-ft,fe.length=fe.length-ft}o(xt,"popStack");function We(){var ft;return ft=Ce.pop()||ye.lex()||ke,typeof ft!="number"&&(ft instanceof Array&&(Ce=ft,ft=Ce.pop()),ft=Ie.symbols_[ft]||ft),ft}o(We,"lex");for(var Oe,et,Ue,lt,Gt,vt,Lt={},dt,nt,bt,wt;;){if(Ue=Ne[Ne.length-1],this.defaultActions[Ue]?lt=this.defaultActions[Ue]:((Oe===null||typeof Oe>"u")&&(Oe=We()),lt=xe[Ue]&&xe[Ue][Oe]),typeof lt>"u"||!lt.length||!lt[0]){var yt="";wt=[];for(dt in xe[Ue])this.terminals_[dt]&&dt>le&&wt.push("'"+this.terminals_[dt]+"'");ye.showPosition?yt="Parse error on line "+(he+1)+`: +`+ye.showPosition()+` +Expecting `+wt.join(", ")+", got '"+(this.terminals_[Oe]||Oe)+"'":yt="Parse error on line "+(he+1)+": Unexpected "+(Oe==ke?"end of input":"'"+(this.terminals_[Oe]||Oe)+"'"),this.parseError(yt,{text:ye.match,token:this.terminals_[Oe]||Oe,line:ye.yylineno,loc:ze,expected:wt})}if(lt[0]instanceof Array&<.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ue+", token: "+Oe);switch(lt[0]){case 1:Ne.push(Oe),Fe.push(ye.yytext),fe.push(ye.yylloc),Ne.push(lt[1]),Oe=null,et?(Oe=et,et=null):(z=ye.yyleng,W=ye.yytext,he=ye.yylineno,ze=ye.yylloc,se>0&&se--);break;case 2:if(nt=this.productions_[lt[1]][1],Lt.$=Fe[Fe.length-nt],Lt._$={first_line:fe[fe.length-(nt||1)].first_line,last_line:fe[fe.length-1].last_line,first_column:fe[fe.length-(nt||1)].first_column,last_column:fe[fe.length-1].last_column},Ke&&(Lt._$.range=[fe[fe.length-(nt||1)].range[0],fe[fe.length-1].range[1]]),vt=this.performAction.apply(Lt,[W,z,he,Re.yy,lt[1],Fe,fe].concat(ve)),typeof vt<"u")return vt;nt&&(Ne=Ne.slice(0,-1*nt*2),Fe=Fe.slice(0,-1*nt),fe=fe.slice(0,-1*nt)),Ne.push(this.productions_[lt[1]][0]),Fe.push(Lt.$),fe.push(Lt._$),bt=xe[Ne[Ne.length-2]][Ne[Ne.length-1]],Ne.push(bt);break;case 3:return!0}}return!0},"parse")},Be=(function(){var He={EOF:1,parseError:o(function(Ie,Ne){if(this.yy.parser)this.yy.parser.parseError(Ie,Ne);else throw new Error(Ie)},"parseError"),setInput:o(function(Le,Ie){return this.yy=Ie||this.yy||{},this._input=Le,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Le=this._input[0];this.yytext+=Le,this.yyleng++,this.offset++,this.match+=Le,this.matched+=Le;var Ie=Le.match(/(?:\r\n?|\n).*/g);return Ie?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Le},"input"),unput:o(function(Le){var Ie=Le.length,Ne=Le.split(/(?:\r\n?|\n)/g);this._input=Le+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ie),this.offset-=Ie;var Ce=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ne.length-1&&(this.yylineno-=Ne.length-1);var Fe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ne?(Ne.length===Ce.length?this.yylloc.first_column:0)+Ce[Ce.length-Ne.length].length-Ne[0].length:this.yylloc.first_column-Ie},this.options.ranges&&(this.yylloc.range=[Fe[0],Fe[0]+this.yyleng-Ie]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Le){this.unput(this.match.slice(Le))},"less"),pastInput:o(function(){var Le=this.matched.substr(0,this.matched.length-this.match.length);return(Le.length>20?"...":"")+Le.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Le=this.match;return Le.length<20&&(Le+=this._input.substr(0,20-Le.length)),(Le.substr(0,20)+(Le.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Le=this.pastInput(),Ie=new Array(Le.length+1).join("-");return Le+this.upcomingInput()+` +`+Ie+"^"},"showPosition"),test_match:o(function(Le,Ie){var Ne,Ce,Fe;if(this.options.backtrack_lexer&&(Fe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Fe.yylloc.range=this.yylloc.range.slice(0))),Ce=Le[0].match(/(?:\r\n?|\n).*/g),Ce&&(this.yylineno+=Ce.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ce?Ce[Ce.length-1].length-Ce[Ce.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Le[0].length},this.yytext+=Le[0],this.match+=Le[0],this.matches=Le,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Le[0].length),this.matched+=Le[0],Ne=this.performAction.call(this,this.yy,this,Ie,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ne)return Ne;if(this._backtrack){for(var fe in Fe)this[fe]=Fe[fe];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Le,Ie,Ne,Ce;this._more||(this.yytext="",this.match="");for(var Fe=this._currentRules(),fe=0;feIe[0].length)){if(Ie=Ne,Ce=fe,this.options.backtrack_lexer){if(Le=this.test_match(Ne,Fe[fe]),Le!==!1)return Le;if(this._backtrack){Ie=!1;continue}else return!1}else if(!this.options.flex)break}return Ie?(Le=this.test_match(Ie,Fe[Ce]),Le!==!1?Le:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ie=this.next();return Ie||this.lex()},"lex"),begin:o(function(Ie){this.conditionStack.push(Ie)},"begin"),popState:o(function(){var Ie=this.conditionStack.length-1;return Ie>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ie){return Ie=this.conditionStack.length-1-Math.abs(Ie||0),Ie>=0?this.conditionStack[Ie]:"INITIAL"},"topState"),pushState:o(function(Ie){this.begin(Ie)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ie,Ne,Ce,Fe){var fe=Fe;switch(Ce){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return He})();pe.lexer=Be;function Ye(){this.yy={}}return o(Ye,"Parser"),Ye.prototype=pe,pe.Parser=Ye,new Ye})();tv.parser=tv;nH=tv});var Xwe,jwe,mn,ic,Ei=N(()=>{"use strict";pt();Xwe=o(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),jwe=o(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),mn=o(function(t,e,r,n){let i=jwe(e,r,n);Xwe(t,i)},"configureSvgSize"),ic=o(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;X.info(`SVG bounds: ${a}x${s}`,i);let l=0,u=0;X.info(`Graph bounds: ${l}x${u}`,t),l=a+r*2,u=s+r*2,X.info(`Calculated bounds: ${l}x${u}`),mn(e,u,l,n);let h=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",h)},"setupGraphViewbox")});var $3,Kwe,iH,aH,NA=N(()=>{"use strict";pt();$3={},Kwe=o((t,e,r)=>{let n="";return t in $3&&$3[t]?n=$3[t](r):X.warn(`No theme found for ${t}`),` & { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + fill: ${r.textColor} + } + @keyframes edge-animation-frame { + from { + stroke-dashoffset: 0; + } + } + @keyframes dash { + to { + stroke-dashoffset: 0; + } + } + & .edge-animation-slow { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 50s linear infinite; + stroke-linecap: round; + } + & .edge-animation-fast { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 20s linear infinite; + stroke-linecap: round; + } + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${r.errorBkgColor}; + } + & .error-text { + fill: ${r.errorTextColor}; + stroke: ${r.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 1px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + & .edge-thickness-invisible { + stroke-width: 0; + fill: none; + } + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${r.lineColor}; + stroke: ${r.lineColor}; + } + & .marker.cross { + stroke: ${r.lineColor}; + } + + & svg { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + } + & p { + margin: 0 + } + + ${n} + + ${e} +`},"getStyles"),iH=o((t,e)=>{e!==void 0&&($3[t]=e)},"addStylesForDiagram"),aH=Kwe});var rv={};dr(rv,{clear:()=>Sr,getAccDescription:()=>Or,getAccTitle:()=>Mr,getDiagramTitle:()=>Pr,setAccDescription:()=>Ir,setAccTitle:()=>Rr,setDiagramTitle:()=>$r});var MA,IA,OA,PA,Sr,Rr,Mr,Ir,Or,$r,Pr,ci=N(()=>{"use strict";gr();qn();MA="",IA="",OA="",PA=o(t=>sr(t,Qt()),"sanitizeText"),Sr=o(()=>{MA="",OA="",IA=""},"clear"),Rr=o(t=>{MA=PA(t).replace(/^\s+/g,"")},"setAccTitle"),Mr=o(()=>MA,"getAccTitle"),Ir=o(t=>{OA=PA(t).replace(/\n\s+/g,` +`)},"setAccDescription"),Or=o(()=>OA,"getAccDescription"),$r=o(t=>{IA=PA(t)},"setDiagramTitle"),Pr=o(()=>IA,"getDiagramTitle")});var sH,Qwe,ge,nv,G3,iv,FA,Zwe,z3,xd,av,BA,Xt=N(()=>{"use strict";vd();pt();qn();gr();Ei();NA();ci();sH=X,Qwe=Dy,ge=Qt,nv=n3,G3=gh,iv=o(t=>sr(t,ge()),"sanitizeText"),FA=ic,Zwe=o(()=>rv,"getCommonDb"),z3={},xd=o((t,e,r)=>{z3[t]&&sH.warn(`Diagram with id ${t} already registered. Overwriting.`),z3[t]=e,r&&LA(t,r),iH(t,e.styles),e.injectUtils?.(sH,Qwe,ge,iv,FA,Zwe(),()=>{})},"registerDiagram"),av=o(t=>{if(t in z3)return z3[t];throw new BA(t)},"getDiagram"),BA=class extends Error{static{o(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}});var ml,Eh,ns,pl,ac,sv,$A,zA,V3,U3,oH,Jwe,eke,tke,rke,nke,ike,ake,ske,oke,lke,cke,uke,hke,fke,dke,pke,mke,lH,gke,yke,cH,vke,xke,bke,Tke,Sh,wke,kke,Eke,Ske,Cke,ov,GA=N(()=>{"use strict";Xt();gr();ci();ml=[],Eh=[""],ns="global",pl="",ac=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],sv=[],$A="",zA=!1,V3=4,U3=2,Jwe=o(function(){return oH},"getC4Type"),eke=o(function(t){oH=sr(t,ge())},"setC4Type"),tke=o(function(t,e,r,n,i,a,s,l,u){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let h={},f=sv.find(d=>d.from===e&&d.to===r);if(f?h=f:sv.push(h),h.type=t,h.from=e,h.to=r,h.label={text:n},i==null)h.techn={text:""};else if(typeof i=="object"){let[d,p]=Object.entries(i)[0];h[d]={text:p}}else h.techn={text:i};if(a==null)h.descr={text:""};else if(typeof a=="object"){let[d,p]=Object.entries(a)[0];h[d]={text:p}}else h.descr={text:a};if(typeof s=="object"){let[d,p]=Object.entries(s)[0];h[d]=p}else h.sprite=s;if(typeof l=="object"){let[d,p]=Object.entries(l)[0];h[d]=p}else h.tags=l;if(typeof u=="object"){let[d,p]=Object.entries(u)[0];h[d]=p}else h.link=u;h.wrap=Sh()},"addRel"),rke=o(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let l={},u=ml.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,ml.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.descr={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.descr={text:n};if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]=f}else l.sprite=i;if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.tags=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=ns,l.wrap=Sh()},"addPersonOrSystem"),nke=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ml.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ml.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Sh(),u.typeC4Shape={text:t},u.parentBoundary=ns},"addContainer"),ike=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ml.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ml.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=Sh(),u.typeC4Shape={text:t},u.parentBoundary=ns},"addComponent"),ake=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=ac.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,ac.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=ns,a.wrap=Sh(),pl=ns,ns=t,Eh.push(pl)},"addPersonOrSystemBoundary"),ske=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=ac.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,ac.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=ns,a.wrap=Sh(),pl=ns,ns=t,Eh.push(pl)},"addContainerBoundary"),oke=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ac.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ac.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.type={text:"node"};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.type={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.nodeType=t,u.parentBoundary=ns,u.wrap=Sh(),pl=ns,ns=e,Eh.push(pl)},"addDeploymentNode"),lke=o(function(){ns=pl,Eh.pop(),pl=Eh.pop(),Eh.push(pl)},"popBoundaryParseStack"),cke=o(function(t,e,r,n,i,a,s,l,u,h,f){let d=ml.find(p=>p.alias===e);if(!(d===void 0&&(d=ac.find(p=>p.alias===e),d===void 0))){if(r!=null)if(typeof r=="object"){let[p,m]=Object.entries(r)[0];d[p]=m}else d.bgColor=r;if(n!=null)if(typeof n=="object"){let[p,m]=Object.entries(n)[0];d[p]=m}else d.fontColor=n;if(i!=null)if(typeof i=="object"){let[p,m]=Object.entries(i)[0];d[p]=m}else d.borderColor=i;if(a!=null)if(typeof a=="object"){let[p,m]=Object.entries(a)[0];d[p]=m}else d.shadowing=a;if(s!=null)if(typeof s=="object"){let[p,m]=Object.entries(s)[0];d[p]=m}else d.shape=s;if(l!=null)if(typeof l=="object"){let[p,m]=Object.entries(l)[0];d[p]=m}else d.sprite=l;if(u!=null)if(typeof u=="object"){let[p,m]=Object.entries(u)[0];d[p]=m}else d.techn=u;if(h!=null)if(typeof h=="object"){let[p,m]=Object.entries(h)[0];d[p]=m}else d.legendText=h;if(f!=null)if(typeof f=="object"){let[p,m]=Object.entries(f)[0];d[p]=m}else d.legendSprite=f}},"updateElStyle"),uke=o(function(t,e,r,n,i,a,s){let l=sv.find(u=>u.from===e&&u.to===r);if(l!==void 0){if(n!=null)if(typeof n=="object"){let[u,h]=Object.entries(n)[0];l[u]=h}else l.textColor=n;if(i!=null)if(typeof i=="object"){let[u,h]=Object.entries(i)[0];l[u]=h}else l.lineColor=i;if(a!=null)if(typeof a=="object"){let[u,h]=Object.entries(a)[0];l[u]=parseInt(h)}else l.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[u,h]=Object.entries(s)[0];l[u]=parseInt(h)}else l.offsetY=parseInt(s)}},"updateRelStyle"),hke=o(function(t,e,r){let n=V3,i=U3;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&(V3=n),i>=1&&(U3=i)},"updateLayoutConfig"),fke=o(function(){return V3},"getC4ShapeInRow"),dke=o(function(){return U3},"getC4BoundaryInRow"),pke=o(function(){return ns},"getCurrentBoundaryParse"),mke=o(function(){return pl},"getParentBoundaryParse"),lH=o(function(t){return t==null?ml:ml.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),gke=o(function(t){return ml.find(e=>e.alias===t)},"getC4Shape"),yke=o(function(t){return Object.keys(lH(t))},"getC4ShapeKeys"),cH=o(function(t){return t==null?ac:ac.filter(e=>e.parentBoundary===t)},"getBoundaries"),vke=cH,xke=o(function(){return sv},"getRels"),bke=o(function(){return $A},"getTitle"),Tke=o(function(t){zA=t},"setWrap"),Sh=o(function(){return zA},"autoWrap"),wke=o(function(){ml=[],ac=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],pl="",ns="global",Eh=[""],sv=[],Eh=[""],$A="",zA=!1,V3=4,U3=2},"clear"),kke={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},Eke={FILLED:0,OPEN:1},Ske={LEFTOF:0,RIGHTOF:1,OVER:2},Cke=o(function(t){$A=sr(t,ge())},"setTitle"),ov={addPersonOrSystem:rke,addPersonOrSystemBoundary:ake,addContainer:nke,addContainerBoundary:ske,addComponent:ike,addDeploymentNode:oke,popBoundaryParseStack:lke,addRel:tke,updateElStyle:cke,updateRelStyle:uke,updateLayoutConfig:hke,autoWrap:Sh,setWrap:Tke,getC4ShapeArray:lH,getC4Shape:gke,getC4ShapeKeys:yke,getBoundaries:cH,getBoundarys:vke,getCurrentBoundaryParse:pke,getParentBoundaryParse:mke,getRels:xke,getTitle:bke,getC4Type:Jwe,getC4ShapeInRow:fke,getC4BoundaryInRow:dke,setAccTitle:Rr,getAccTitle:Mr,getAccDescription:Or,setAccDescription:Ir,getConfig:o(()=>ge().c4,"getConfig"),clear:wke,LINETYPE:kke,ARROWTYPE:Eke,PLACEMENT:Ske,setTitle:Cke,setC4Type:eke}});function bd(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var VA=N(()=>{"use strict";o(bd,"ascending")});function UA(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var uH=N(()=>{"use strict";o(UA,"descending")});function Td(t){let e,r,n;t.length!==2?(e=bd,r=o((l,u)=>bd(t(l),u),"compare2"),n=o((l,u)=>t(l)-u,"delta")):(e=t===bd||t===UA?t:Ake,r=t,n=t);function i(l,u,h=0,f=l.length){if(h>>1;r(l[d],u)<0?h=d+1:f=d}while(h>>1;r(l[d],u)<=0?h=d+1:f=d}while(hh&&n(l[d-1],u)>-n(l[d],u)?d-1:d}return o(s,"center"),{left:i,center:s,right:a}}function Ake(){return 0}var HA=N(()=>{"use strict";VA();uH();o(Td,"bisector");o(Ake,"zero")});function qA(t){return t===null?NaN:+t}var hH=N(()=>{"use strict";o(qA,"number")});var fH,dH,_ke,Dke,WA,pH=N(()=>{"use strict";VA();HA();hH();fH=Td(bd),dH=fH.right,_ke=fH.left,Dke=Td(qA).center,WA=dH});function mH({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function Lke({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function Rke({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function Nke(t){return t!==null&&typeof t=="object"?t.valueOf():t}var D0,gH=N(()=>{"use strict";D0=class extends Map{static{o(this,"InternMap")}constructor(e,r=Nke){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(mH(this,e))}has(e){return super.has(mH(this,e))}set(e,r){return super.set(Lke(this,e),r)}delete(e){return super.delete(Rke(this,e))}};o(mH,"intern_get");o(Lke,"intern_set");o(Rke,"intern_delete");o(Nke,"keyof")});function H3(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=Mke?10:a>=Ike?5:a>=Oke?2:1,l,u,h;return i<0?(h=Math.pow(10,-i)/s,l=Math.round(t*h),u=Math.round(e*h),l/he&&--u,h=-h):(h=Math.pow(10,i)*s,l=Math.round(t/h),u=Math.round(e/h),l*he&&--u),u0))return[];if(t===e)return[t];let n=e=i))return[];let l=a-i+1,u=new Array(l);if(n)if(s<0)for(let h=0;h{"use strict";Mke=Math.sqrt(50),Ike=Math.sqrt(10),Oke=Math.sqrt(2);o(H3,"tickSpec");o(q3,"ticks");o(lv,"tickIncrement");o(L0,"tickStep")});function W3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var vH=N(()=>{"use strict";o(W3,"max")});function Y3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var xH=N(()=>{"use strict";o(Y3,"min")});function X3(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{"use strict";o(X3,"range")});var Ch=N(()=>{"use strict";pH();HA();vH();xH();bH();yH();gH()});function YA(t){return t}var TH=N(()=>{"use strict";o(YA,"default")});function Pke(t){return"translate("+t+",0)"}function Bke(t){return"translate(0,"+t+")"}function Fke(t){return e=>+t(e)}function $ke(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function zke(){return!this.__axis}function kH(t,e){var r=[],n=null,i=null,a=6,s=6,l=3,u=typeof window<"u"&&window.devicePixelRatio>1?0:.5,h=t===K3||t===j3?-1:1,f=t===j3||t===XA?"x":"y",d=t===K3||t===jA?Pke:Bke;function p(m){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),y=i??(e.tickFormat?e.tickFormat.apply(e,r):YA),v=Math.max(a,0)+l,x=e.range(),b=+x[0]+u,T=+x[x.length-1]+u,S=(e.bandwidth?$ke:Fke)(e.copy(),u),w=m.selection?m.selection():m,k=w.selectAll(".domain").data([null]),A=w.selectAll(".tick").data(g,e).order(),C=A.exit(),R=A.enter().append("g").attr("class","tick"),I=A.select("line"),L=A.select("text");k=k.merge(k.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),A=A.merge(R),I=I.merge(R.append("line").attr("stroke","currentColor").attr(f+"2",h*a)),L=L.merge(R.append("text").attr("fill","currentColor").attr(f,h*v).attr("dy",t===K3?"0em":t===jA?"0.71em":"0.32em")),m!==w&&(k=k.transition(m),A=A.transition(m),I=I.transition(m),L=L.transition(m),C=C.transition(m).attr("opacity",wH).attr("transform",function(E){return isFinite(E=S(E))?d(E+u):this.getAttribute("transform")}),R.attr("opacity",wH).attr("transform",function(E){var D=this.parentNode.__axis;return d((D&&isFinite(D=D(E))?D:S(E))+u)})),C.remove(),k.attr("d",t===j3||t===XA?s?"M"+h*s+","+b+"H"+u+"V"+T+"H"+h*s:"M"+u+","+b+"V"+T:s?"M"+b+","+h*s+"V"+u+"H"+T+"V"+h*s:"M"+b+","+u+"H"+T),A.attr("opacity",1).attr("transform",function(E){return d(S(E)+u)}),I.attr(f+"2",h*a),L.attr(f,h*v).text(y),w.filter(zke).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===XA?"start":t===j3?"end":"middle"),w.each(function(){this.__axis=S})}return o(p,"axis"),p.scale=function(m){return arguments.length?(e=m,p):e},p.ticks=function(){return r=Array.from(arguments),p},p.tickArguments=function(m){return arguments.length?(r=m==null?[]:Array.from(m),p):r.slice()},p.tickValues=function(m){return arguments.length?(n=m==null?null:Array.from(m),p):n&&n.slice()},p.tickFormat=function(m){return arguments.length?(i=m,p):i},p.tickSize=function(m){return arguments.length?(a=s=+m,p):a},p.tickSizeInner=function(m){return arguments.length?(a=+m,p):a},p.tickSizeOuter=function(m){return arguments.length?(s=+m,p):s},p.tickPadding=function(m){return arguments.length?(l=+m,p):l},p.offset=function(m){return arguments.length?(u=+m,p):u},p}function KA(t){return kH(K3,t)}function QA(t){return kH(jA,t)}var K3,XA,jA,j3,wH,EH=N(()=>{"use strict";TH();K3=1,XA=2,jA=3,j3=4,wH=1e-6;o(Pke,"translateX");o(Bke,"translateY");o(Fke,"number");o($ke,"center");o(zke,"entering");o(kH,"axis");o(KA,"axisTop");o(QA,"axisBottom")});var SH=N(()=>{"use strict";EH()});function AH(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function Uke(t,e){for(var r=0,n=t.length,i;r{"use strict";Gke={value:o(()=>{},"value")};o(AH,"dispatch");o(Q3,"Dispatch");o(Vke,"parseTypenames");Q3.prototype=AH.prototype={constructor:Q3,on:o(function(t,e){var r=this._,n=Vke(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{"use strict";_H()});var Z3,e8,t8=N(()=>{"use strict";Z3="http://www.w3.org/1999/xhtml",e8={svg:"http://www.w3.org/2000/svg",xhtml:Z3,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function sc(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),e8.hasOwnProperty(e)?{space:e8[e],local:t}:t}var J3=N(()=>{"use strict";t8();o(sc,"default")});function Hke(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===Z3&&e.documentElement.namespaceURI===Z3?e.createElement(t):e.createElementNS(r,t)}}function qke(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function cv(t){var e=sc(t);return(e.local?qke:Hke)(e)}var r8=N(()=>{"use strict";J3();t8();o(Hke,"creatorInherit");o(qke,"creatorFixed");o(cv,"default")});function Wke(){}function Ah(t){return t==null?Wke:function(){return this.querySelector(t)}}var e5=N(()=>{"use strict";o(Wke,"none");o(Ah,"default")});function n8(t){typeof t!="function"&&(t=Ah(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";gl();e5();o(n8,"default")});function i8(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var LH=N(()=>{"use strict";o(i8,"array")});function Yke(){return[]}function R0(t){return t==null?Yke:function(){return this.querySelectorAll(t)}}var a8=N(()=>{"use strict";o(Yke,"empty");o(R0,"default")});function Xke(t){return function(){return i8(t.apply(this,arguments))}}function s8(t){typeof t=="function"?t=Xke(t):t=R0(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{"use strict";gl();LH();a8();o(Xke,"arrayAll");o(s8,"default")});function N0(t){return function(){return this.matches(t)}}function t5(t){return function(e){return e.matches(t)}}var uv=N(()=>{"use strict";o(N0,"default");o(t5,"childMatcher")});function Kke(t){return function(){return jke.call(this.children,t)}}function Qke(){return this.firstElementChild}function o8(t){return this.select(t==null?Qke:Kke(typeof t=="function"?t:t5(t)))}var jke,NH=N(()=>{"use strict";uv();jke=Array.prototype.find;o(Kke,"childFind");o(Qke,"childFirst");o(o8,"default")});function Jke(){return Array.from(this.children)}function eEe(t){return function(){return Zke.call(this.children,t)}}function l8(t){return this.selectAll(t==null?Jke:eEe(typeof t=="function"?t:t5(t)))}var Zke,MH=N(()=>{"use strict";uv();Zke=Array.prototype.filter;o(Jke,"children");o(eEe,"childrenFilter");o(l8,"default")});function c8(t){typeof t!="function"&&(t=N0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";gl();uv();o(c8,"default")});function hv(t){return new Array(t.length)}var u8=N(()=>{"use strict";o(hv,"default")});function h8(){return new ui(this._enter||this._groups.map(hv),this._parents)}function fv(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var f8=N(()=>{"use strict";u8();gl();o(h8,"default");o(fv,"EnterNode");fv.prototype={constructor:fv,appendChild:o(function(t){return this._parent.insertBefore(t,this._next)},"appendChild"),insertBefore:o(function(t,e){return this._parent.insertBefore(t,e)},"insertBefore"),querySelector:o(function(t){return this._parent.querySelector(t)},"querySelector"),querySelectorAll:o(function(t){return this._parent.querySelectorAll(t)},"querySelectorAll")}});function d8(t){return function(){return t}}var OH=N(()=>{"use strict";o(d8,"default")});function tEe(t,e,r,n,i,a){for(var s=0,l,u=e.length,h=a.length;s=T&&(T=b+1);!(w=v[T])&&++T{"use strict";gl();f8();OH();o(tEe,"bindIndex");o(rEe,"bindKey");o(nEe,"datum");o(p8,"default");o(iEe,"arraylike")});function m8(){return new ui(this._exit||this._groups.map(hv),this._parents)}var BH=N(()=>{"use strict";u8();gl();o(m8,"default")});function g8(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var FH=N(()=>{"use strict";o(g8,"default")});function y8(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),l=new Array(i),u=0;u{"use strict";gl();o(y8,"default")});function v8(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var zH=N(()=>{"use strict";o(v8,"default")});function x8(t){t||(t=aEe);function e(d,p){return d&&p?t(d.__data__,p.__data__):!d-!p}o(e,"compareNode");for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var GH=N(()=>{"use strict";gl();o(x8,"default");o(aEe,"ascending")});function b8(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var VH=N(()=>{"use strict";o(b8,"default")});function T8(){return Array.from(this)}var UH=N(()=>{"use strict";o(T8,"default")});function w8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(w8,"default")});function k8(){let t=0;for(let e of this)++t;return t}var qH=N(()=>{"use strict";o(k8,"default")});function E8(){return!this.node()}var WH=N(()=>{"use strict";o(E8,"default")});function S8(t){for(var e=this._groups,r=0,n=e.length;r{"use strict";o(S8,"default")});function sEe(t){return function(){this.removeAttribute(t)}}function oEe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function lEe(t,e){return function(){this.setAttribute(t,e)}}function cEe(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function uEe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function hEe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function C8(t,e){var r=sc(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?oEe:sEe:typeof e=="function"?r.local?hEe:uEe:r.local?cEe:lEe)(r,e))}var XH=N(()=>{"use strict";J3();o(sEe,"attrRemove");o(oEe,"attrRemoveNS");o(lEe,"attrConstant");o(cEe,"attrConstantNS");o(uEe,"attrFunction");o(hEe,"attrFunctionNS");o(C8,"default")});function dv(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var A8=N(()=>{"use strict";o(dv,"default")});function fEe(t){return function(){this.style.removeProperty(t)}}function dEe(t,e,r){return function(){this.style.setProperty(t,e,r)}}function pEe(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function _8(t,e,r){return arguments.length>1?this.each((e==null?fEe:typeof e=="function"?pEe:dEe)(t,e,r??"")):_h(this.node(),t)}function _h(t,e){return t.style.getPropertyValue(e)||dv(t).getComputedStyle(t,null).getPropertyValue(e)}var D8=N(()=>{"use strict";A8();o(fEe,"styleRemove");o(dEe,"styleConstant");o(pEe,"styleFunction");o(_8,"default");o(_h,"styleValue")});function mEe(t){return function(){delete this[t]}}function gEe(t,e){return function(){this[t]=e}}function yEe(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function L8(t,e){return arguments.length>1?this.each((e==null?mEe:typeof e=="function"?yEe:gEe)(t,e)):this.node()[t]}var jH=N(()=>{"use strict";o(mEe,"propertyRemove");o(gEe,"propertyConstant");o(yEe,"propertyFunction");o(L8,"default")});function KH(t){return t.trim().split(/^|\s+/)}function R8(t){return t.classList||new QH(t)}function QH(t){this._node=t,this._names=KH(t.getAttribute("class")||"")}function ZH(t,e){for(var r=R8(t),n=-1,i=e.length;++n{"use strict";o(KH,"classArray");o(R8,"classList");o(QH,"ClassList");QH.prototype={add:o(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:o(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:o(function(t){return this._names.indexOf(t)>=0},"contains")};o(ZH,"classedAdd");o(JH,"classedRemove");o(vEe,"classedTrue");o(xEe,"classedFalse");o(bEe,"classedFunction");o(N8,"default")});function TEe(){this.textContent=""}function wEe(t){return function(){this.textContent=t}}function kEe(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function M8(t){return arguments.length?this.each(t==null?TEe:(typeof t=="function"?kEe:wEe)(t)):this.node().textContent}var tq=N(()=>{"use strict";o(TEe,"textRemove");o(wEe,"textConstant");o(kEe,"textFunction");o(M8,"default")});function EEe(){this.innerHTML=""}function SEe(t){return function(){this.innerHTML=t}}function CEe(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function I8(t){return arguments.length?this.each(t==null?EEe:(typeof t=="function"?CEe:SEe)(t)):this.node().innerHTML}var rq=N(()=>{"use strict";o(EEe,"htmlRemove");o(SEe,"htmlConstant");o(CEe,"htmlFunction");o(I8,"default")});function AEe(){this.nextSibling&&this.parentNode.appendChild(this)}function O8(){return this.each(AEe)}var nq=N(()=>{"use strict";o(AEe,"raise");o(O8,"default")});function _Ee(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function P8(){return this.each(_Ee)}var iq=N(()=>{"use strict";o(_Ee,"lower");o(P8,"default")});function B8(t){var e=typeof t=="function"?t:cv(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var aq=N(()=>{"use strict";r8();o(B8,"default")});function DEe(){return null}function F8(t,e){var r=typeof t=="function"?t:cv(t),n=e==null?DEe:typeof e=="function"?e:Ah(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var sq=N(()=>{"use strict";r8();e5();o(DEe,"constantNull");o(F8,"default")});function LEe(){var t=this.parentNode;t&&t.removeChild(this)}function $8(){return this.each(LEe)}var oq=N(()=>{"use strict";o(LEe,"remove");o($8,"default")});function REe(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function NEe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function z8(t){return this.select(t?NEe:REe)}var lq=N(()=>{"use strict";o(REe,"selection_cloneShallow");o(NEe,"selection_cloneDeep");o(z8,"default")});function G8(t){return arguments.length?this.property("__data__",t):this.node().__data__}var cq=N(()=>{"use strict";o(G8,"default")});function MEe(t){return function(e){t.call(this,e,this.__data__)}}function IEe(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function OEe(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{"use strict";o(MEe,"contextListener");o(IEe,"parseTypenames");o(OEe,"onRemove");o(PEe,"onAdd");o(V8,"default")});function hq(t,e,r){var n=dv(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function BEe(t,e){return function(){return hq(this,t,e)}}function FEe(t,e){return function(){return hq(this,t,e.apply(this,arguments))}}function U8(t,e){return this.each((typeof e=="function"?FEe:BEe)(t,e))}var fq=N(()=>{"use strict";A8();o(hq,"dispatchEvent");o(BEe,"dispatchConstant");o(FEe,"dispatchFunction");o(U8,"default")});function*H8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(H8,"default")});function ui(t,e){this._groups=t,this._parents=e}function pq(){return new ui([[document.documentElement]],q8)}function $Ee(){return this}var q8,yu,gl=N(()=>{"use strict";DH();RH();NH();MH();IH();PH();f8();BH();FH();$H();zH();GH();VH();UH();HH();qH();WH();YH();XH();D8();jH();eq();tq();rq();nq();iq();aq();sq();oq();lq();cq();uq();fq();dq();q8=[null];o(ui,"Selection");o(pq,"selection");o($Ee,"selection_selection");ui.prototype=pq.prototype={constructor:ui,select:n8,selectAll:s8,selectChild:o8,selectChildren:l8,filter:c8,data:p8,enter:h8,exit:m8,join:g8,merge:y8,selection:$Ee,order:v8,sort:x8,call:b8,nodes:T8,node:w8,size:k8,empty:E8,each:S8,attr:C8,style:_8,property:L8,classed:N8,text:M8,html:I8,raise:O8,lower:P8,append:B8,insert:F8,remove:$8,clone:z8,datum:G8,on:V8,dispatch:U8,[Symbol.iterator]:H8};yu=pq});function qe(t){return typeof t=="string"?new ui([[document.querySelector(t)]],[document.documentElement]):new ui([[t]],q8)}var mq=N(()=>{"use strict";gl();o(qe,"default")});var yl=N(()=>{"use strict";uv();J3();mq();gl();e5();a8();D8()});var gq=N(()=>{"use strict"});function Dh(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function M0(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var W8=N(()=>{"use strict";o(Dh,"default");o(M0,"extend")});function Lh(){}function vq(){return this.rgb().formatHex()}function YEe(){return this.rgb().formatHex8()}function XEe(){return Sq(this).formatHsl()}function xq(){return this.rgb().formatRgb()}function xl(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=zEe.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?bq(e):r===3?new oa(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?r5(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?r5(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=GEe.exec(t))?new oa(e[1],e[2],e[3],1):(e=VEe.exec(t))?new oa(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=UEe.exec(t))?r5(e[1],e[2],e[3],e[4]):(e=HEe.exec(t))?r5(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=qEe.exec(t))?kq(e[1],e[2]/100,e[3]/100,1):(e=WEe.exec(t))?kq(e[1],e[2]/100,e[3]/100,e[4]):yq.hasOwnProperty(t)?bq(yq[t]):t==="transparent"?new oa(NaN,NaN,NaN,0):null}function bq(t){return new oa(t>>16&255,t>>8&255,t&255,1)}function r5(t,e,r,n){return n<=0&&(t=e=r=NaN),new oa(t,e,r,n)}function X8(t){return t instanceof Lh||(t=xl(t)),t?(t=t.rgb(),new oa(t.r,t.g,t.b,t.opacity)):new oa}function O0(t,e,r,n){return arguments.length===1?X8(t):new oa(t,e,r,n??1)}function oa(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function Tq(){return`#${wd(this.r)}${wd(this.g)}${wd(this.b)}`}function jEe(){return`#${wd(this.r)}${wd(this.g)}${wd(this.b)}${wd((isNaN(this.opacity)?1:this.opacity)*255)}`}function wq(){let t=a5(this.opacity);return`${t===1?"rgb(":"rgba("}${kd(this.r)}, ${kd(this.g)}, ${kd(this.b)}${t===1?")":`, ${t})`}`}function a5(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function kd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function wd(t){return t=kd(t),(t<16?"0":"")+t.toString(16)}function kq(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new vl(t,e,r,n)}function Sq(t){if(t instanceof vl)return new vl(t.h,t.s,t.l,t.opacity);if(t instanceof Lh||(t=xl(t)),!t)return new vl;if(t instanceof vl)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,l=a-i,u=(a+i)/2;return l?(e===a?s=(r-n)/l+(r0&&u<1?0:s,new vl(s,l,u,t.opacity)}function Cq(t,e,r,n){return arguments.length===1?Sq(t):new vl(t,e,r,n??1)}function vl(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function Eq(t){return t=(t||0)%360,t<0?t+360:t}function n5(t){return Math.max(0,Math.min(1,t||0))}function Y8(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var pv,i5,I0,mv,oc,zEe,GEe,VEe,UEe,HEe,qEe,WEe,yq,j8=N(()=>{"use strict";W8();o(Lh,"Color");pv=.7,i5=1/pv,I0="\\s*([+-]?\\d+)\\s*",mv="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",oc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",zEe=/^#([0-9a-f]{3,8})$/,GEe=new RegExp(`^rgb\\(${I0},${I0},${I0}\\)$`),VEe=new RegExp(`^rgb\\(${oc},${oc},${oc}\\)$`),UEe=new RegExp(`^rgba\\(${I0},${I0},${I0},${mv}\\)$`),HEe=new RegExp(`^rgba\\(${oc},${oc},${oc},${mv}\\)$`),qEe=new RegExp(`^hsl\\(${mv},${oc},${oc}\\)$`),WEe=new RegExp(`^hsla\\(${mv},${oc},${oc},${mv}\\)$`),yq={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Dh(Lh,xl,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:vq,formatHex:vq,formatHex8:YEe,formatHsl:XEe,formatRgb:xq,toString:xq});o(vq,"color_formatHex");o(YEe,"color_formatHex8");o(XEe,"color_formatHsl");o(xq,"color_formatRgb");o(xl,"color");o(bq,"rgbn");o(r5,"rgba");o(X8,"rgbConvert");o(O0,"rgb");o(oa,"Rgb");Dh(oa,O0,M0(Lh,{brighter(t){return t=t==null?i5:Math.pow(i5,t),new oa(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?pv:Math.pow(pv,t),new oa(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new oa(kd(this.r),kd(this.g),kd(this.b),a5(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:Tq,formatHex:Tq,formatHex8:jEe,formatRgb:wq,toString:wq}));o(Tq,"rgb_formatHex");o(jEe,"rgb_formatHex8");o(wq,"rgb_formatRgb");o(a5,"clampa");o(kd,"clampi");o(wd,"hex");o(kq,"hsla");o(Sq,"hslConvert");o(Cq,"hsl");o(vl,"Hsl");Dh(vl,Cq,M0(Lh,{brighter(t){return t=t==null?i5:Math.pow(i5,t),new vl(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?pv:Math.pow(pv,t),new vl(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new oa(Y8(t>=240?t-240:t+120,i,n),Y8(t,i,n),Y8(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new vl(Eq(this.h),n5(this.s),n5(this.l),a5(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=a5(this.opacity);return`${t===1?"hsl(":"hsla("}${Eq(this.h)}, ${n5(this.s)*100}%, ${n5(this.l)*100}%${t===1?")":`, ${t})`}`}}));o(Eq,"clamph");o(n5,"clampt");o(Y8,"hsl2rgb")});var Aq,_q,Dq=N(()=>{"use strict";Aq=Math.PI/180,_q=180/Math.PI});function Oq(t){if(t instanceof lc)return new lc(t.l,t.a,t.b,t.opacity);if(t instanceof vu)return Pq(t);t instanceof oa||(t=X8(t));var e=J8(t.r),r=J8(t.g),n=J8(t.b),i=K8((.2225045*e+.7168786*r+.0606169*n)/Rq),a,s;return e===r&&r===n?a=s=i:(a=K8((.4360747*e+.3850649*r+.1430804*n)/Lq),s=K8((.0139322*e+.0971045*r+.7141733*n)/Nq)),new lc(116*i-16,500*(a-i),200*(i-s),t.opacity)}function e_(t,e,r,n){return arguments.length===1?Oq(t):new lc(t,e,r,n??1)}function lc(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function K8(t){return t>KEe?Math.pow(t,1/3):t/Iq+Mq}function Q8(t){return t>P0?t*t*t:Iq*(t-Mq)}function Z8(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function J8(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function QEe(t){if(t instanceof vu)return new vu(t.h,t.c,t.l,t.opacity);if(t instanceof lc||(t=Oq(t)),t.a===0&&t.b===0)return new vu(NaN,0{"use strict";W8();j8();Dq();s5=18,Lq=.96422,Rq=1,Nq=.82521,Mq=4/29,P0=6/29,Iq=3*P0*P0,KEe=P0*P0*P0;o(Oq,"labConvert");o(e_,"lab");o(lc,"Lab");Dh(lc,e_,M0(Lh,{brighter(t){return new lc(this.l+s5*(t??1),this.a,this.b,this.opacity)},darker(t){return new lc(this.l-s5*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=Lq*Q8(e),t=Rq*Q8(t),r=Nq*Q8(r),new oa(Z8(3.1338561*e-1.6168667*t-.4906146*r),Z8(-.9787684*e+1.9161415*t+.033454*r),Z8(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));o(K8,"xyz2lab");o(Q8,"lab2xyz");o(Z8,"lrgb2rgb");o(J8,"rgb2lrgb");o(QEe,"hclConvert");o(gv,"hcl");o(vu,"Hcl");o(Pq,"hcl2lab");Dh(vu,gv,M0(Lh,{brighter(t){return new vu(this.h,this.c,this.l+s5*(t??1),this.opacity)},darker(t){return new vu(this.h,this.c,this.l-s5*(t??1),this.opacity)},rgb(){return Pq(this).rgb()}}))});var B0=N(()=>{"use strict";j8();Bq()});function t_(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function r_(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,l=n{"use strict";o(t_,"basis");o(r_,"default")});function i_(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],l=t[(n+2)%e];return t_((r-n/e)*e,i,a,s,l)}}var Fq=N(()=>{"use strict";n_();o(i_,"default")});var F0,a_=N(()=>{"use strict";F0=o(t=>()=>t,"default")});function $q(t,e){return function(r){return t+r*e}}function ZEe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function zq(t,e){var r=e-t;return r?$q(t,r>180||r<-180?r-360*Math.round(r/360):r):F0(isNaN(t)?e:t)}function Gq(t){return(t=+t)==1?xu:function(e,r){return r-e?ZEe(e,r,t):F0(isNaN(e)?r:e)}}function xu(t,e){var r=e-t;return r?$q(t,r):F0(isNaN(t)?e:t)}var s_=N(()=>{"use strict";a_();o($q,"linear");o(ZEe,"exponential");o(zq,"hue");o(Gq,"gamma");o(xu,"nogamma")});function Vq(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,l;for(s=0;s{"use strict";B0();n_();Fq();s_();Ed=o((function t(e){var r=Gq(e);function n(i,a){var s=r((i=O0(i)).r,(a=O0(a)).r),l=r(i.g,a.g),u=r(i.b,a.b),h=xu(i.opacity,a.opacity);return function(f){return i.r=s(f),i.g=l(f),i.b=u(f),i.opacity=h(f),i+""}}return o(n,"rgb"),n.gamma=t,n}),"rgbGamma")(1);o(Vq,"rgbSpline");JEe=Vq(r_),eSe=Vq(i_)});function l_(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{"use strict";o(l_,"default");o(Uq,"isNumberArray")});function qq(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{"use strict";o5();o(qq,"genericArray")});function c_(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var Yq=N(()=>{"use strict";o(c_,"default")});function Wi(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var yv=N(()=>{"use strict";o(Wi,"default")});function u_(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=Rh(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var Xq=N(()=>{"use strict";o5();o(u_,"default")});function tSe(t){return function(){return t}}function rSe(t){return function(e){return t(e)+""}}function $0(t,e){var r=f_.lastIndex=h_.lastIndex=0,n,i,a,s=-1,l=[],u=[];for(t=t+"",e=e+"";(n=f_.exec(t))&&(i=h_.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),l[s]?l[s]+=a:l[++s]=a),(n=n[0])===(i=i[0])?l[s]?l[s]+=i:l[++s]=i:(l[++s]=null,u.push({i:s,x:Wi(n,i)})),r=h_.lastIndex;return r{"use strict";yv();f_=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,h_=new RegExp(f_.source,"g");o(tSe,"zero");o(rSe,"one");o($0,"default")});function Rh(t,e){var r=typeof e,n;return e==null||r==="boolean"?F0(e):(r==="number"?Wi:r==="string"?(n=xl(e))?(e=n,Ed):$0:e instanceof xl?Ed:e instanceof Date?c_:Uq(e)?l_:Array.isArray(e)?qq:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?u_:Wi)(t,e)}var o5=N(()=>{"use strict";B0();o_();Wq();Yq();yv();Xq();d_();a_();Hq();o(Rh,"default")});function l5(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var jq=N(()=>{"use strict";o(l5,"default")});function u5(t,e,r,n,i,a){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*r+e*n)&&(r-=t*u,n-=e*u),(l=Math.sqrt(r*r+n*n))&&(r/=l,n/=l,u/=l),t*n{"use strict";Kq=180/Math.PI,c5={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};o(u5,"default")});function Zq(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?c5:u5(e.a,e.b,e.c,e.d,e.e,e.f)}function Jq(t){return t==null?c5:(h5||(h5=document.createElementNS("http://www.w3.org/2000/svg","g")),h5.setAttribute("transform",t),(t=h5.transform.baseVal.consolidate())?(t=t.matrix,u5(t.a,t.b,t.c,t.d,t.e,t.f)):c5)}var h5,eW=N(()=>{"use strict";Qq();o(Zq,"parseCss");o(Jq,"parseSvg")});function tW(t,e,r,n){function i(h){return h.length?h.pop()+" ":""}o(i,"pop");function a(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push("translate(",null,e,null,r);g.push({i:y-4,x:Wi(h,d)},{i:y-2,x:Wi(f,p)})}else(d||p)&&m.push("translate("+d+e+p+r)}o(a,"translate");function s(h,f,d,p){h!==f?(h-f>180?f+=360:f-h>180&&(h+=360),p.push({i:d.push(i(d)+"rotate(",null,n)-2,x:Wi(h,f)})):f&&d.push(i(d)+"rotate("+f+n)}o(s,"rotate");function l(h,f,d,p){h!==f?p.push({i:d.push(i(d)+"skewX(",null,n)-2,x:Wi(h,f)}):f&&d.push(i(d)+"skewX("+f+n)}o(l,"skewX");function u(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push(i(m)+"scale(",null,",",null,")");g.push({i:y-4,x:Wi(h,d)},{i:y-2,x:Wi(f,p)})}else(d!==1||p!==1)&&m.push(i(m)+"scale("+d+","+p+")")}return o(u,"scale"),function(h,f){var d=[],p=[];return h=t(h),f=t(f),a(h.translateX,h.translateY,f.translateX,f.translateY,d,p),s(h.rotate,f.rotate,d,p),l(h.skewX,f.skewX,d,p),u(h.scaleX,h.scaleY,f.scaleX,f.scaleY,d,p),h=f=null,function(m){for(var g=-1,y=p.length,v;++g{"use strict";yv();eW();o(tW,"interpolateTransform");p_=tW(Zq,"px, ","px)","deg)"),m_=tW(Jq,", ",")",")")});function nW(t){return function(e,r){var n=t((e=gv(e)).h,(r=gv(r)).h),i=xu(e.c,r.c),a=xu(e.l,r.l),s=xu(e.opacity,r.opacity);return function(l){return e.h=n(l),e.c=i(l),e.l=a(l),e.opacity=s(l),e+""}}}var g_,nSe,iW=N(()=>{"use strict";B0();s_();o(nW,"hcl");g_=nW(zq),nSe=nW(xu)});var z0=N(()=>{"use strict";o5();yv();jq();d_();rW();o_();iW()});function kv(){return Sd||(oW(iSe),Sd=Tv.now()+p5)}function iSe(){Sd=0}function wv(){this._call=this._time=this._next=null}function m5(t,e,r){var n=new wv;return n.restart(t,e,r),n}function lW(){kv(),++G0;for(var t=f5,e;t;)(e=Sd-t._time)>=0&&t._call.call(void 0,e),t=t._next;--G0}function aW(){Sd=(d5=Tv.now())+p5,G0=xv=0;try{lW()}finally{G0=0,sSe(),Sd=0}}function aSe(){var t=Tv.now(),e=t-d5;e>sW&&(p5-=e,d5=t)}function sSe(){for(var t,e=f5,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:f5=r);bv=t,y_(n)}function y_(t){if(!G0){xv&&(xv=clearTimeout(xv));var e=t-Sd;e>24?(t<1/0&&(xv=setTimeout(aW,t-Tv.now()-p5)),vv&&(vv=clearInterval(vv))):(vv||(d5=Tv.now(),vv=setInterval(aSe,sW)),G0=1,oW(aW))}}var G0,xv,vv,sW,f5,bv,d5,Sd,p5,Tv,oW,v_=N(()=>{"use strict";G0=0,xv=0,vv=0,sW=1e3,d5=0,Sd=0,p5=0,Tv=typeof performance=="object"&&performance.now?performance:Date,oW=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};o(kv,"now");o(iSe,"clearNow");o(wv,"Timer");wv.prototype=m5.prototype={constructor:wv,restart:o(function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?kv():+r)+(e==null?0:+e),!this._next&&bv!==this&&(bv?bv._next=this:f5=this,bv=this),this._call=t,this._time=r,y_()},"restart"),stop:o(function(){this._call&&(this._call=null,this._time=1/0,y_())},"stop")};o(m5,"timer");o(lW,"timerFlush");o(aW,"wake");o(aSe,"poke");o(sSe,"nap");o(y_,"sleep")});function Ev(t,e,r){var n=new wv;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var cW=N(()=>{"use strict";v_();o(Ev,"default")});var g5=N(()=>{"use strict";v_();cW()});function bu(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;cSe(t,r,{name:e,index:n,group:i,on:oSe,tween:lSe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:fW})}function Cv(t,e){var r=Oi(t,e);if(r.state>fW)throw new Error("too late; already scheduled");return r}function la(t,e){var r=Oi(t,e);if(r.state>y5)throw new Error("too late; already running");return r}function Oi(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function cSe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=m5(a,0,r.time);function a(h){r.state=uW,r.timer.restart(s,r.delay,r.time),r.delay<=h&&s(h-r.delay)}o(a,"schedule");function s(h){var f,d,p,m;if(r.state!==uW)return u();for(f in n)if(m=n[f],m.name===r.name){if(m.state===y5)return Ev(s);m.state===hW?(m.state=Sv,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete n[f]):+f{"use strict";JA();g5();oSe=ZA("start","end","cancel","interrupt"),lSe=[],fW=0,uW=1,v5=2,y5=3,hW=4,x5=5,Sv=6;o(bu,"default");o(Cv,"init");o(la,"set");o(Oi,"get");o(cSe,"create")});function Av(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>v5&&n.state{"use strict";Ds();o(Av,"default")});function x_(t){return this.each(function(){Av(this,t)})}var pW=N(()=>{"use strict";dW();o(x_,"default")});function uSe(t,e){var r,n;return function(){var i=la(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,l=n.length;s{"use strict";Ds();o(uSe,"tweenRemove");o(hSe,"tweenFunction");o(b_,"default");o(V0,"tweenValue")});function Dv(t,e){var r;return(typeof e=="number"?Wi:e instanceof xl?Ed:(r=xl(e))?(e=r,Ed):$0)(t,e)}var T_=N(()=>{"use strict";B0();z0();o(Dv,"default")});function fSe(t){return function(){this.removeAttribute(t)}}function dSe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function pSe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function mSe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function gSe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttribute(t):(s=this.getAttribute(t),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function ySe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function w_(t,e){var r=sc(t),n=r==="transform"?m_:Dv;return this.attrTween(t,typeof e=="function"?(r.local?ySe:gSe)(r,n,V0(this,"attr."+t,e)):e==null?(r.local?dSe:fSe)(r):(r.local?mSe:pSe)(r,n,e))}var mW=N(()=>{"use strict";z0();yl();_v();T_();o(fSe,"attrRemove");o(dSe,"attrRemoveNS");o(pSe,"attrConstant");o(mSe,"attrConstantNS");o(gSe,"attrFunction");o(ySe,"attrFunctionNS");o(w_,"default")});function vSe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function xSe(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function bSe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&xSe(t,a)),r}return o(i,"tween"),i._value=e,i}function TSe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&vSe(t,a)),r}return o(i,"tween"),i._value=e,i}function k_(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=sc(t);return this.tween(r,(n.local?bSe:TSe)(n,e))}var gW=N(()=>{"use strict";yl();o(vSe,"attrInterpolate");o(xSe,"attrInterpolateNS");o(bSe,"attrTweenNS");o(TSe,"attrTween");o(k_,"default")});function wSe(t,e){return function(){Cv(this,t).delay=+e.apply(this,arguments)}}function kSe(t,e){return e=+e,function(){Cv(this,t).delay=e}}function E_(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?wSe:kSe)(e,t)):Oi(this.node(),e).delay}var yW=N(()=>{"use strict";Ds();o(wSe,"delayFunction");o(kSe,"delayConstant");o(E_,"default")});function ESe(t,e){return function(){la(this,t).duration=+e.apply(this,arguments)}}function SSe(t,e){return e=+e,function(){la(this,t).duration=e}}function S_(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?ESe:SSe)(e,t)):Oi(this.node(),e).duration}var vW=N(()=>{"use strict";Ds();o(ESe,"durationFunction");o(SSe,"durationConstant");o(S_,"default")});function CSe(t,e){if(typeof e!="function")throw new Error;return function(){la(this,t).ease=e}}function C_(t){var e=this._id;return arguments.length?this.each(CSe(e,t)):Oi(this.node(),e).ease}var xW=N(()=>{"use strict";Ds();o(CSe,"easeConstant");o(C_,"default")});function ASe(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;la(this,t).ease=r}}function A_(t){if(typeof t!="function")throw new Error;return this.each(ASe(this._id,t))}var bW=N(()=>{"use strict";Ds();o(ASe,"easeVarying");o(A_,"default")});function __(t){typeof t!="function"&&(t=N0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";yl();Cd();o(__,"default")});function D_(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),l=0;l{"use strict";Cd();o(D_,"default")});function _Se(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function DSe(t,e,r){var n,i,a=_Se(e)?Cv:la;return function(){var s=a(this,t),l=s.on;l!==n&&(i=(n=l).copy()).on(e,r),s.on=i}}function L_(t,e){var r=this._id;return arguments.length<2?Oi(this.node(),r).on.on(t):this.each(DSe(r,t,e))}var kW=N(()=>{"use strict";Ds();o(_Se,"start");o(DSe,"onFunction");o(L_,"default")});function LSe(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function R_(){return this.on("end.remove",LSe(this._id))}var EW=N(()=>{"use strict";o(LSe,"removeFunction");o(R_,"default")});function N_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Ah(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{"use strict";yl();Cd();Ds();o(N_,"default")});function M_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=R0(t));for(var n=this._groups,i=n.length,a=[],s=[],l=0;l{"use strict";yl();Cd();Ds();o(M_,"default")});function I_(){return new RSe(this._groups,this._parents)}var RSe,AW=N(()=>{"use strict";yl();RSe=yu.prototype.constructor;o(I_,"default")});function NSe(t,e){var r,n,i;return function(){var a=_h(this,t),s=(this.style.removeProperty(t),_h(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function _W(t){return function(){this.style.removeProperty(t)}}function MSe(t,e,r){var n,i=r+"",a;return function(){var s=_h(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function ISe(t,e,r){var n,i,a;return function(){var s=_h(this,t),l=r(this),u=l+"";return l==null&&(u=l=(this.style.removeProperty(t),_h(this,t))),s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l))}}function OSe(t,e){var r,n,i,a="style."+e,s="end."+a,l;return function(){var u=la(this,t),h=u.on,f=u.value[a]==null?l||(l=_W(e)):void 0;(h!==r||i!==f)&&(n=(r=h).copy()).on(s,i=f),u.on=n}}function O_(t,e,r){var n=(t+="")=="transform"?p_:Dv;return e==null?this.styleTween(t,NSe(t,n)).on("end.style."+t,_W(t)):typeof e=="function"?this.styleTween(t,ISe(t,n,V0(this,"style."+t,e))).each(OSe(this._id,t)):this.styleTween(t,MSe(t,n,e),r).on("end.style."+t,null)}var DW=N(()=>{"use strict";z0();yl();Ds();_v();T_();o(NSe,"styleNull");o(_W,"styleRemove");o(MSe,"styleConstant");o(ISe,"styleFunction");o(OSe,"styleMaybeRemove");o(O_,"default")});function PSe(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function BSe(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&PSe(t,s,r)),n}return o(a,"tween"),a._value=e,a}function P_(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,BSe(t,e,r??""))}var LW=N(()=>{"use strict";o(PSe,"styleInterpolate");o(BSe,"styleTween");o(P_,"default")});function FSe(t){return function(){this.textContent=t}}function $Se(t){return function(){var e=t(this);this.textContent=e??""}}function B_(t){return this.tween("text",typeof t=="function"?$Se(V0(this,"text",t)):FSe(t==null?"":t+""))}var RW=N(()=>{"use strict";_v();o(FSe,"textConstant");o($Se,"textFunction");o(B_,"default")});function zSe(t){return function(e){this.textContent=t.call(this,e)}}function GSe(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&zSe(i)),e}return o(n,"tween"),n._value=t,n}function F_(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,GSe(t))}var NW=N(()=>{"use strict";o(zSe,"textInterpolate");o(GSe,"textTween");o(F_,"default")});function $_(){for(var t=this._name,e=this._id,r=b5(),n=this._groups,i=n.length,a=0;a{"use strict";Cd();Ds();o($_,"default")});function z_(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var l={value:s},u={value:o(function(){--i===0&&a()},"value")};r.each(function(){var h=la(this,n),f=h.on;f!==t&&(e=(t=f).copy(),e._.cancel.push(l),e._.interrupt.push(l),e._.end.push(u)),h.on=e}),i===0&&a()})}var IW=N(()=>{"use strict";Ds();o(z_,"default")});function is(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function OW(t){return yu().transition(t)}function b5(){return++VSe}var VSe,Tu,Cd=N(()=>{"use strict";yl();mW();gW();yW();vW();xW();bW();TW();wW();kW();EW();SW();CW();AW();DW();LW();RW();NW();MW();_v();IW();VSe=0;o(is,"Transition");o(OW,"transition");o(b5,"newId");Tu=yu.prototype;is.prototype=OW.prototype={constructor:is,select:N_,selectAll:M_,selectChild:Tu.selectChild,selectChildren:Tu.selectChildren,filter:__,merge:D_,selection:I_,transition:$_,call:Tu.call,nodes:Tu.nodes,node:Tu.node,size:Tu.size,empty:Tu.empty,each:Tu.each,on:L_,attr:w_,attrTween:k_,style:O_,styleTween:P_,text:B_,textTween:F_,remove:R_,tween:b_,delay:E_,duration:S_,ease:C_,easeVarying:A_,end:z_,[Symbol.iterator]:Tu[Symbol.iterator]}});function T5(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var PW=N(()=>{"use strict";o(T5,"cubicInOut")});var G_=N(()=>{"use strict";PW()});function HSe(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function V_(t){var e,r;t instanceof is?(e=t._id,t=t._name):(e=b5(),(r=USe).time=kv(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{"use strict";Cd();Ds();G_();g5();USe={time:null,delay:0,duration:250,ease:T5};o(HSe,"inherit");o(V_,"default")});var FW=N(()=>{"use strict";yl();pW();BW();yu.prototype.interrupt=x_;yu.prototype.transition=V_});var w5=N(()=>{"use strict";FW()});var $W=N(()=>{"use strict"});var zW=N(()=>{"use strict"});var GW=N(()=>{"use strict"});function VW(t){return[+t[0],+t[1]]}function qSe(t){return[VW(t[0]),VW(t[1])]}function U_(t){return{type:t}}var c1t,u1t,h1t,f1t,d1t,p1t,UW=N(()=>{"use strict";w5();$W();zW();GW();({abs:c1t,max:u1t,min:h1t}=Math);o(VW,"number1");o(qSe,"number2");f1t={name:"x",handles:["w","e"].map(U_),input:o(function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},"input"),output:o(function(t){return t&&[t[0][0],t[1][0]]},"output")},d1t={name:"y",handles:["n","s"].map(U_),input:o(function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},"input"),output:o(function(t){return t&&[t[0][1],t[1][1]]},"output")},p1t={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(U_),input:o(function(t){return t==null?null:qSe(t)},"input"),output:o(function(t){return t},"output")};o(U_,"type")});var HW=N(()=>{"use strict";UW()});function qW(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return qW;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{"use strict";H_=Math.PI,q_=2*H_,Ad=1e-6,WSe=q_-Ad;o(qW,"append");o(YSe,"appendRound");_d=class{static{o(this,"Path")}constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?qW:YSe(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,l=this._y1,u=n-e,h=i-r,f=s-e,d=l-r,p=f*f+d*d;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>Ad)if(!(Math.abs(d*u-h*f)>Ad)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let m=n-s,g=i-l,y=u*u+h*h,v=m*m+g*g,x=Math.sqrt(y),b=Math.sqrt(p),T=a*Math.tan((H_-Math.acos((y+p-v)/(2*x*b)))/2),S=T/b,w=T/x;Math.abs(S-1)>Ad&&this._append`L${e+S*f},${r+S*d}`,this._append`A${a},${a},0,0,${+(d*m>f*g)},${this._x1=e+w*u},${this._y1=r+w*h}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),u=n*Math.sin(i),h=e+l,f=r+u,d=1^s,p=s?i-a:a-i;this._x1===null?this._append`M${h},${f}`:(Math.abs(this._x1-h)>Ad||Math.abs(this._y1-f)>Ad)&&this._append`L${h},${f}`,n&&(p<0&&(p=p%q_+q_),p>WSe?this._append`A${n},${n},0,1,${d},${e-l},${r-u}A${n},${n},0,1,${d},${this._x1=h},${this._y1=f}`:p>Ad&&this._append`A${n},${n},0,${+(p>=H_)},${d},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};o(WW,"path");WW.prototype=_d.prototype});var W_=N(()=>{"use strict";YW()});var XW=N(()=>{"use strict"});var jW=N(()=>{"use strict"});var KW=N(()=>{"use strict"});var QW=N(()=>{"use strict"});var ZW=N(()=>{"use strict"});var JW=N(()=>{"use strict"});var eY=N(()=>{"use strict"});function Y_(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function Dd(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var Lv=N(()=>{"use strict";o(Y_,"default");o(Dd,"formatDecimalParts")});function bl(t){return t=Dd(Math.abs(t)),t?t[1]:NaN}var Rv=N(()=>{"use strict";Lv();o(bl,"default")});function X_(t,e){return function(r,n){for(var i=r.length,a=[],s=0,l=t[0],u=0;i>0&&l>0&&(u+l+1>n&&(l=Math.max(1,n-u)),a.push(r.substring(i-=l,i+l)),!((u+=l+1)>n));)l=t[s=(s+1)%t.length];return a.reverse().join(e)}}var tY=N(()=>{"use strict";o(X_,"default")});function j_(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var rY=N(()=>{"use strict";o(j_,"default")});function Nh(t){if(!(e=XSe.exec(t)))throw new Error("invalid format: "+t);var e;return new k5({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function k5(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var XSe,K_=N(()=>{"use strict";XSe=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;o(Nh,"formatSpecifier");Nh.prototype=k5.prototype;o(k5,"FormatSpecifier");k5.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function Q_(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var nY=N(()=>{"use strict";o(Q_,"default")});function J_(t,e){var r=Dd(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(Z_=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+Dd(t,Math.max(0,e+a-1))[0]}var Z_,eD=N(()=>{"use strict";Lv();o(J_,"default")});function E5(t,e){var r=Dd(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var iY=N(()=>{"use strict";Lv();o(E5,"default")});var tD,aY=N(()=>{"use strict";Lv();eD();iY();tD={"%":o((t,e)=>(t*100).toFixed(e),"%"),b:o(t=>Math.round(t).toString(2),"b"),c:o(t=>t+"","c"),d:Y_,e:o((t,e)=>t.toExponential(e),"e"),f:o((t,e)=>t.toFixed(e),"f"),g:o((t,e)=>t.toPrecision(e),"g"),o:o(t=>Math.round(t).toString(8),"o"),p:o((t,e)=>E5(t*100,e),"p"),r:E5,s:J_,X:o(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:o(t=>Math.round(t).toString(16),"x")}});function S5(t){return t}var sY=N(()=>{"use strict";o(S5,"default")});function rD(t){var e=t.grouping===void 0||t.thousands===void 0?S5:X_(oY.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?S5:j_(oY.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",l=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function h(d){d=Nh(d);var p=d.fill,m=d.align,g=d.sign,y=d.symbol,v=d.zero,x=d.width,b=d.comma,T=d.precision,S=d.trim,w=d.type;w==="n"?(b=!0,w="g"):tD[w]||(T===void 0&&(T=12),S=!0,w="g"),(v||p==="0"&&m==="=")&&(v=!0,p="0",m="=");var k=y==="$"?r:y==="#"&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",A=y==="$"?n:/[%p]/.test(w)?s:"",C=tD[w],R=/[defgprs%]/.test(w);T=T===void 0?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,T)):Math.max(0,Math.min(20,T));function I(L){var E=k,D=A,_,O,M;if(w==="c")D=C(L)+D,L="";else{L=+L;var P=L<0||1/L<0;if(L=isNaN(L)?u:C(Math.abs(L),T),S&&(L=Q_(L)),P&&+L==0&&g!=="+"&&(P=!1),E=(P?g==="("?g:l:g==="-"||g==="("?"":g)+E,D=(w==="s"?lY[8+Z_/3]:"")+D+(P&&g==="("?")":""),R){for(_=-1,O=L.length;++_M||M>57){D=(M===46?i+L.slice(_+1):L.slice(_))+D,L=L.slice(0,_);break}}}b&&!v&&(L=e(L,1/0));var B=E.length+L.length+D.length,F=B>1)+E+L+D+F.slice(B);break;default:L=F+E+L+D;break}return a(L)}return o(I,"format"),I.toString=function(){return d+""},I}o(h,"newFormat");function f(d,p){var m=h((d=Nh(d),d.type="f",d)),g=Math.max(-8,Math.min(8,Math.floor(bl(p)/3)))*3,y=Math.pow(10,-g),v=lY[8+g/3];return function(x){return m(y*x)+v}}return o(f,"formatPrefix"),{format:h,formatPrefix:f}}var oY,lY,cY=N(()=>{"use strict";Rv();tY();rY();K_();nY();aY();eD();sY();oY=Array.prototype.map,lY=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];o(rD,"default")});function nD(t){return C5=rD(t),cc=C5.format,A5=C5.formatPrefix,C5}var C5,cc,A5,uY=N(()=>{"use strict";cY();nD({thousands:",",grouping:[3],currency:["$",""]});o(nD,"defaultLocale")});function _5(t){return Math.max(0,-bl(Math.abs(t)))}var hY=N(()=>{"use strict";Rv();o(_5,"default")});function D5(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(bl(e)/3)))*3-bl(Math.abs(t)))}var fY=N(()=>{"use strict";Rv();o(D5,"default")});function L5(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,bl(e)-bl(t))+1}var dY=N(()=>{"use strict";Rv();o(L5,"default")});var iD=N(()=>{"use strict";uY();K_();hY();fY();dY()});var pY=N(()=>{"use strict"});function jSe(t){var e=0,r=t.children,n=r&&r.length;if(!n)e=1;else for(;--n>=0;)e+=r[n].value;t.value=e}function aD(){return this.eachAfter(jSe)}var mY=N(()=>{"use strict";o(jSe,"count");o(aD,"default")});function sD(t,e){let r=-1;for(let n of this)t.call(e,n,++r,this);return this}var gY=N(()=>{"use strict";o(sD,"default")});function oD(t,e){for(var r=this,n=[r],i,a,s=-1;r=n.pop();)if(t.call(e,r,++s,this),i=r.children)for(a=i.length-1;a>=0;--a)n.push(i[a]);return this}var yY=N(()=>{"use strict";o(oD,"default")});function lD(t,e){for(var r=this,n=[r],i=[],a,s,l,u=-1;r=n.pop();)if(i.push(r),a=r.children)for(s=0,l=a.length;s{"use strict";o(lD,"default")});function cD(t,e){let r=-1;for(let n of this)if(t.call(e,n,++r,this))return n}var xY=N(()=>{"use strict";o(cD,"default")});function uD(t){return this.eachAfter(function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r})}var bY=N(()=>{"use strict";o(uD,"default")});function hD(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}var TY=N(()=>{"use strict";o(hD,"default")});function fD(t){for(var e=this,r=KSe(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n}function KSe(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}var wY=N(()=>{"use strict";o(fD,"default");o(KSe,"leastCommonAncestor")});function dD(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}var kY=N(()=>{"use strict";o(dD,"default")});function pD(){return Array.from(this)}var EY=N(()=>{"use strict";o(pD,"default")});function mD(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}var SY=N(()=>{"use strict";o(mD,"default")});function gD(){var t=this,e=[];return t.each(function(r){r!==t&&e.push({source:r.parent,target:r})}),e}var CY=N(()=>{"use strict";o(gD,"default")});function*yD(){var t=this,e,r=[t],n,i,a;do for(e=r.reverse(),r=[];t=e.pop();)if(yield t,n=t.children)for(i=0,a=n.length;i{"use strict";o(yD,"default")});function U0(t,e){t instanceof Map?(t=[void 0,t],e===void 0&&(e=JSe)):e===void 0&&(e=ZSe);for(var r=new Nv(t),n,i=[r],a,s,l,u;n=i.pop();)if((s=e(n.data))&&(u=(s=Array.from(s)).length))for(n.children=s,l=u-1;l>=0;--l)i.push(a=s[l]=new Nv(s[l])),a.parent=n,a.depth=n.depth+1;return r.eachBefore(t6e)}function QSe(){return U0(this).eachBefore(e6e)}function ZSe(t){return t.children}function JSe(t){return Array.isArray(t)?t[1]:null}function e6e(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}function t6e(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}function Nv(t){this.data=t,this.depth=this.height=0,this.parent=null}var _Y=N(()=>{"use strict";mY();gY();yY();vY();xY();bY();TY();wY();kY();EY();SY();CY();AY();o(U0,"hierarchy");o(QSe,"node_copy");o(ZSe,"objectChildren");o(JSe,"mapChildren");o(e6e,"copyData");o(t6e,"computeHeight");o(Nv,"Node");Nv.prototype=U0.prototype={constructor:Nv,count:aD,each:sD,eachAfter:lD,eachBefore:oD,find:cD,sum:uD,sort:hD,path:fD,ancestors:dD,descendants:pD,leaves:mD,links:gD,copy:QSe,[Symbol.iterator]:yD}});function DY(t){if(typeof t!="function")throw new Error;return t}var LY=N(()=>{"use strict";o(DY,"required")});function H0(){return 0}function Ld(t){return function(){return t}}var RY=N(()=>{"use strict";o(H0,"constantZero");o(Ld,"default")});function vD(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}var NY=N(()=>{"use strict";o(vD,"default")});function xD(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(n-e)/t.value;++l{"use strict";o(xD,"default")});function bD(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(i-r)/t.value;++l{"use strict";o(bD,"default")});function n6e(t,e,r,n,i,a){for(var s=[],l=e.children,u,h,f=0,d=0,p=l.length,m,g,y=e.value,v,x,b,T,S,w,k;fb&&(b=h),k=v*v*w,T=Math.max(b/k,k/x),T>S){v-=h;break}S=T}s.push(u={value:v,dice:m{"use strict";MY();IY();r6e=(1+Math.sqrt(5))/2;o(n6e,"squarifyRatio");OY=o((function t(e){function r(n,i,a,s,l){n6e(e,n,i,a,s,l)}return o(r,"squarify"),r.ratio=function(n){return t((n=+n)>1?n:1)},r}),"custom")(r6e)});function R5(){var t=OY,e=!1,r=1,n=1,i=[0],a=H0,s=H0,l=H0,u=H0,h=H0;function f(p){return p.x0=p.y0=0,p.x1=r,p.y1=n,p.eachBefore(d),i=[0],e&&p.eachBefore(vD),p}o(f,"treemap");function d(p){var m=i[p.depth],g=p.x0+m,y=p.y0+m,v=p.x1-m,x=p.y1-m;v{"use strict";NY();PY();LY();RY();o(R5,"default")});var FY=N(()=>{"use strict";_Y();BY()});var $Y=N(()=>{"use strict"});var zY=N(()=>{"use strict"});function Mh(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var Mv=N(()=>{"use strict";o(Mh,"initRange")});function no(){var t=new D0,e=[],r=[],n=TD;function i(a){let s=t.get(a);if(s===void 0){if(n!==TD)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return o(i,"scale"),i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new D0;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return no(e,r).unknown(n)},Mh.apply(i,arguments),i}var TD,wD=N(()=>{"use strict";Ch();Mv();TD=Symbol("implicit");o(no,"ordinal")});function q0(){var t=no().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,l=!1,u=0,h=0,f=.5;delete t.unknown;function d(){var p=e().length,m=i{"use strict";Ch();Mv();wD();o(q0,"band")});function kD(t){return function(){return t}}var VY=N(()=>{"use strict";o(kD,"constants")});function ED(t){return+t}var UY=N(()=>{"use strict";o(ED,"number")});function W0(t){return t}function SD(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:kD(isNaN(e)?NaN:.5)}function i6e(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function a6e(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?s6e:a6e,u=h=null,d}o(f,"rescale");function d(p){return p==null||isNaN(p=+p)?a:(u||(u=l(t.map(n),e,r)))(n(s(p)))}return o(d,"scale"),d.invert=function(p){return s(i((h||(h=l(e,t.map(n),Wi)))(p)))},d.domain=function(p){return arguments.length?(t=Array.from(p,ED),f()):t.slice()},d.range=function(p){return arguments.length?(e=Array.from(p),f()):e.slice()},d.rangeRound=function(p){return e=Array.from(p),r=l5,f()},d.clamp=function(p){return arguments.length?(s=p?!0:W0,f()):s!==W0},d.interpolate=function(p){return arguments.length?(r=p,f()):r},d.unknown=function(p){return arguments.length?(a=p,d):a},function(p,m){return n=p,i=m,f()}}function Iv(){return o6e()(W0,W0)}var HY,CD=N(()=>{"use strict";Ch();z0();VY();UY();HY=[0,1];o(W0,"identity");o(SD,"normalize");o(i6e,"clamper");o(a6e,"bimap");o(s6e,"polymap");o(N5,"copy");o(o6e,"transformer");o(Iv,"continuous")});function AD(t,e,r,n){var i=L0(t,e,r),a;switch(n=Nh(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=D5(i,s))&&(n.precision=a),A5(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=L5(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=_5(i))&&(n.precision=a-(n.type==="%")*2);break}}return cc(n)}var qY=N(()=>{"use strict";Ch();iD();o(AD,"tickFormat")});function l6e(t){var e=t.domain;return t.ticks=function(r){var n=e();return q3(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return AD(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],l=n[a],u,h,f=10;for(l0;){if(h=lv(s,l,r),h===u)return n[i]=s,n[a]=l,e(n);if(h>0)s=Math.floor(s/h)*h,l=Math.ceil(l/h)*h;else if(h<0)s=Math.ceil(s*h)/h,l=Math.floor(l*h)/h;else break;u=h}return t},t}function Tl(){var t=Iv();return t.copy=function(){return N5(t,Tl())},Mh.apply(t,arguments),l6e(t)}var WY=N(()=>{"use strict";Ch();CD();Mv();qY();o(l6e,"linearish");o(Tl,"linear")});function _D(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{"use strict";o(_D,"nice")});function En(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return o(i,"interval"),i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),l=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,l)=>{let u=[];if(a=i.ceil(a),l=l==null?1:Math.floor(l),!(a0))return u;let h;do u.push(h=new Date(+a)),e(a,l),t(a);while(hEn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,l)=>{if(s>=s)if(l<0)for(;++l<=0;)for(;e(s,-1),!a(s););else for(;--l>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(DD.setTime(+a),LD.setTime(+s),t(DD),t(LD),Math.floor(r(DD,LD))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var DD,LD,wu=N(()=>{"use strict";DD=new Date,LD=new Date;o(En,"timeInterval")});var uc,XY,RD=N(()=>{"use strict";wu();uc=En(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);uc.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?En(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):uc);XY=uc.range});var io,jY,ND=N(()=>{"use strict";wu();io=En(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),jY=io.range});var ku,c6e,M5,u6e,MD=N(()=>{"use strict";wu();ku=En(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),c6e=ku.range,M5=En(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),u6e=M5.range});var Eu,h6e,I5,f6e,ID=N(()=>{"use strict";wu();Eu=En(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),h6e=Eu.range,I5=En(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),f6e=I5.range});var Ro,d6e,Pv,p6e,O5,m6e,OD=N(()=>{"use strict";wu();Ro=En(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),d6e=Ro.range,Pv=En(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),p6e=Pv.range,O5=En(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),m6e=O5.range});function Md(t){return En(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function Id(t){return En(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var wl,Ih,P5,B5,fc,F5,$5,QY,g6e,y6e,v6e,x6e,b6e,T6e,Od,Y0,ZY,JY,Oh,eX,tX,rX,w6e,k6e,E6e,S6e,C6e,A6e,PD=N(()=>{"use strict";wu();o(Md,"timeWeekday");wl=Md(0),Ih=Md(1),P5=Md(2),B5=Md(3),fc=Md(4),F5=Md(5),$5=Md(6),QY=wl.range,g6e=Ih.range,y6e=P5.range,v6e=B5.range,x6e=fc.range,b6e=F5.range,T6e=$5.range;o(Id,"utcWeekday");Od=Id(0),Y0=Id(1),ZY=Id(2),JY=Id(3),Oh=Id(4),eX=Id(5),tX=Id(6),rX=Od.range,w6e=Y0.range,k6e=ZY.range,E6e=JY.range,S6e=Oh.range,C6e=eX.range,A6e=tX.range});var Su,_6e,z5,D6e,BD=N(()=>{"use strict";wu();Su=En(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),_6e=Su.range,z5=En(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),D6e=z5.range});var ao,L6e,kl,R6e,FD=N(()=>{"use strict";wu();ao=En(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());ao.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:En(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});L6e=ao.range,kl=En(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());kl.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:En(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});R6e=kl.range});function iX(t,e,r,n,i,a){let s=[[io,1,1e3],[io,5,5*1e3],[io,15,15*1e3],[io,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function l(h,f,d){let p=fv).right(s,p);if(m===s.length)return t.every(L0(h/31536e6,f/31536e6,d));if(m===0)return uc.every(Math.max(L0(h,f,d),1));let[g,y]=s[p/s[m-1][2]{"use strict";Ch();RD();ND();MD();ID();OD();PD();BD();FD();o(iX,"ticker");[M6e,I6e]=iX(kl,z5,Od,O5,I5,M5),[$D,zD]=iX(ao,Su,wl,Ro,Eu,ku)});var G5=N(()=>{"use strict";RD();ND();MD();ID();OD();PD();BD();FD();aX()});function GD(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function VD(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Bv(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function UD(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,l=t.months,u=t.shortMonths,h=Fv(i),f=$v(i),d=Fv(a),p=$v(a),m=Fv(s),g=$v(s),y=Fv(l),v=$v(l),x=Fv(u),b=$v(u),T={a:P,A:B,b:F,B:G,c:null,d:hX,e:hX,f:nCe,g:dCe,G:mCe,H:eCe,I:tCe,j:rCe,L:gX,m:iCe,M:aCe,p:$,q:U,Q:pX,s:mX,S:sCe,u:oCe,U:lCe,V:cCe,w:uCe,W:hCe,x:null,X:null,y:fCe,Y:pCe,Z:gCe,"%":dX},S={a:j,A:te,b:Y,B:oe,c:null,d:fX,e:fX,f:bCe,g:LCe,G:NCe,H:yCe,I:vCe,j:xCe,L:vX,m:TCe,M:wCe,p:J,q:ue,Q:pX,s:mX,S:kCe,u:ECe,U:SCe,V:CCe,w:ACe,W:_Ce,x:null,X:null,y:DCe,Y:RCe,Z:MCe,"%":dX},w={a:I,A:L,b:E,B:D,c:_,d:cX,e:cX,f:K6e,g:lX,G:oX,H:uX,I:uX,j:W6e,L:j6e,m:q6e,M:Y6e,p:R,q:H6e,Q:Z6e,s:J6e,S:X6e,u:$6e,U:z6e,V:G6e,w:F6e,W:V6e,x:O,X:M,y:lX,Y:oX,Z:U6e,"%":Q6e};T.x=k(r,T),T.X=k(n,T),T.c=k(e,T),S.x=k(r,S),S.X=k(n,S),S.c=k(e,S);function k(re,ee){return function(Z){var K=[],ae=-1,Q=0,de=re.length,ne,Te,q;for(Z instanceof Date||(Z=new Date(+Z));++ae53)return null;"w"in K||(K.w=1),"Z"in K?(Q=VD(Bv(K.y,0,1)),de=Q.getUTCDay(),Q=de>4||de===0?Y0.ceil(Q):Y0(Q),Q=Pv.offset(Q,(K.V-1)*7),K.y=Q.getUTCFullYear(),K.m=Q.getUTCMonth(),K.d=Q.getUTCDate()+(K.w+6)%7):(Q=GD(Bv(K.y,0,1)),de=Q.getDay(),Q=de>4||de===0?Ih.ceil(Q):Ih(Q),Q=Ro.offset(Q,(K.V-1)*7),K.y=Q.getFullYear(),K.m=Q.getMonth(),K.d=Q.getDate()+(K.w+6)%7)}else("W"in K||"U"in K)&&("w"in K||(K.w="u"in K?K.u%7:"W"in K?1:0),de="Z"in K?VD(Bv(K.y,0,1)).getUTCDay():GD(Bv(K.y,0,1)).getDay(),K.m=0,K.d="W"in K?(K.w+6)%7+K.W*7-(de+5)%7:K.w+K.U*7-(de+6)%7);return"Z"in K?(K.H+=K.Z/100|0,K.M+=K.Z%100,VD(K)):GD(K)}}o(A,"newParse");function C(re,ee,Z,K){for(var ae=0,Q=ee.length,de=Z.length,ne,Te;ae=de)return-1;if(ne=ee.charCodeAt(ae++),ne===37){if(ne=ee.charAt(ae++),Te=w[ne in sX?ee.charAt(ae++):ne],!Te||(K=Te(re,Z,K))<0)return-1}else if(ne!=Z.charCodeAt(K++))return-1}return K}o(C,"parseSpecifier");function R(re,ee,Z){var K=h.exec(ee.slice(Z));return K?(re.p=f.get(K[0].toLowerCase()),Z+K[0].length):-1}o(R,"parsePeriod");function I(re,ee,Z){var K=m.exec(ee.slice(Z));return K?(re.w=g.get(K[0].toLowerCase()),Z+K[0].length):-1}o(I,"parseShortWeekday");function L(re,ee,Z){var K=d.exec(ee.slice(Z));return K?(re.w=p.get(K[0].toLowerCase()),Z+K[0].length):-1}o(L,"parseWeekday");function E(re,ee,Z){var K=x.exec(ee.slice(Z));return K?(re.m=b.get(K[0].toLowerCase()),Z+K[0].length):-1}o(E,"parseShortMonth");function D(re,ee,Z){var K=y.exec(ee.slice(Z));return K?(re.m=v.get(K[0].toLowerCase()),Z+K[0].length):-1}o(D,"parseMonth");function _(re,ee,Z){return C(re,e,ee,Z)}o(_,"parseLocaleDateTime");function O(re,ee,Z){return C(re,r,ee,Z)}o(O,"parseLocaleDate");function M(re,ee,Z){return C(re,n,ee,Z)}o(M,"parseLocaleTime");function P(re){return s[re.getDay()]}o(P,"formatShortWeekday");function B(re){return a[re.getDay()]}o(B,"formatWeekday");function F(re){return u[re.getMonth()]}o(F,"formatShortMonth");function G(re){return l[re.getMonth()]}o(G,"formatMonth");function $(re){return i[+(re.getHours()>=12)]}o($,"formatPeriod");function U(re){return 1+~~(re.getMonth()/3)}o(U,"formatQuarter");function j(re){return s[re.getUTCDay()]}o(j,"formatUTCShortWeekday");function te(re){return a[re.getUTCDay()]}o(te,"formatUTCWeekday");function Y(re){return u[re.getUTCMonth()]}o(Y,"formatUTCShortMonth");function oe(re){return l[re.getUTCMonth()]}o(oe,"formatUTCMonth");function J(re){return i[+(re.getUTCHours()>=12)]}o(J,"formatUTCPeriod");function ue(re){return 1+~~(re.getUTCMonth()/3)}return o(ue,"formatUTCQuarter"),{format:o(function(re){var ee=k(re+="",T);return ee.toString=function(){return re},ee},"format"),parse:o(function(re){var ee=A(re+="",!1);return ee.toString=function(){return re},ee},"parse"),utcFormat:o(function(re){var ee=k(re+="",S);return ee.toString=function(){return re},ee},"utcFormat"),utcParse:o(function(re){var ee=A(re+="",!0);return ee.toString=function(){return re},ee},"utcParse")}}function Kr(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function F6e(t,e,r){var n=Yi.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function $6e(t,e,r){var n=Yi.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function z6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function G6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function V6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function oX(t,e,r){var n=Yi.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function lX(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function U6e(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function H6e(t,e,r){var n=Yi.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function q6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function cX(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function W6e(t,e,r){var n=Yi.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function uX(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function Y6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function X6e(t,e,r){var n=Yi.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function j6e(t,e,r){var n=Yi.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function K6e(t,e,r){var n=Yi.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function Q6e(t,e,r){var n=O6e.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function Z6e(t,e,r){var n=Yi.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function J6e(t,e,r){var n=Yi.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function hX(t,e){return Kr(t.getDate(),e,2)}function eCe(t,e){return Kr(t.getHours(),e,2)}function tCe(t,e){return Kr(t.getHours()%12||12,e,2)}function rCe(t,e){return Kr(1+Ro.count(ao(t),t),e,3)}function gX(t,e){return Kr(t.getMilliseconds(),e,3)}function nCe(t,e){return gX(t,e)+"000"}function iCe(t,e){return Kr(t.getMonth()+1,e,2)}function aCe(t,e){return Kr(t.getMinutes(),e,2)}function sCe(t,e){return Kr(t.getSeconds(),e,2)}function oCe(t){var e=t.getDay();return e===0?7:e}function lCe(t,e){return Kr(wl.count(ao(t)-1,t),e,2)}function yX(t){var e=t.getDay();return e>=4||e===0?fc(t):fc.ceil(t)}function cCe(t,e){return t=yX(t),Kr(fc.count(ao(t),t)+(ao(t).getDay()===4),e,2)}function uCe(t){return t.getDay()}function hCe(t,e){return Kr(Ih.count(ao(t)-1,t),e,2)}function fCe(t,e){return Kr(t.getFullYear()%100,e,2)}function dCe(t,e){return t=yX(t),Kr(t.getFullYear()%100,e,2)}function pCe(t,e){return Kr(t.getFullYear()%1e4,e,4)}function mCe(t,e){var r=t.getDay();return t=r>=4||r===0?fc(t):fc.ceil(t),Kr(t.getFullYear()%1e4,e,4)}function gCe(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Kr(e/60|0,"0",2)+Kr(e%60,"0",2)}function fX(t,e){return Kr(t.getUTCDate(),e,2)}function yCe(t,e){return Kr(t.getUTCHours(),e,2)}function vCe(t,e){return Kr(t.getUTCHours()%12||12,e,2)}function xCe(t,e){return Kr(1+Pv.count(kl(t),t),e,3)}function vX(t,e){return Kr(t.getUTCMilliseconds(),e,3)}function bCe(t,e){return vX(t,e)+"000"}function TCe(t,e){return Kr(t.getUTCMonth()+1,e,2)}function wCe(t,e){return Kr(t.getUTCMinutes(),e,2)}function kCe(t,e){return Kr(t.getUTCSeconds(),e,2)}function ECe(t){var e=t.getUTCDay();return e===0?7:e}function SCe(t,e){return Kr(Od.count(kl(t)-1,t),e,2)}function xX(t){var e=t.getUTCDay();return e>=4||e===0?Oh(t):Oh.ceil(t)}function CCe(t,e){return t=xX(t),Kr(Oh.count(kl(t),t)+(kl(t).getUTCDay()===4),e,2)}function ACe(t){return t.getUTCDay()}function _Ce(t,e){return Kr(Y0.count(kl(t)-1,t),e,2)}function DCe(t,e){return Kr(t.getUTCFullYear()%100,e,2)}function LCe(t,e){return t=xX(t),Kr(t.getUTCFullYear()%100,e,2)}function RCe(t,e){return Kr(t.getUTCFullYear()%1e4,e,4)}function NCe(t,e){var r=t.getUTCDay();return t=r>=4||r===0?Oh(t):Oh.ceil(t),Kr(t.getUTCFullYear()%1e4,e,4)}function MCe(){return"+0000"}function dX(){return"%"}function pX(t){return+t}function mX(t){return Math.floor(+t/1e3)}var sX,Yi,O6e,P6e,bX=N(()=>{"use strict";G5();o(GD,"localDate");o(VD,"utcDate");o(Bv,"newDate");o(UD,"formatLocale");sX={"-":"",_:" ",0:"0"},Yi=/^\s*\d+/,O6e=/^%/,P6e=/[\\^$*+?|[\]().{}]/g;o(Kr,"pad");o(B6e,"requote");o(Fv,"formatRe");o($v,"formatLookup");o(F6e,"parseWeekdayNumberSunday");o($6e,"parseWeekdayNumberMonday");o(z6e,"parseWeekNumberSunday");o(G6e,"parseWeekNumberISO");o(V6e,"parseWeekNumberMonday");o(oX,"parseFullYear");o(lX,"parseYear");o(U6e,"parseZone");o(H6e,"parseQuarter");o(q6e,"parseMonthNumber");o(cX,"parseDayOfMonth");o(W6e,"parseDayOfYear");o(uX,"parseHour24");o(Y6e,"parseMinutes");o(X6e,"parseSeconds");o(j6e,"parseMilliseconds");o(K6e,"parseMicroseconds");o(Q6e,"parseLiteralPercent");o(Z6e,"parseUnixTimestamp");o(J6e,"parseUnixTimestampSeconds");o(hX,"formatDayOfMonth");o(eCe,"formatHour24");o(tCe,"formatHour12");o(rCe,"formatDayOfYear");o(gX,"formatMilliseconds");o(nCe,"formatMicroseconds");o(iCe,"formatMonthNumber");o(aCe,"formatMinutes");o(sCe,"formatSeconds");o(oCe,"formatWeekdayNumberMonday");o(lCe,"formatWeekNumberSunday");o(yX,"dISO");o(cCe,"formatWeekNumberISO");o(uCe,"formatWeekdayNumberSunday");o(hCe,"formatWeekNumberMonday");o(fCe,"formatYear");o(dCe,"formatYearISO");o(pCe,"formatFullYear");o(mCe,"formatFullYearISO");o(gCe,"formatZone");o(fX,"formatUTCDayOfMonth");o(yCe,"formatUTCHour24");o(vCe,"formatUTCHour12");o(xCe,"formatUTCDayOfYear");o(vX,"formatUTCMilliseconds");o(bCe,"formatUTCMicroseconds");o(TCe,"formatUTCMonthNumber");o(wCe,"formatUTCMinutes");o(kCe,"formatUTCSeconds");o(ECe,"formatUTCWeekdayNumberMonday");o(SCe,"formatUTCWeekNumberSunday");o(xX,"UTCdISO");o(CCe,"formatUTCWeekNumberISO");o(ACe,"formatUTCWeekdayNumberSunday");o(_Ce,"formatUTCWeekNumberMonday");o(DCe,"formatUTCYear");o(LCe,"formatUTCYearISO");o(RCe,"formatUTCFullYear");o(NCe,"formatUTCFullYearISO");o(MCe,"formatUTCZone");o(dX,"formatLiteralPercent");o(pX,"formatUnixTimestamp");o(mX,"formatUnixTimestampSeconds")});function HD(t){return X0=UD(t),Pd=X0.format,TX=X0.parse,wX=X0.utcFormat,kX=X0.utcParse,X0}var X0,Pd,TX,wX,kX,EX=N(()=>{"use strict";bX();HD({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});o(HD,"defaultLocale")});var qD=N(()=>{"use strict";EX()});function ICe(t){return new Date(t)}function OCe(t){return t instanceof Date?+t:+new Date(+t)}function SX(t,e,r,n,i,a,s,l,u,h){var f=Iv(),d=f.invert,p=f.domain,m=h(".%L"),g=h(":%S"),y=h("%I:%M"),v=h("%I %p"),x=h("%a %d"),b=h("%b %d"),T=h("%B"),S=h("%Y");function w(k){return(u(k){"use strict";G5();qD();CD();Mv();YY();o(ICe,"date");o(OCe,"number");o(SX,"calendar");o(V5,"time")});var AX=N(()=>{"use strict";GY();WY();wD();CX()});function WD(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{"use strict";o(WD,"default")});var YD,DX=N(()=>{"use strict";_X();YD=WD("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var LX=N(()=>{"use strict";DX()});function zn(t){return o(function(){return t},"constant")}var U5=N(()=>{"use strict";o(zn,"default")});function NX(t){return t>1?0:t<-1?j0:Math.acos(t)}function jD(t){return t>=1?zv:t<=-1?-zv:Math.asin(t)}var XD,ca,Ph,RX,H5,El,Bd,Xi,j0,zv,K0,q5=N(()=>{"use strict";XD=Math.abs,ca=Math.atan2,Ph=Math.cos,RX=Math.max,H5=Math.min,El=Math.sin,Bd=Math.sqrt,Xi=1e-12,j0=Math.PI,zv=j0/2,K0=2*j0;o(NX,"acos");o(jD,"asin")});function W5(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new _d(e)}var KD=N(()=>{"use strict";W_();o(W5,"withPath")});function PCe(t){return t.innerRadius}function BCe(t){return t.outerRadius}function FCe(t){return t.startAngle}function $Ce(t){return t.endAngle}function zCe(t){return t&&t.padAngle}function GCe(t,e,r,n,i,a,s,l){var u=r-t,h=n-e,f=s-i,d=l-a,p=d*u-f*h;if(!(p*p_*_+O*O&&(C=I,R=L),{cx:C,cy:R,x01:-f,y01:-d,x11:C*(i/w-1),y11:R*(i/w-1)}}function Sl(){var t=PCe,e=BCe,r=zn(0),n=null,i=FCe,a=$Ce,s=zCe,l=null,u=W5(h);function h(){var f,d,p=+t.apply(this,arguments),m=+e.apply(this,arguments),g=i.apply(this,arguments)-zv,y=a.apply(this,arguments)-zv,v=XD(y-g),x=y>g;if(l||(l=f=u()),mXi))l.moveTo(0,0);else if(v>K0-Xi)l.moveTo(m*Ph(g),m*El(g)),l.arc(0,0,m,g,y,!x),p>Xi&&(l.moveTo(p*Ph(y),p*El(y)),l.arc(0,0,p,y,g,x));else{var b=g,T=y,S=g,w=y,k=v,A=v,C=s.apply(this,arguments)/2,R=C>Xi&&(n?+n.apply(this,arguments):Bd(p*p+m*m)),I=H5(XD(m-p)/2,+r.apply(this,arguments)),L=I,E=I,D,_;if(R>Xi){var O=jD(R/p*El(C)),M=jD(R/m*El(C));(k-=O*2)>Xi?(O*=x?1:-1,S+=O,w-=O):(k=0,S=w=(g+y)/2),(A-=M*2)>Xi?(M*=x?1:-1,b+=M,T-=M):(A=0,b=T=(g+y)/2)}var P=m*Ph(b),B=m*El(b),F=p*Ph(w),G=p*El(w);if(I>Xi){var $=m*Ph(T),U=m*El(T),j=p*Ph(S),te=p*El(S),Y;if(vXi?E>Xi?(D=Y5(j,te,P,B,m,E,x),_=Y5($,U,F,G,m,E,x),l.moveTo(D.cx+D.x01,D.cy+D.y01),EXi)||!(k>Xi)?l.lineTo(F,G):L>Xi?(D=Y5(F,G,$,U,p,-L,x),_=Y5(P,B,j,te,p,-L,x),l.lineTo(D.cx+D.x01,D.cy+D.y01),L{"use strict";U5();q5();KD();o(PCe,"arcInnerRadius");o(BCe,"arcOuterRadius");o(FCe,"arcStartAngle");o($Ce,"arcEndAngle");o(zCe,"arcPadAngle");o(GCe,"intersect");o(Y5,"cornerTangents");o(Sl,"default")});function Gv(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var Zxt,QD=N(()=>{"use strict";Zxt=Array.prototype.slice;o(Gv,"default")});function IX(t){this._context=t}function Cu(t){return new IX(t)}var ZD=N(()=>{"use strict";o(IX,"Linear");IX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}},"point")};o(Cu,"default")});function OX(t){return t[0]}function PX(t){return t[1]}var BX=N(()=>{"use strict";o(OX,"x");o(PX,"y")});function Cl(t,e){var r=zn(!0),n=null,i=Cu,a=null,s=W5(l);t=typeof t=="function"?t:t===void 0?OX:zn(t),e=typeof e=="function"?e:e===void 0?PX:zn(e);function l(u){var h,f=(u=Gv(u)).length,d,p=!1,m;for(n==null&&(a=i(m=s())),h=0;h<=f;++h)!(h{"use strict";QD();U5();ZD();KD();BX();o(Cl,"default")});function JD(t,e){return et?1:e>=t?0:NaN}var $X=N(()=>{"use strict";o(JD,"default")});function eL(t){return t}var zX=N(()=>{"use strict";o(eL,"default")});function X5(){var t=eL,e=JD,r=null,n=zn(0),i=zn(K0),a=zn(0);function s(l){var u,h=(l=Gv(l)).length,f,d,p=0,m=new Array(h),g=new Array(h),y=+n.apply(this,arguments),v=Math.min(K0,Math.max(-K0,i.apply(this,arguments)-y)),x,b=Math.min(Math.abs(v)/h,a.apply(this,arguments)),T=b*(v<0?-1:1),S;for(u=0;u0&&(p+=S);for(e!=null?m.sort(function(w,k){return e(g[w],g[k])}):r!=null&&m.sort(function(w,k){return r(l[w],l[k])}),u=0,d=p?(v-h*T)/p:0;u0?S*d:0)+T,g[f]={data:l[f],index:u,value:S,startAngle:y,endAngle:x,padAngle:b};return g}return o(s,"pie"),s.value=function(l){return arguments.length?(t=typeof l=="function"?l:zn(+l),s):t},s.sortValues=function(l){return arguments.length?(e=l,r=null,s):e},s.sort=function(l){return arguments.length?(r=l,e=null,s):r},s.startAngle=function(l){return arguments.length?(n=typeof l=="function"?l:zn(+l),s):n},s.endAngle=function(l){return arguments.length?(i=typeof l=="function"?l:zn(+l),s):i},s.padAngle=function(l){return arguments.length?(a=typeof l=="function"?l:zn(+l),s):a},s}var GX=N(()=>{"use strict";QD();U5();$X();zX();q5();o(X5,"default")});function Vv(t){return new j5(t,!0)}function Uv(t){return new j5(t,!1)}var j5,VX=N(()=>{"use strict";j5=class{static{o(this,"Bump")}constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}};o(Vv,"bumpX");o(Uv,"bumpY")});function so(){}var Hv=N(()=>{"use strict";o(so,"default")});function Q0(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function qv(t){this._context=t}function No(t){return new qv(t)}var Wv=N(()=>{"use strict";o(Q0,"point");o(qv,"Basis");qv.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 3:Q0(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Q0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(No,"default")});function UX(t){this._context=t}function K5(t){return new UX(t)}var HX=N(()=>{"use strict";Hv();Wv();o(UX,"BasisClosed");UX.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:Q0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(K5,"default")});function qX(t){this._context=t}function Q5(t){return new qX(t)}var WX=N(()=>{"use strict";Wv();o(qX,"BasisOpen");qX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Q0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(Q5,"default")});function YX(t,e){this._basis=new qv(t),this._beta=e}var tL,XX=N(()=>{"use strict";Wv();o(YX,"Bundle");YX.prototype={lineStart:o(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,l=-1,u;++l<=r;)u=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(n+u*a),this._beta*e[l]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:o(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};tL=o((function t(e){function r(n){return e===1?new qv(n):new YX(n,e)}return o(r,"bundle"),r.beta=function(n){return t(+n)},r}),"custom")(.85)});function Z0(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function Z5(t,e){this._context=t,this._k=(1-e)/6}var Yv,Xv=N(()=>{"use strict";o(Z0,"point");o(Z5,"Cardinal");Z5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Z0(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Z0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Yv=o((function t(e){function r(n){return new Z5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function J5(t,e){this._context=t,this._k=(1-e)/6}var rL,nL=N(()=>{"use strict";Hv();Xv();o(J5,"CardinalClosed");J5.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Z0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};rL=o((function t(e){function r(n){return new J5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function eT(t,e){this._context=t,this._k=(1-e)/6}var iL,aL=N(()=>{"use strict";Xv();o(eT,"CardinalOpen");eT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Z0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};iL=o((function t(e){function r(n){return new eT(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r}),"custom")(0)});function jv(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Xi){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,i=(i*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Xi){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*h+t._x1*t._l23_2a-e*t._l12_2a)/f,s=(s*h+t._y1*t._l23_2a-r*t._l12_2a)/f}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function jX(t,e){this._context=t,this._alpha=e}var Kv,tT=N(()=>{"use strict";q5();Xv();o(jv,"point");o(jX,"CatmullRom");jX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:jv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Kv=o((function t(e){function r(n){return e?new jX(n,e):new Z5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function KX(t,e){this._context=t,this._alpha=e}var sL,QX=N(()=>{"use strict";nL();Hv();tT();o(KX,"CatmullRomClosed");KX.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:jv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};sL=o((function t(e){function r(n){return e?new KX(n,e):new J5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function ZX(t,e){this._context=t,this._alpha=e}var oL,JX=N(()=>{"use strict";aL();tT();o(ZX,"CatmullRomOpen");ZX.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:jv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};oL=o((function t(e){function r(n){return e?new ZX(n,e):new eT(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r}),"custom")(.5)});function ej(t){this._context=t}function rT(t){return new ej(t)}var tj=N(()=>{"use strict";Hv();o(ej,"LinearClosed");ej.prototype={areaStart:so,areaEnd:so,lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){this._point&&this._context.closePath()},"lineEnd"),point:o(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};o(rT,"default")});function rj(t){return t<0?-1:1}function nj(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),l=(a*i+s*n)/(n+i);return(rj(a)+rj(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(l))||0}function ij(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function lL(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,l=(a-n)/3;t._context.bezierCurveTo(n+l,i+l*e,a-l,s-l*r,a,s)}function nT(t){this._context=t}function aj(t){this._context=new sj(t)}function sj(t){this._context=t}function Qv(t){return new nT(t)}function Zv(t){return new aj(t)}var oj=N(()=>{"use strict";o(rj,"sign");o(nj,"slope3");o(ij,"slope2");o(lL,"point");o(nT,"MonotoneX");nT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:lL(this,this._t0,ij(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,lL(this,ij(this,r=nj(this,t,e)),r);break;default:lL(this,this._t0,r=nj(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}},"point")};o(aj,"MonotoneY");(aj.prototype=Object.create(nT.prototype)).point=function(t,e){nT.prototype.point.call(this,e,t)};o(sj,"ReflectContext");sj.prototype={moveTo:o(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:o(function(){this._context.closePath()},"closePath"),lineTo:o(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)},"bezierCurveTo")};o(Qv,"monotoneX");o(Zv,"monotoneY")});function cj(t){this._context=t}function lj(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{"use strict";o(cj,"Natural");cj.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=lj(t),i=lj(e),a=0,s=1;s{"use strict";o(iT,"Step");iT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=this._y=NaN,this._point=0},"lineStart"),lineEnd:o(function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e},"point")};o(em,"default");o(Jv,"stepBefore");o(e2,"stepAfter")});var fj=N(()=>{"use strict";MX();FX();GX();HX();WX();Wv();VX();XX();nL();aL();Xv();QX();JX();tT();tj();ZD();oj();uj();hj()});var dj=N(()=>{"use strict"});var pj=N(()=>{"use strict"});function Bh(t,e,r){this.k=t,this.x=e,this.y=r}function uL(t){for(;!t.__zoom;)if(!(t=t.parentNode))return cL;return t.__zoom}var cL,hL=N(()=>{"use strict";o(Bh,"Transform");Bh.prototype={constructor:Bh,scale:o(function(t){return t===1?this:new Bh(this.k*t,this.x,this.y)},"scale"),translate:o(function(t,e){return t===0&e===0?this:new Bh(this.k,this.x+this.k*t,this.y+this.k*e)},"translate"),apply:o(function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},"apply"),applyX:o(function(t){return t*this.k+this.x},"applyX"),applyY:o(function(t){return t*this.k+this.y},"applyY"),invert:o(function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},"invert"),invertX:o(function(t){return(t-this.x)/this.k},"invertX"),invertY:o(function(t){return(t-this.y)/this.k},"invertY"),rescaleX:o(function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},"rescaleX"),rescaleY:o(function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},"rescaleY"),toString:o(function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"},"toString")};cL=new Bh(1,0,0);uL.prototype=Bh.prototype;o(uL,"transform")});var mj=N(()=>{"use strict"});var gj=N(()=>{"use strict";w5();dj();pj();hL();mj()});var yj=N(()=>{"use strict";gj();hL()});var yr=N(()=>{"use strict";Ch();SH();HW();XW();B0();jW();KW();JA();gq();QW();G_();ZW();eY();iD();pY();FY();z0();W_();$Y();JW();zY();AX();LX();yl();fj();G5();qD();g5();w5();yj()});var vj=Da(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});ji.BLANK_URL=ji.relativeFirstCharacters=ji.whitespaceEscapeCharsRegex=ji.urlSchemeRegex=ji.ctrlCharactersRegex=ji.htmlCtrlEntityRegex=ji.htmlEntitiesRegex=ji.invalidProtocolRegex=void 0;ji.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;ji.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;ji.htmlCtrlEntityRegex=/&(newline|tab);/gi;ji.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;ji.urlSchemeRegex=/^.+(:|:)/gim;ji.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;ji.relativeFirstCharacters=[".","/"];ji.BLANK_URL="about:blank"});var tm=Da(aT=>{"use strict";Object.defineProperty(aT,"__esModule",{value:!0});aT.sanitizeUrl=void 0;var Na=vj();function VCe(t){return Na.relativeFirstCharacters.indexOf(t[0])>-1}o(VCe,"isRelativeUrlWithoutProtocol");function UCe(t){var e=t.replace(Na.ctrlCharactersRegex,"");return e.replace(Na.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}o(UCe,"decodeHtmlCharacters");function HCe(t){return URL.canParse(t)}o(HCe,"isValidUrl");function xj(t){try{return decodeURIComponent(t)}catch{return t}}o(xj,"decodeURI");function qCe(t){if(!t)return Na.BLANK_URL;var e,r=xj(t.trim());do r=UCe(r).replace(Na.htmlCtrlEntityRegex,"").replace(Na.ctrlCharactersRegex,"").replace(Na.whitespaceEscapeCharsRegex,"").trim(),r=xj(r),e=r.match(Na.ctrlCharactersRegex)||r.match(Na.htmlEntitiesRegex)||r.match(Na.htmlCtrlEntityRegex)||r.match(Na.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return Na.BLANK_URL;if(VCe(n))return n;var i=n.trimStart(),a=i.match(Na.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(Na.invalidProtocolRegex.test(s))return Na.BLANK_URL;var l=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return l;if(s==="http:"||s==="https:"){if(!HCe(l))return Na.BLANK_URL;var u=new URL(l);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return l}o(qCe,"sanitizeUrl");aT.sanitizeUrl=qCe});var fL,Fd,sT,bj,oT,lT,ua,t2,r2=N(()=>{"use strict";fL=ja(tm(),1);gr();Fd=o((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),sT=o((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};Fd(t,r).lower()},"drawBackgroundRect"),bj=o((t,e)=>{let r=e.text.replace(pd," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),oT=o((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,fL.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),lT=o((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,fL.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),ua=o(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),t2=o(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")});var Tj,dL,wj,WCe,YCe,XCe,jCe,KCe,QCe,ZCe,JCe,e7e,t7e,r7e,n7e,Au,Al,kj=N(()=>{"use strict";gr();r2();Tj=ja(tm(),1),dL=o(function(t,e){return Fd(t,e)},"drawRect"),wj=o(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let l=a.startsWith("data:image/png;base64")?a:(0,Tj.sanitizeUrl)(a);s.attr("xlink:href",l)},"drawImage"),WCe=o((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",l=a.lineColor?a.lineColor:"#444444",u=a.offsetX?parseInt(a.offsetX):0,h=a.offsetY?parseInt(a.offsetY):0,f="";if(i===0){let p=n.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",l),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("https://github.com/+f+%22#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("https://github.com/+f+%22#arrowend)"),i=-1}else{let p=n.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",l).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("https://github.com/+f+%22#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("https://github.com/+f+%22#arrowend)")}let d=r.messageFont();Au(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+h,a.label.width,a.label.height,{fill:s},d),a.techn&&a.techn.text!==""&&(d=r.messageFont(),Au(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+h,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},d))}},"drawRels"),YCe=o(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let u={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};dL(n,u);let h=r.boundaryFont();h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=s,Au(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},h),e.type&&e.type.text!==""&&(h=r.boundaryFont(),h.fontColor=s,Au(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},h)),e.descr&&e.descr.text!==""&&(h=r.boundaryFont(),h.fontSize=h.fontSize-2,h.fontColor=s,Au(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},h))},"drawBoundary"),XCe=o(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let l=t.append("g");l.attr("class","person-man");let u=ua();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":u.x=e.x,u.y=e.y,u.fill=n,u.width=e.width,u.height=e.height,u.stroke=i,u.rx=2.5,u.ry=2.5,u.attrs={"stroke-width":.5},dL(l,u);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let h=n7e(r,e.typeC4Shape.text);switch(l.append("text").attr("fill",a).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":wj(l,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let f=r[e.typeC4Shape.text+"Font"]();return f.fontWeight="bold",f.fontSize=f.fontSize+2,f.fontColor=a,Au(r)(e.label.text,l,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},f),f=r[e.typeC4Shape.text+"Font"](),f.fontColor=a,e.techn&&e.techn?.text!==""?Au(r)(e.techn.text,l,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},f):e.type&&e.type.text!==""&&Au(r)(e.type.text,l,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},f),e.descr&&e.descr.text!==""&&(f=r.personFont(),f.fontColor=a,Au(r)(e.descr.text,l,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},f)),e.height},"drawC4Shape"),jCe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),KCe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),QCe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),ZCe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),JCe=o(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),e7e=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),t7e=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),r7e=o(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),n7e=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),Au=(function(){function t(i,a,s,l,u,h,f){let d=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(i);n(d,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d){let{fontSize:p,fontFamily:m,fontWeight:g}=d,y=i.split(tt.lineBreakRegex);for(let v=0;v{"use strict";i7e=typeof global=="object"&&global&&global.Object===Object&&global,uT=i7e});var a7e,s7e,hi,Mo=N(()=>{"use strict";pL();a7e=typeof self=="object"&&self&&self.Object===Object&&self,s7e=uT||a7e||Function("return this")(),hi=s7e});var o7e,Ki,$d=N(()=>{"use strict";Mo();o7e=hi.Symbol,Ki=o7e});function u7e(t){var e=l7e.call(t,n2),r=t[n2];try{t[n2]=void 0;var n=!0}catch{}var i=c7e.call(t);return n&&(e?t[n2]=r:delete t[n2]),i}var Ej,l7e,c7e,n2,Sj,Cj=N(()=>{"use strict";$d();Ej=Object.prototype,l7e=Ej.hasOwnProperty,c7e=Ej.toString,n2=Ki?Ki.toStringTag:void 0;o(u7e,"getRawTag");Sj=u7e});function d7e(t){return f7e.call(t)}var h7e,f7e,Aj,_j=N(()=>{"use strict";h7e=Object.prototype,f7e=h7e.toString;o(d7e,"objectToString");Aj=d7e});function g7e(t){return t==null?t===void 0?m7e:p7e:Dj&&Dj in Object(t)?Sj(t):Aj(t)}var p7e,m7e,Dj,ha,_u=N(()=>{"use strict";$d();Cj();_j();p7e="[object Null]",m7e="[object Undefined]",Dj=Ki?Ki.toStringTag:void 0;o(g7e,"baseGetTag");ha=g7e});function y7e(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var Sn,oo=N(()=>{"use strict";o(y7e,"isObject");Sn=y7e});function w7e(t){if(!Sn(t))return!1;var e=ha(t);return e==x7e||e==b7e||e==v7e||e==T7e}var v7e,x7e,b7e,T7e,Si,i2=N(()=>{"use strict";_u();oo();v7e="[object AsyncFunction]",x7e="[object Function]",b7e="[object GeneratorFunction]",T7e="[object Proxy]";o(w7e,"isFunction");Si=w7e});var k7e,hT,Lj=N(()=>{"use strict";Mo();k7e=hi["__core-js_shared__"],hT=k7e});function E7e(t){return!!Rj&&Rj in t}var Rj,Nj,Mj=N(()=>{"use strict";Lj();Rj=(function(){var t=/[^.]+$/.exec(hT&&hT.keys&&hT.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""})();o(E7e,"isMasked");Nj=E7e});function A7e(t){if(t!=null){try{return C7e.call(t)}catch{}try{return t+""}catch{}}return""}var S7e,C7e,Du,mL=N(()=>{"use strict";S7e=Function.prototype,C7e=S7e.toString;o(A7e,"toSource");Du=A7e});function O7e(t){if(!Sn(t)||Nj(t))return!1;var e=Si(t)?I7e:D7e;return e.test(Du(t))}var _7e,D7e,L7e,R7e,N7e,M7e,I7e,Ij,Oj=N(()=>{"use strict";i2();Mj();oo();mL();_7e=/[\\^$.*+?()[\]{}|]/g,D7e=/^\[object .+?Constructor\]$/,L7e=Function.prototype,R7e=Object.prototype,N7e=L7e.toString,M7e=R7e.hasOwnProperty,I7e=RegExp("^"+N7e.call(M7e).replace(_7e,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o(O7e,"baseIsNative");Ij=O7e});function P7e(t,e){return t?.[e]}var Pj,Bj=N(()=>{"use strict";o(P7e,"getValue");Pj=P7e});function B7e(t,e){var r=Pj(t,e);return Ij(r)?r:void 0}var Ls,Fh=N(()=>{"use strict";Oj();Bj();o(B7e,"getNative");Ls=B7e});var F7e,Lu,a2=N(()=>{"use strict";Fh();F7e=Ls(Object,"create"),Lu=F7e});function $7e(){this.__data__=Lu?Lu(null):{},this.size=0}var Fj,$j=N(()=>{"use strict";a2();o($7e,"hashClear");Fj=$7e});function z7e(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var zj,Gj=N(()=>{"use strict";o(z7e,"hashDelete");zj=z7e});function H7e(t){var e=this.__data__;if(Lu){var r=e[t];return r===G7e?void 0:r}return U7e.call(e,t)?e[t]:void 0}var G7e,V7e,U7e,Vj,Uj=N(()=>{"use strict";a2();G7e="__lodash_hash_undefined__",V7e=Object.prototype,U7e=V7e.hasOwnProperty;o(H7e,"hashGet");Vj=H7e});function Y7e(t){var e=this.__data__;return Lu?e[t]!==void 0:W7e.call(e,t)}var q7e,W7e,Hj,qj=N(()=>{"use strict";a2();q7e=Object.prototype,W7e=q7e.hasOwnProperty;o(Y7e,"hashHas");Hj=Y7e});function j7e(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Lu&&e===void 0?X7e:e,this}var X7e,Wj,Yj=N(()=>{"use strict";a2();X7e="__lodash_hash_undefined__";o(j7e,"hashSet");Wj=j7e});function rm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";$j();Gj();Uj();qj();Yj();o(rm,"Hash");rm.prototype.clear=Fj;rm.prototype.delete=zj;rm.prototype.get=Vj;rm.prototype.has=Hj;rm.prototype.set=Wj;gL=rm});function K7e(){this.__data__=[],this.size=0}var jj,Kj=N(()=>{"use strict";o(K7e,"listCacheClear");jj=K7e});function Q7e(t,e){return t===e||t!==t&&e!==e}var Io,zd=N(()=>{"use strict";o(Q7e,"eq");Io=Q7e});function Z7e(t,e){for(var r=t.length;r--;)if(Io(t[r][0],e))return r;return-1}var $h,s2=N(()=>{"use strict";zd();o(Z7e,"assocIndexOf");$h=Z7e});function tAe(t){var e=this.__data__,r=$h(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():eAe.call(e,r,1),--this.size,!0}var J7e,eAe,Qj,Zj=N(()=>{"use strict";s2();J7e=Array.prototype,eAe=J7e.splice;o(tAe,"listCacheDelete");Qj=tAe});function rAe(t){var e=this.__data__,r=$h(e,t);return r<0?void 0:e[r][1]}var Jj,eK=N(()=>{"use strict";s2();o(rAe,"listCacheGet");Jj=rAe});function nAe(t){return $h(this.__data__,t)>-1}var tK,rK=N(()=>{"use strict";s2();o(nAe,"listCacheHas");tK=nAe});function iAe(t,e){var r=this.__data__,n=$h(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var nK,iK=N(()=>{"use strict";s2();o(iAe,"listCacheSet");nK=iAe});function nm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";Kj();Zj();eK();rK();iK();o(nm,"ListCache");nm.prototype.clear=jj;nm.prototype.delete=Qj;nm.prototype.get=Jj;nm.prototype.has=tK;nm.prototype.set=nK;zh=nm});var aAe,Gh,fT=N(()=>{"use strict";Fh();Mo();aAe=Ls(hi,"Map"),Gh=aAe});function sAe(){this.size=0,this.__data__={hash:new gL,map:new(Gh||zh),string:new gL}}var aK,sK=N(()=>{"use strict";Xj();o2();fT();o(sAe,"mapCacheClear");aK=sAe});function oAe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var oK,lK=N(()=>{"use strict";o(oAe,"isKeyable");oK=oAe});function lAe(t,e){var r=t.__data__;return oK(e)?r[typeof e=="string"?"string":"hash"]:r.map}var Vh,l2=N(()=>{"use strict";lK();o(lAe,"getMapData");Vh=lAe});function cAe(t){var e=Vh(this,t).delete(t);return this.size-=e?1:0,e}var cK,uK=N(()=>{"use strict";l2();o(cAe,"mapCacheDelete");cK=cAe});function uAe(t){return Vh(this,t).get(t)}var hK,fK=N(()=>{"use strict";l2();o(uAe,"mapCacheGet");hK=uAe});function hAe(t){return Vh(this,t).has(t)}var dK,pK=N(()=>{"use strict";l2();o(hAe,"mapCacheHas");dK=hAe});function fAe(t,e){var r=Vh(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var mK,gK=N(()=>{"use strict";l2();o(fAe,"mapCacheSet");mK=fAe});function im(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";sK();uK();fK();pK();gK();o(im,"MapCache");im.prototype.clear=aK;im.prototype.delete=cK;im.prototype.get=hK;im.prototype.has=dK;im.prototype.set=mK;Gd=im});function yL(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(dAe);var r=o(function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s},"memoized");return r.cache=new(yL.Cache||Gd),r}var dAe,am,vL=N(()=>{"use strict";dT();dAe="Expected a function";o(yL,"memoize");yL.Cache=Gd;am=yL});function pAe(){this.__data__=new zh,this.size=0}var yK,vK=N(()=>{"use strict";o2();o(pAe,"stackClear");yK=pAe});function mAe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var xK,bK=N(()=>{"use strict";o(mAe,"stackDelete");xK=mAe});function gAe(t){return this.__data__.get(t)}var TK,wK=N(()=>{"use strict";o(gAe,"stackGet");TK=gAe});function yAe(t){return this.__data__.has(t)}var kK,EK=N(()=>{"use strict";o(yAe,"stackHas");kK=yAe});function xAe(t,e){var r=this.__data__;if(r instanceof zh){var n=r.__data__;if(!Gh||n.length{"use strict";o2();fT();dT();vAe=200;o(xAe,"stackSet");SK=xAe});function sm(t){var e=this.__data__=new zh(t);this.size=e.size}var dc,c2=N(()=>{"use strict";o2();vK();bK();wK();EK();CK();o(sm,"Stack");sm.prototype.clear=yK;sm.prototype.delete=xK;sm.prototype.get=TK;sm.prototype.has=kK;sm.prototype.set=SK;dc=sm});var bAe,om,xL=N(()=>{"use strict";Fh();bAe=(function(){try{var t=Ls(Object,"defineProperty");return t({},"",{}),t}catch{}})(),om=bAe});function TAe(t,e,r){e=="__proto__"&&om?om(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var pc,lm=N(()=>{"use strict";xL();o(TAe,"baseAssignValue");pc=TAe});function wAe(t,e,r){(r!==void 0&&!Io(t[e],r)||r===void 0&&!(e in t))&&pc(t,e,r)}var u2,bL=N(()=>{"use strict";lm();zd();o(wAe,"assignMergeValue");u2=wAe});function kAe(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),l=s.length;l--;){var u=s[t?l:++i];if(r(a[u],u,a)===!1)break}return e}}var AK,_K=N(()=>{"use strict";o(kAe,"createBaseFor");AK=kAe});var EAe,cm,pT=N(()=>{"use strict";_K();EAe=AK(),cm=EAe});function CAe(t,e){if(e)return t.slice();var r=t.length,n=RK?RK(r):new t.constructor(r);return t.copy(n),n}var NK,DK,SAe,LK,RK,mT,TL=N(()=>{"use strict";Mo();NK=typeof exports=="object"&&exports&&!exports.nodeType&&exports,DK=NK&&typeof module=="object"&&module&&!module.nodeType&&module,SAe=DK&&DK.exports===NK,LK=SAe?hi.Buffer:void 0,RK=LK?LK.allocUnsafe:void 0;o(CAe,"cloneBuffer");mT=CAe});var AAe,um,wL=N(()=>{"use strict";Mo();AAe=hi.Uint8Array,um=AAe});function _Ae(t){var e=new t.constructor(t.byteLength);return new um(e).set(new um(t)),e}var hm,gT=N(()=>{"use strict";wL();o(_Ae,"cloneArrayBuffer");hm=_Ae});function DAe(t,e){var r=e?hm(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var yT,kL=N(()=>{"use strict";gT();o(DAe,"cloneTypedArray");yT=DAe});function LAe(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";o(LAe,"copyArray");vT=LAe});var MK,RAe,IK,OK=N(()=>{"use strict";oo();MK=Object.create,RAe=(function(){function t(){}return o(t,"object"),function(e){if(!Sn(e))return{};if(MK)return MK(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}})(),IK=RAe});function NAe(t,e){return function(r){return t(e(r))}}var xT,SL=N(()=>{"use strict";o(NAe,"overArg");xT=NAe});var MAe,fm,bT=N(()=>{"use strict";SL();MAe=xT(Object.getPrototypeOf,Object),fm=MAe});function OAe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||IAe;return t===r}var IAe,mc,dm=N(()=>{"use strict";IAe=Object.prototype;o(OAe,"isPrototype");mc=OAe});function PAe(t){return typeof t.constructor=="function"&&!mc(t)?IK(fm(t)):{}}var TT,CL=N(()=>{"use strict";OK();bT();dm();o(PAe,"initCloneObject");TT=PAe});function BAe(t){return t!=null&&typeof t=="object"}var ai,Oo=N(()=>{"use strict";o(BAe,"isObjectLike");ai=BAe});function $Ae(t){return ai(t)&&ha(t)==FAe}var FAe,AL,PK=N(()=>{"use strict";_u();Oo();FAe="[object Arguments]";o($Ae,"baseIsArguments");AL=$Ae});var BK,zAe,GAe,VAe,_l,pm=N(()=>{"use strict";PK();Oo();BK=Object.prototype,zAe=BK.hasOwnProperty,GAe=BK.propertyIsEnumerable,VAe=AL((function(){return arguments})())?AL:function(t){return ai(t)&&zAe.call(t,"callee")&&!GAe.call(t,"callee")},_l=VAe});var UAe,Bt,Yn=N(()=>{"use strict";UAe=Array.isArray,Bt=UAe});function qAe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=HAe}var HAe,mm,wT=N(()=>{"use strict";HAe=9007199254740991;o(qAe,"isLength");mm=qAe});function WAe(t){return t!=null&&mm(t.length)&&!Si(t)}var fi,Po=N(()=>{"use strict";i2();wT();o(WAe,"isArrayLike");fi=WAe});function YAe(t){return ai(t)&&fi(t)}var Vd,kT=N(()=>{"use strict";Po();Oo();o(YAe,"isArrayLikeObject");Vd=YAe});function XAe(){return!1}var FK,$K=N(()=>{"use strict";o(XAe,"stubFalse");FK=XAe});var VK,zK,jAe,GK,KAe,QAe,Dl,gm=N(()=>{"use strict";Mo();$K();VK=typeof exports=="object"&&exports&&!exports.nodeType&&exports,zK=VK&&typeof module=="object"&&module&&!module.nodeType&&module,jAe=zK&&zK.exports===VK,GK=jAe?hi.Buffer:void 0,KAe=GK?GK.isBuffer:void 0,QAe=KAe||FK,Dl=QAe});function n8e(t){if(!ai(t)||ha(t)!=ZAe)return!1;var e=fm(t);if(e===null)return!0;var r=t8e.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&UK.call(r)==r8e}var ZAe,JAe,e8e,UK,t8e,r8e,HK,qK=N(()=>{"use strict";_u();bT();Oo();ZAe="[object Object]",JAe=Function.prototype,e8e=Object.prototype,UK=JAe.toString,t8e=e8e.hasOwnProperty,r8e=UK.call(Object);o(n8e,"isPlainObject");HK=n8e});function _8e(t){return ai(t)&&mm(t.length)&&!!Gn[ha(t)]}var i8e,a8e,s8e,o8e,l8e,c8e,u8e,h8e,f8e,d8e,p8e,m8e,g8e,y8e,v8e,x8e,b8e,T8e,w8e,k8e,E8e,S8e,C8e,A8e,Gn,WK,YK=N(()=>{"use strict";_u();wT();Oo();i8e="[object Arguments]",a8e="[object Array]",s8e="[object Boolean]",o8e="[object Date]",l8e="[object Error]",c8e="[object Function]",u8e="[object Map]",h8e="[object Number]",f8e="[object Object]",d8e="[object RegExp]",p8e="[object Set]",m8e="[object String]",g8e="[object WeakMap]",y8e="[object ArrayBuffer]",v8e="[object DataView]",x8e="[object Float32Array]",b8e="[object Float64Array]",T8e="[object Int8Array]",w8e="[object Int16Array]",k8e="[object Int32Array]",E8e="[object Uint8Array]",S8e="[object Uint8ClampedArray]",C8e="[object Uint16Array]",A8e="[object Uint32Array]",Gn={};Gn[x8e]=Gn[b8e]=Gn[T8e]=Gn[w8e]=Gn[k8e]=Gn[E8e]=Gn[S8e]=Gn[C8e]=Gn[A8e]=!0;Gn[i8e]=Gn[a8e]=Gn[y8e]=Gn[s8e]=Gn[v8e]=Gn[o8e]=Gn[l8e]=Gn[c8e]=Gn[u8e]=Gn[h8e]=Gn[f8e]=Gn[d8e]=Gn[p8e]=Gn[m8e]=Gn[g8e]=!1;o(_8e,"baseIsTypedArray");WK=_8e});function D8e(t){return function(e){return t(e)}}var Bo,Ud=N(()=>{"use strict";o(D8e,"baseUnary");Bo=D8e});var XK,h2,L8e,_L,R8e,Fo,f2=N(()=>{"use strict";pL();XK=typeof exports=="object"&&exports&&!exports.nodeType&&exports,h2=XK&&typeof module=="object"&&module&&!module.nodeType&&module,L8e=h2&&h2.exports===XK,_L=L8e&&uT.process,R8e=(function(){try{var t=h2&&h2.require&&h2.require("util").types;return t||_L&&_L.binding&&_L.binding("util")}catch{}})(),Fo=R8e});var jK,N8e,Uh,d2=N(()=>{"use strict";YK();Ud();f2();jK=Fo&&Fo.isTypedArray,N8e=jK?Bo(jK):WK,Uh=N8e});function M8e(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var p2,DL=N(()=>{"use strict";o(M8e,"safeGet");p2=M8e});function P8e(t,e,r){var n=t[e];(!(O8e.call(t,e)&&Io(n,r))||r===void 0&&!(e in t))&&pc(t,e,r)}var I8e,O8e,gc,ym=N(()=>{"use strict";lm();zd();I8e=Object.prototype,O8e=I8e.hasOwnProperty;o(P8e,"assignValue");gc=P8e});function B8e(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{"use strict";ym();lm();o(B8e,"copyObject");$o=B8e});function F8e(t,e){for(var r=-1,n=Array(t);++r{"use strict";o(F8e,"baseTimes");KK=F8e});function G8e(t,e){var r=typeof t;return e=e??$8e,!!e&&(r=="number"||r!="symbol"&&z8e.test(t))&&t>-1&&t%1==0&&t{"use strict";$8e=9007199254740991,z8e=/^(?:0|[1-9]\d*)$/;o(G8e,"isIndex");Hh=G8e});function H8e(t,e){var r=Bt(t),n=!r&&_l(t),i=!r&&!n&&Dl(t),a=!r&&!n&&!i&&Uh(t),s=r||n||i||a,l=s?KK(t.length,String):[],u=l.length;for(var h in t)(e||U8e.call(t,h))&&!(s&&(h=="length"||i&&(h=="offset"||h=="parent")||a&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||Hh(h,u)))&&l.push(h);return l}var V8e,U8e,ET,LL=N(()=>{"use strict";QK();pm();Yn();gm();m2();d2();V8e=Object.prototype,U8e=V8e.hasOwnProperty;o(H8e,"arrayLikeKeys");ET=H8e});function q8e(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var ZK,JK=N(()=>{"use strict";o(q8e,"nativeKeysIn");ZK=q8e});function X8e(t){if(!Sn(t))return ZK(t);var e=mc(t),r=[];for(var n in t)n=="constructor"&&(e||!Y8e.call(t,n))||r.push(n);return r}var W8e,Y8e,eQ,tQ=N(()=>{"use strict";oo();dm();JK();W8e=Object.prototype,Y8e=W8e.hasOwnProperty;o(X8e,"baseKeysIn");eQ=X8e});function j8e(t){return fi(t)?ET(t,!0):eQ(t)}var Rs,qh=N(()=>{"use strict";LL();tQ();Po();o(j8e,"keysIn");Rs=j8e});function K8e(t){return $o(t,Rs(t))}var rQ,nQ=N(()=>{"use strict";Hd();qh();o(K8e,"toPlainObject");rQ=K8e});function Q8e(t,e,r,n,i,a,s){var l=p2(t,r),u=p2(e,r),h=s.get(u);if(h){u2(t,r,h);return}var f=a?a(l,u,r+"",t,e,s):void 0,d=f===void 0;if(d){var p=Bt(u),m=!p&&Dl(u),g=!p&&!m&&Uh(u);f=u,p||m||g?Bt(l)?f=l:Vd(l)?f=vT(l):m?(d=!1,f=mT(u,!0)):g?(d=!1,f=yT(u,!0)):f=[]:HK(u)||_l(u)?(f=l,_l(l)?f=rQ(l):(!Sn(l)||Si(l))&&(f=TT(u))):d=!1}d&&(s.set(u,f),i(f,u,n,a,s),s.delete(u)),u2(t,r,f)}var iQ,aQ=N(()=>{"use strict";bL();TL();kL();EL();CL();pm();Yn();kT();gm();i2();oo();qK();d2();DL();nQ();o(Q8e,"baseMergeDeep");iQ=Q8e});function sQ(t,e,r,n,i){t!==e&&cm(e,function(a,s){if(i||(i=new dc),Sn(a))iQ(t,e,s,r,sQ,n,i);else{var l=n?n(p2(t,s),a,s+"",t,e,i):void 0;l===void 0&&(l=a),u2(t,s,l)}},Rs)}var oQ,lQ=N(()=>{"use strict";c2();bL();pT();aQ();oo();qh();DL();o(sQ,"baseMerge");oQ=sQ});function Z8e(t){return t}var Qi,Ru=N(()=>{"use strict";o(Z8e,"identity");Qi=Z8e});function J8e(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var cQ,uQ=N(()=>{"use strict";o(J8e,"apply");cQ=J8e});function e_e(t,e,r){return e=hQ(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=hQ(n.length-e,0),s=Array(a);++i{"use strict";uQ();hQ=Math.max;o(e_e,"overRest");ST=e_e});function t_e(t){return function(){return t}}var Ns,NL=N(()=>{"use strict";o(t_e,"constant");Ns=t_e});var r_e,fQ,dQ=N(()=>{"use strict";NL();xL();Ru();r_e=om?function(t,e){return om(t,"toString",{configurable:!0,enumerable:!1,value:Ns(e),writable:!0})}:Qi,fQ=r_e});function s_e(t){var e=0,r=0;return function(){var n=a_e(),i=i_e-(n-r);if(r=n,i>0){if(++e>=n_e)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var n_e,i_e,a_e,pQ,mQ=N(()=>{"use strict";n_e=800,i_e=16,a_e=Date.now;o(s_e,"shortOut");pQ=s_e});var o_e,CT,ML=N(()=>{"use strict";dQ();mQ();o_e=pQ(fQ),CT=o_e});function l_e(t,e){return CT(ST(t,e,Qi),t+"")}var yc,vm=N(()=>{"use strict";Ru();RL();ML();o(l_e,"baseRest");yc=l_e});function c_e(t,e,r){if(!Sn(r))return!1;var n=typeof e;return(n=="number"?fi(r)&&Hh(e,r.length):n=="string"&&e in r)?Io(r[e],t):!1}var lo,qd=N(()=>{"use strict";zd();Po();m2();oo();o(c_e,"isIterateeCall");lo=c_e});function u_e(t){return yc(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&lo(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{"use strict";vm();qd();o(u_e,"createAssigner");AT=u_e});var h_e,Wh,OL=N(()=>{"use strict";lQ();IL();h_e=AT(function(t,e,r){oQ(t,e,r)}),Wh=h_e});function FL(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return f_e[r]??e}function g_e(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,vQ.sanitizeUrl)(r):r}function TQ(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function v_e(t){let e,r=0;t.forEach(i=>{r+=TQ(i,e),e=i});let n=r/2;return $L(t,n)}function x_e(t){return t.length===1?t[0]:v_e(t)}function T_e(t,e,r){let n=structuredClone(r);X.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=$L(n,i),s=10+t*.5,l=Math.atan2(n[0].y-a.y,n[0].x-a.x),u={x:0,y:0};return e==="start_left"?(u.x=Math.sin(l+Math.PI)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(u.x=Math.sin(l-Math.PI)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(u.x=Math.sin(l)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2-5):(u.x=Math.sin(l)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2),u}function zL(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function w_e(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;iMath.round(parseFloat(a)).toString());return i.includes(r.toString())||i.includes(n.toString())}var vQ,BL,f_e,d_e,p_e,xQ,bQ,m_e,y_e,gQ,$L,b_e,yQ,GL,VL,k_e,E_e,UL,S_e,HL,PL,_T,C_e,A_e,vc,qt,wQ,Ji,xc,tr=N(()=>{"use strict";vQ=ja(tm(),1);yr();gr();S7();pt();vd();v0();vL();OL();F3();BL="\u200B",f_e={curveBasis:No,curveBasisClosed:K5,curveBasisOpen:Q5,curveBumpX:Vv,curveBumpY:Uv,curveBundle:tL,curveCardinalClosed:rL,curveCardinalOpen:iL,curveCardinal:Yv,curveCatmullRomClosed:sL,curveCatmullRomOpen:oL,curveCatmullRom:Kv,curveLinear:Cu,curveLinearClosed:rT,curveMonotoneX:Qv,curveMonotoneY:Zv,curveNatural:J0,curveStep:em,curveStepAfter:e2,curveStepBefore:Jv},d_e=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,p_e=o(function(t,e){let r=xQ(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(l=>l.args);b0(s),n=Rn(n,[...s])}else n=r.args;if(!n)return;let i=_0(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),xQ=o(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${d_e.source})(?=[}][%]{2}).* +`,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),X.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=yd.exec(t))!==null;)if(n.index===yd.lastIndex&&yd.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return X.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),bQ=o(function(t){return t.replace(yd,"")},"removeDirectives"),m_e=o(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");o(FL,"interpolateToCurve");o(g_e,"formatUrl");y_e=o((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),$L=o((t,e)=>{let r,n=e;for(let i of t){if(r){let a=TQ(i,r);if(a===0)return r;if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:gQ((1-s)*r.x+s*i.x,5),y:gQ((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),b_e=o((t,e,r)=>{X.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=$L(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(s)*a+(e[0].x+i.x)/2,l.y=-Math.cos(s)*a+(e[0].y+i.y)/2,l},"calcCardinalityPosition");o(T_e,"calcTerminalLabelPosition");o(zL,"getStylesFromArray");yQ=0,GL=o(()=>(yQ++,"id-"+Math.random().toString(36).substr(2,12)+"-"+yQ),"generateId");o(w_e,"makeRandomHex");VL=o(t=>w_e(t.length),"random"),k_e=o(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),E_e=o(function(t,e){let r=e.text.replace(tt.lineBreakRegex," "),[,n]=vc(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),UL=am((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
      "},r),tt.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,l)=>{let u=Zi(`${s} `,r),h=Zi(a,r);if(u>e){let{hyphenatedStrings:p,remainingWord:m}=S_e(s,e,"-",r);i.push(a,...p),a=m}else h+u>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");l+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),S_e=am((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((l,u)=>{let h=`${s}${l}`;if(Zi(h,n)>=e){let d=u+1,p=i.length===d,m=`${h}${r}`;a.push(p?h:m),s=""}else s=h}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);o(DT,"calculateTextHeight");o(Zi,"calculateTextWidth");HL=am((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=vc(r),s=["sans-serif",n],l=t.split(tt.lineBreakRegex),u=[],h=qe("body");if(!h.remove)return{width:0,height:0,lineHeight:0};let f=h.append("svg");for(let p of s){let m=0,g={width:0,height:0,lineHeight:0};for(let y of l){let v=k_e();v.text=y||BL;let x=E_e(f,v).style("font-size",a).style("font-weight",i).style("font-family",p),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),m=Math.round(b.height),g.height+=m,g.lineHeight=Math.round(Math.max(g.lineHeight,m))}u.push(g)}f.remove();let d=isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1;return u[d]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),PL=class{constructor(e=!1,r){this.count=0;this.count=r?r.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{o(this,"InitIDGenerator")}},C_e=o(function(t){return _T=_T||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),_T.innerHTML=t,unescape(_T.textContent)},"entityDecode");o(qL,"isDetailedError");A_e=o((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),vc=o(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");o(Vn,"cleanAndMerge");qt={assignWithDepth:Rn,wrapLabel:UL,calculateTextHeight:DT,calculateTextWidth:Zi,calculateTextDimensions:HL,cleanAndMerge:Vn,detectInit:p_e,detectDirective:xQ,isSubstringInArray:m_e,interpolateToCurve:FL,calcLabelPosition:x_e,calcCardinalityPosition:b_e,calcTerminalLabelPosition:T_e,formatUrl:g_e,getStylesFromArray:zL,generateId:GL,random:VL,runFunc:y_e,entityDecode:C_e,insertTitle:A_e,isLabelCoordinateInPath:__e,parseFontSize:vc,InitIDGenerator:PL},wQ=o(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),Ji=o(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),xc=o((t,e,{counter:r=0,prefix:n,suffix:i},a)=>a||`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");o(Cn,"handleUndefinedAttr");o(__e,"isLabelCoordinateInPath")});function Ll(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=UL(e[t].text,i,n),e[t].textLines=e[t].text.split(tt.lineBreakRegex).length,e[t].width=i,e[t].height=DT(e[t].text,n);else{let a=e[t].text.split(tt.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let l of a)e[t].width=Math.max(Zi(l,n),e[t].width),s=DT(l,n),e[t].height=e[t].height+s}}function AQ(t,e,r,n,i){let a=new MT(i);a.data.widthLimit=r.data.widthLimit/Math.min(WL,n.length);for(let[s,l]of n.entries()){let u=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=u,u=l.image.Y+l.image.height);let h=l.wrap&&Wt.wrap,f=LT(Wt);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Ll("label",l,h,f,a.data.widthLimit),l.label.Y=u+8,u=l.label.Y+l.label.height,l.type&&l.type.text!==""){l.type.text="["+l.type.text+"]";let g=LT(Wt);Ll("type",l,h,g,a.data.widthLimit),l.type.Y=u+5,u=l.type.Y+l.type.height}if(l.descr&&l.descr.text!==""){let g=LT(Wt);g.fontSize=g.fontSize-2,Ll("descr",l,h,g,a.data.widthLimit),l.descr.Y=u+20,u=l.descr.Y+l.descr.height}if(s==0||s%WL===0){let g=r.data.startx+Wt.diagramMarginX,y=r.data.stopy+Wt.diagramMarginY+u;a.setData(g,g,y,y)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Wt.diagramMarginX:a.data.startx,y=a.data.starty;a.setData(g,g,y,y)}a.name=l.alias;let d=i.db.getC4ShapeArray(l.alias),p=i.db.getC4ShapeKeys(l.alias);p.length>0&&CQ(a,t,d,p),e=l.alias;let m=i.db.getBoundaries(e);m.length>0&&AQ(t,e,a,m,i),l.alias!=="global"&&SQ(t,l,a),r.data.stopy=Math.max(a.data.stopy+Wt.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Wt.c4ShapeMargin,r.data.stopx),RT=Math.max(RT,r.data.stopx),NT=Math.max(NT,r.data.stopy)}}var RT,NT,EQ,WL,Wt,MT,YL,g2,LT,D_e,SQ,CQ,Ms,kQ,L_e,R_e,N_e,XL,_Q=N(()=>{"use strict";yr();kj();pt();RA();gr();GA();Xt();v0();tr();Ei();RT=0,NT=0,EQ=4,WL=2;tv.yy=ov;Wt={},MT=class{static{o(this,"Bounds")}constructor(e){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,YL(e.db.getConfig())}setData(e,r,n,i){this.nextData.startx=this.data.startx=e,this.nextData.stopx=this.data.stopx=r,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(e,r,n,i){e[r]===void 0?e[r]=n:e[r]=i(n,e[r])}insert(e){this.nextData.cnt=this.nextData.cnt+1;let r=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+e.margin:this.nextData.stopx+e.margin*2,n=r+e.width,i=this.nextData.starty+e.margin*2,a=i+e.height;(r>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>EQ)&&(r=this.nextData.startx+e.margin+Wt.nextLinePaddingX,i=this.nextData.stopy+e.margin*2,this.nextData.stopx=n=r+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=a=i+e.height,this.nextData.cnt=1),e.x=r,e.y=i,this.updateVal(this.data,"startx",r,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",a,Math.max),this.updateVal(this.nextData,"startx",r,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",a,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},YL(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},YL=o(function(t){Rn(Wt,t),t.fontFamily&&(Wt.personFontFamily=Wt.systemFontFamily=Wt.messageFontFamily=t.fontFamily),t.fontSize&&(Wt.personFontSize=Wt.systemFontSize=Wt.messageFontSize=t.fontSize),t.fontWeight&&(Wt.personFontWeight=Wt.systemFontWeight=Wt.messageFontWeight=t.fontWeight)},"setConf"),g2=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),LT=o(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),D_e=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");o(Ll,"calcC4ShapeTextWH");SQ=o(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Wt.c4ShapeMargin-35;let n=e.wrap&&Wt.wrap,i=LT(Wt);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=Zi(e.label.text,i);Ll("label",e,n,i,a),Al.drawBoundary(t,e,Wt)},"drawBoundary"),CQ=o(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],l=g2(Wt,s.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,s.typeC4Shape.width=Zi("\xAB"+s.typeC4Shape.text+"\xBB",l),s.typeC4Shape.height=l.fontSize+2,s.typeC4Shape.Y=Wt.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let u=s.wrap&&Wt.wrap,h=Wt.width-Wt.c4ShapePadding*2,f=g2(Wt,s.typeC4Shape.text);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Ll("label",s,u,f,h),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let m=g2(Wt,s.typeC4Shape.text);Ll("type",s,u,m,h),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let m=g2(Wt,s.techn.text);Ll("techn",s,u,m,h),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let d=i,p=s.label.width;if(s.descr&&s.descr.text!==""){let m=g2(Wt,s.typeC4Shape.text);Ll("descr",s,u,m,h),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,p=Math.max(s.label.width,s.descr.width),d=i-s.descr.textLines*5}p=p+Wt.c4ShapePadding,s.width=Math.max(s.width||Wt.width,p,Wt.width),s.height=Math.max(s.height||Wt.height,d,Wt.height),s.margin=s.margin||Wt.c4ShapeMargin,t.insert(s),Al.drawC4Shape(e,s,Wt)}t.bumpLastMargin(Wt.c4ShapeMargin)},"drawC4ShapeArray"),Ms=class{static{o(this,"Point")}constructor(e,r){this.x=e,this.y=r}},kQ=o(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,l=n+t.height/2,u=Math.abs(r-i),h=Math.abs(n-a),f=h/u,d=t.height/t.width,p=null;return n==a&&ri?p=new Ms(r,l):r==i&&na&&(p=new Ms(s,n)),r>i&&n=f?p=new Ms(r,l+f*t.width/2):p=new Ms(s-u/h*t.height/2,n+t.height):r=f?p=new Ms(r+t.width,l+f*t.width/2):p=new Ms(s+u/h*t.height/2,n+t.height):ra?d>=f?p=new Ms(r+t.width,l-f*t.width/2):p=new Ms(s+t.height/2*u/h,n):r>i&&n>a&&(d>=f?p=new Ms(r,l-t.width/2*f):p=new Ms(s-t.height/2*u/h,n)),p},"getIntersectPoint"),L_e=o(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=kQ(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=kQ(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),R_e=o(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Wt.wrap,l=D_e(Wt);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let h=Zi(a.label.text,l);Ll("label",a,s,l,h),a.techn&&a.techn.text!==""&&(h=Zi(a.techn.text,l),Ll("techn",a,s,l,h)),a.descr&&a.descr.text!==""&&(h=Zi(a.descr.text,l),Ll("descr",a,s,l,h));let f=r(a.from),d=r(a.to),p=L_e(f,d);a.startPoint=p.startPoint,a.endPoint=p.endPoint}Al.drawRels(t,e,Wt)},"drawRels");o(AQ,"drawInsideBoundary");N_e=o(function(t,e,r,n){Wt=ge().c4;let i=ge().securityLevel,a;i==="sandbox"&&(a=qe("#i"+e));let s=i==="sandbox"?qe(a.nodes()[0].contentDocument.body):qe("body"),l=n.db;n.db.setWrap(Wt.wrap),EQ=l.getC4ShapeInRow(),WL=l.getC4BoundaryInRow(),X.debug(`C:${JSON.stringify(Wt,null,2)}`);let u=i==="sandbox"?s.select(`[id="${e}"]`):qe(`[id="${e}"]`);Al.insertComputerIcon(u),Al.insertDatabaseIcon(u),Al.insertClockIcon(u);let h=new MT(n);h.setData(Wt.diagramMarginX,Wt.diagramMarginX,Wt.diagramMarginY,Wt.diagramMarginY),h.data.widthLimit=screen.availWidth,RT=Wt.diagramMarginX,NT=Wt.diagramMarginY;let f=n.db.getTitle(),d=n.db.getBoundaries("");AQ(u,"",h,d,n),Al.insertArrowHead(u),Al.insertArrowEnd(u),Al.insertArrowCrossHead(u),Al.insertArrowFilledHead(u),R_e(u,n.db.getRels(),n.db.getC4Shape,n),h.data.stopx=RT,h.data.stopy=NT;let p=h.data,g=p.stopy-p.starty+2*Wt.diagramMarginY,v=p.stopx-p.startx+2*Wt.diagramMarginX;f&&u.append("text").text(f).attr("x",(p.stopx-p.startx)/2-4*Wt.diagramMarginX).attr("y",p.starty+Wt.diagramMarginY),mn(u,g,v,Wt.useMaxWidth);let x=f?60:0;u.attr("viewBox",p.startx-Wt.diagramMarginX+" -"+(Wt.diagramMarginY+x)+" "+v+" "+(g+x)),X.debug("models:",p)},"draw"),XL={drawPersonOrSystemArray:CQ,drawBoundary:SQ,setConf:YL,draw:N_e}});var M_e,DQ,LQ=N(()=>{"use strict";M_e=o(t=>`.person { + stroke: ${t.personBorder}; + fill: ${t.personBkg}; + } +`,"getStyles"),DQ=M_e});var RQ={};dr(RQ,{diagram:()=>I_e});var I_e,NQ=N(()=>{"use strict";RA();GA();_Q();LQ();I_e={parser:nH,db:ov,renderer:XL,styles:DQ,init:o(({c4:t,wrap:e})=>{XL.setConf(t),ov.setWrap(e)},"init")}});function jQ(t){return typeof t>"u"||t===null}function F_e(t){return typeof t=="object"&&t!==null}function $_e(t){return Array.isArray(t)?t:jQ(t)?[]:[t]}function z_e(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;rl&&(a=" ... ",e=n-l+a.length),r-n>l&&(s=" ...",r=n+l-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function KL(t,e){return Pi.repeat(" ",e-t.length)+t}function j_e(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var l="",u,h,f=Math.min(t.line+e.linesAfter,i.length).toString().length,d=e.maxLength-(e.indent+f+3);for(u=1;u<=e.linesBefore&&!(s-u<0);u++)h=jL(t.buffer,n[s-u],i[s-u],t.position-(n[s]-n[s-u]),d),l=Pi.repeat(" ",e.indent)+KL((t.line-u+1).toString(),f)+" | "+h.str+` +`+l;for(h=jL(t.buffer,n[s],i[s],t.position,d),l+=Pi.repeat(" ",e.indent)+KL((t.line+1).toString(),f)+" | "+h.str+` +`,l+=Pi.repeat("-",e.indent+f+3+h.pos)+`^ +`,u=1;u<=e.linesAfter&&!(s+u>=i.length);u++)h=jL(t.buffer,n[s+u],i[s+u],t.position-(n[s]-n[s+u]),d),l+=Pi.repeat(" ",e.indent)+KL((t.line+u+1).toString(),f)+" | "+h.str+` +`;return l.replace(/\n$/,"")}function J_e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function eDe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(Q_e.indexOf(r)===-1)throw new Is('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=J_e(e.styleAliases||null),Z_e.indexOf(this.kind)===-1)throw new Is('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function IQ(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function tDe(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(o(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function CDe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Pi.isNegativeZero(t))return"-0.0";return r=t.toString(10),SDe.test(r)?r.replace("e",".e"):r}function ADe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Pi.isNegativeZero(t))}function LDe(t){return t===null?!1:ZQ.exec(t)!==null||JQ.exec(t)!==null}function RDe(t){var e,r,n,i,a,s,l,u=0,h=null,f,d,p;if(e=ZQ.exec(t),e===null&&(e=JQ.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],l=+e[6],e[7]){for(u=e[7].slice(0,3);u.length<3;)u+="0";u=+u}return e[9]&&(f=+e[10],d=+(e[11]||0),h=(f*60+d)*6e4,e[9]==="-"&&(h=-h)),p=new Date(Date.UTC(r,n,i,a,s,l,u)),h&&p.setTime(p.getTime()-h),p}function NDe(t){return t.toISOString()}function IDe(t){return t==="<<"||t===null}function PDe(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=n9;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function BDe(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=n9,s=0,l=[];for(e=0;e>16&255),l.push(s>>8&255),l.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(l.push(s>>16&255),l.push(s>>8&255),l.push(s&255)):r===18?(l.push(s>>10&255),l.push(s>>2&255)):r===12&&l.push(s>>4&255),new Uint8Array(l)}function FDe(t){var e="",r=0,n,i,a=t.length,s=n9;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function $De(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function UDe(t){if(t===null)return!0;var e=[],r,n,i,a,s,l=t;for(r=0,n=l.length;r>10)+55296,(t-65536&1023)+56320)}function lLe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||eZ,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function oZ(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=K_e(r),new Is(e,r)}function Zt(t,e){throw oZ(t,e)}function PT(t,e){t.onWarning&&t.onWarning.call(null,oZ(t,e))}function Yh(t,e,r,n){var i,a,s,l;if(e1&&(t.result+=Pi.repeat(` +`,e-1))}function cLe(t,e,r){var n,i,a,s,l,u,h,f,d=t.kind,p=t.result,m;if(m=t.input.charCodeAt(t.position),Os(m)||bm(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(i=t.input.charCodeAt(t.position+1),Os(i)||r&&bm(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,l=!1;m!==0;){if(m===58){if(i=t.input.charCodeAt(t.position+1),Os(i)||r&&bm(i))break}else if(m===35){if(n=t.input.charCodeAt(t.position-1),Os(n))break}else{if(t.position===t.lineStart&&$T(t)||r&&bm(m))break;if(bc(m))if(u=t.line,h=t.lineStart,f=t.lineIndent,Ci(t,!1,-1),t.lineIndent>=e){l=!0,m=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=u,t.lineStart=h,t.lineIndent=f;break}}l&&(Yh(t,a,s,!1),a9(t,t.line-u),a=s=t.position,l=!1),Yd(m)||(s=t.position+1),m=t.input.charCodeAt(++t.position)}return Yh(t,a,s,!1),t.result?!0:(t.kind=d,t.result=p,!1)}function uLe(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Yh(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else bc(r)?(Yh(t,n,i,!0),a9(t,Ci(t,!1,e)),n=i=t.position):t.position===t.lineStart&&$T(t)?Zt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);Zt(t,"unexpected end of the stream within a single quoted scalar")}function hLe(t,e){var r,n,i,a,s,l;if(l=t.input.charCodeAt(t.position),l!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(l=t.input.charCodeAt(t.position))!==0;){if(l===34)return Yh(t,r,t.position,!0),t.position++,!0;if(l===92){if(Yh(t,r,t.position,!0),l=t.input.charCodeAt(++t.position),bc(l))Ci(t,!1,e);else if(l<256&&aZ[l])t.result+=sZ[l],t.position++;else if((s=aLe(l))>0){for(i=s,a=0;i>0;i--)l=t.input.charCodeAt(++t.position),(s=iLe(l))>=0?a=(a<<4)+s:Zt(t,"expected hexadecimal character");t.result+=oLe(a),t.position++}else Zt(t,"unknown escape sequence");r=n=t.position}else bc(l)?(Yh(t,r,n,!0),a9(t,Ci(t,!1,e)),r=n=t.position):t.position===t.lineStart&&$T(t)?Zt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Zt(t,"unexpected end of the stream within a double quoted scalar")}function fLe(t,e){var r=!0,n,i,a,s=t.tag,l,u=t.anchor,h,f,d,p,m,g=Object.create(null),y,v,x,b;if(b=t.input.charCodeAt(t.position),b===91)f=93,m=!1,l=[];else if(b===123)f=125,m=!0,l={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=l),b=t.input.charCodeAt(++t.position);b!==0;){if(Ci(t,!0,e),b=t.input.charCodeAt(t.position),b===f)return t.position++,t.tag=s,t.anchor=u,t.kind=m?"mapping":"sequence",t.result=l,!0;r?b===44&&Zt(t,"expected the node content, but found ','"):Zt(t,"missed comma between flow collection entries"),v=y=x=null,d=p=!1,b===63&&(h=t.input.charCodeAt(t.position+1),Os(h)&&(d=p=!0,t.position++,Ci(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,wm(t,e,IT,!1,!0),v=t.tag,y=t.result,Ci(t,!0,e),b=t.input.charCodeAt(t.position),(p||t.line===n)&&b===58&&(d=!0,b=t.input.charCodeAt(++t.position),Ci(t,!0,e),wm(t,e,IT,!1,!0),x=t.result),m?Tm(t,l,g,v,y,x,n,i,a):d?l.push(Tm(t,null,g,v,y,x,n,i,a)):l.push(y),Ci(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}Zt(t,"unexpected end of the stream within a flow collection")}function dLe(t,e){var r,n,i=QL,a=!1,s=!1,l=e,u=0,h=!1,f,d;if(d=t.input.charCodeAt(t.position),d===124)n=!1;else if(d===62)n=!0;else return!1;for(t.kind="scalar",t.result="";d!==0;)if(d=t.input.charCodeAt(++t.position),d===43||d===45)QL===i?i=d===43?OQ:eLe:Zt(t,"repeat of a chomping mode identifier");else if((f=sLe(d))>=0)f===0?Zt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?Zt(t,"repeat of an indentation width identifier"):(l=e+f-1,s=!0);else break;if(Yd(d)){do d=t.input.charCodeAt(++t.position);while(Yd(d));if(d===35)do d=t.input.charCodeAt(++t.position);while(!bc(d)&&d!==0)}for(;d!==0;){for(i9(t),t.lineIndent=0,d=t.input.charCodeAt(t.position);(!s||t.lineIndentl&&(l=t.lineIndent),bc(d)){u++;continue}if(t.lineIndente)&&u!==0)Zt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(v&&(s=t.line,l=t.lineStart,u=t.position),wm(t,e,OT,!0,i)&&(v?g=t.result:y=t.result),v||(Tm(t,d,p,m,g,y,s,l,u),m=g=y=null),Ci(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)Zt(t,"bad indentation of a mapping entry");else if(t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),d=0,p=t.implicitTypes.length;d"),t.result!==null&&g.kind!==t.kind&&Zt(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Zt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||f}function vLe(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(Ci(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!Os(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&Zt(t,"directive name must not be less than one character in length");s!==0;){for(;Yd(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!bc(s));break}if(bc(s))break;for(r=t.position;s!==0&&!Os(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&i9(t),Xh.call(FQ,n)?FQ[n](t,n,i):PT(t,'unknown document directive "'+n+'"')}if(Ci(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Ci(t,!0,-1)):a&&Zt(t,"directives end mark is expected"),wm(t,t.lineIndent-1,OT,!1,!0),Ci(t,!0,-1),t.checkLineBreaks&&rLe.test(t.input.slice(e,t.position))&&PT(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&$T(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Ci(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=lZ(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function yZ(t){var e=/^\n* /;return e.test(t)}function XLe(t,e,r,n,i,a,s,l){var u,h=0,f=null,d=!1,p=!1,m=n!==-1,g=-1,y=WLe(y2(t,0))&&YLe(y2(t,t.length-1));if(e||s)for(u=0;u=65536?u+=2:u++){if(h=y2(t,u),!T2(h))return xm;y=y&&UQ(h,f,l),f=h}else{for(u=0;u=65536?u+=2:u++){if(h=y2(t,u),h===x2)d=!0,m&&(p=p||u-g-1>n&&t[g+1]!==" ",g=u);else if(!T2(h))return xm;y=y&&UQ(h,f,l),f=h}p=p||m&&u-g-1>n&&t[g+1]!==" "}return!d&&!p?y&&!s&&!i(t)?vZ:a===b2?xm:t9:r>9&&yZ(t)?xm:s?a===b2?xm:t9:p?bZ:xZ}function jLe(t,e,r,n,i){t.dump=(function(){if(e.length===0)return t.quotingType===b2?'""':"''";if(!t.noCompatMode&&($Le.indexOf(e)!==-1||zLe.test(e)))return t.quotingType===b2?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),l=n||t.flowLevel>-1&&r>=t.flowLevel;function u(h){return qLe(t,h)}switch(o(u,"testAmbiguity"),XLe(e,l,t.indent,s,u,t.quotingType,t.forceQuotes&&!n,i)){case vZ:return e;case t9:return"'"+e.replace(/'/g,"''")+"'";case xZ:return"|"+HQ(e,t.indent)+qQ(GQ(e,a));case bZ:return">"+HQ(e,t.indent)+qQ(GQ(KLe(e,s),a));case xm:return'"'+QLe(e)+'"';default:throw new Is("impossible error: invalid scalar style")}})()}function HQ(t,e){var r=yZ(t)?String(e):"",n=t[t.length-1]===` +`,i=n&&(t[t.length-2]===` +`||t===` +`),a=i?"+":n?"":"-";return r+a+` +`}function qQ(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function KLe(t,e){for(var r=/(\n+)([^\n]*)/g,n=(function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,WQ(t.slice(0,h),e)})(),i=t[0]===` +`||t[0]===" ",a,s;s=r.exec(t);){var l=s[1],u=s[2];a=u[0]===" ",n+=l+(!i&&!a&&u!==""?` +`:"")+WQ(u,e),i=a}return n}function WQ(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,l=0,u="";n=r.exec(t);)l=n.index,l-i>e&&(a=s>i?s:l,u+=` +`+t.slice(i,a),i=a+1),s=l;return u+=` +`,t.length-i>e&&s>i?u+=t.slice(i,s)+` +`+t.slice(s+1):u+=t.slice(i),u.slice(1)}function QLe(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=y2(t,i),n=Ia[r],!n&&T2(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||VLe(r);return e}function ZLe(t,e,r){var n="",i=t.tag,a,s,l;for(a=0,s=r.length;a"u"&&Nu(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function YQ(t,e,r,n){var i="",a=t.tag,s,l,u;for(s=0,l=r.length;s"u"&&Nu(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=e9(t,e)),t.dump&&x2===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function JLe(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,l,u,h,f;for(s=0,l=a.length;s1024&&(f+="? "),f+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Nu(t,e,h,!1,!1)&&(f+=t.dump,n+=f));t.tag=i,t.dump="{"+n+"}"}function e9e(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),l,u,h,f,d,p;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new Is("sortKeys must be a boolean or a function");for(l=0,u=s.length;l1024,d&&(t.dump&&x2===t.dump.charCodeAt(0)?p+="?":p+="? "),p+=t.dump,d&&(p+=e9(t,e)),Nu(t,e+1,f,!0,d)&&(t.dump&&x2===t.dump.charCodeAt(0)?p+=":":p+=": ",p+=t.dump,i+=p));t.tag=a,t.dump=i||"{}"}function XQ(t,e,r){var n,i,a,s,l,u;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+u+'" style');t.dump=n}return!0}return!1}function Nu(t,e,r,n,i,a,s){t.tag=null,t.dump=r,XQ(t,r,!1)||XQ(t,r,!0);var l=uZ.call(t.dump),u=n,h;n&&(n=t.flowLevel<0||t.flowLevel>e);var f=l==="[object Object]"||l==="[object Array]",d,p;if(f&&(d=t.duplicates.indexOf(r),p=d!==-1),(t.tag!==null&&t.tag!=="?"||p||t.indent!==2&&e>0)&&(i=!1),p&&t.usedDuplicates[d])t.dump="*ref_"+d;else{if(f&&p&&!t.usedDuplicates[d]&&(t.usedDuplicates[d]=!0),l==="[object Object]")n&&Object.keys(t.dump).length!==0?(e9e(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(JLe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?YQ(t,e-1,t.dump,i):YQ(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(ZLe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object String]")t.tag!=="?"&&jLe(t,t.dump,e,a,u);else{if(l==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new Is("unacceptable kind of an object to dump "+l)}t.tag!==null&&t.tag!=="?"&&(h=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?h="!"+h:h.slice(0,18)==="tag:yaml.org,2002:"?h="!!"+h.slice(18):h="!<"+h+">",t.dump=h+" "+t.dump)}return!0}function t9e(t,e){var r=[],n=[],i,a;for(r9(t,r,n),i=0,a=n.length;i{"use strict";o(jQ,"isNothing");o(F_e,"isObject");o($_e,"toArray");o(z_e,"extend");o(G_e,"repeat");o(V_e,"isNegativeZero");U_e=jQ,H_e=F_e,q_e=$_e,W_e=G_e,Y_e=V_e,X_e=z_e,Pi={isNothing:U_e,isObject:H_e,toArray:q_e,repeat:W_e,isNegativeZero:Y_e,extend:X_e};o(KQ,"formatError");o(v2,"YAMLException$1");v2.prototype=Object.create(Error.prototype);v2.prototype.constructor=v2;v2.prototype.toString=o(function(e){return this.name+": "+KQ(this,e)},"toString");Is=v2;o(jL,"getLine");o(KL,"padStart");o(j_e,"makeSnippet");K_e=j_e,Q_e=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],Z_e=["scalar","sequence","mapping"];o(J_e,"compileStyleAliases");o(eDe,"Type$1");Ma=eDe;o(IQ,"compileList");o(tDe,"compileMap");o(ZL,"Schema$1");ZL.prototype.extend=o(function(e){var r=[],n=[];if(e instanceof Ma)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new Is("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof Ma))throw new Is("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new Is("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new Is("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof Ma))throw new Is("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(ZL.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=IQ(i,"implicit"),i.compiledExplicit=IQ(i,"explicit"),i.compiledTypeMap=tDe(i.compiledImplicit,i.compiledExplicit),i},"extend");rDe=ZL,nDe=new Ma("tag:yaml.org,2002:str",{kind:"scalar",construct:o(function(t){return t!==null?t:""},"construct")}),iDe=new Ma("tag:yaml.org,2002:seq",{kind:"sequence",construct:o(function(t){return t!==null?t:[]},"construct")}),aDe=new Ma("tag:yaml.org,2002:map",{kind:"mapping",construct:o(function(t){return t!==null?t:{}},"construct")}),sDe=new rDe({explicit:[nDe,iDe,aDe]});o(oDe,"resolveYamlNull");o(lDe,"constructYamlNull");o(cDe,"isNull");uDe=new Ma("tag:yaml.org,2002:null",{kind:"scalar",resolve:oDe,construct:lDe,predicate:cDe,represent:{canonical:o(function(){return"~"},"canonical"),lowercase:o(function(){return"null"},"lowercase"),uppercase:o(function(){return"NULL"},"uppercase"),camelcase:o(function(){return"Null"},"camelcase"),empty:o(function(){return""},"empty")},defaultStyle:"lowercase"});o(hDe,"resolveYamlBoolean");o(fDe,"constructYamlBoolean");o(dDe,"isBoolean");pDe=new Ma("tag:yaml.org,2002:bool",{kind:"scalar",resolve:hDe,construct:fDe,predicate:dDe,represent:{lowercase:o(function(t){return t?"true":"false"},"lowercase"),uppercase:o(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:o(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});o(mDe,"isHexCode");o(gDe,"isOctCode");o(yDe,"isDecCode");o(vDe,"resolveYamlInteger");o(xDe,"constructYamlInteger");o(bDe,"isInteger");TDe=new Ma("tag:yaml.org,2002:int",{kind:"scalar",resolve:vDe,construct:xDe,predicate:bDe,represent:{binary:o(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:o(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:o(function(t){return t.toString(10)},"decimal"),hexadecimal:o(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),wDe=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");o(kDe,"resolveYamlFloat");o(EDe,"constructYamlFloat");SDe=/^[-+]?[0-9]+e/;o(CDe,"representYamlFloat");o(ADe,"isFloat");_De=new Ma("tag:yaml.org,2002:float",{kind:"scalar",resolve:kDe,construct:EDe,predicate:ADe,represent:CDe,defaultStyle:"lowercase"}),QQ=sDe.extend({implicit:[uDe,pDe,TDe,_De]}),DDe=QQ,ZQ=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),JQ=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");o(LDe,"resolveYamlTimestamp");o(RDe,"constructYamlTimestamp");o(NDe,"representYamlTimestamp");MDe=new Ma("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:LDe,construct:RDe,instanceOf:Date,represent:NDe});o(IDe,"resolveYamlMerge");ODe=new Ma("tag:yaml.org,2002:merge",{kind:"scalar",resolve:IDe}),n9=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;o(PDe,"resolveYamlBinary");o(BDe,"constructYamlBinary");o(FDe,"representYamlBinary");o($De,"isBinary");zDe=new Ma("tag:yaml.org,2002:binary",{kind:"scalar",resolve:PDe,construct:BDe,predicate:$De,represent:FDe}),GDe=Object.prototype.hasOwnProperty,VDe=Object.prototype.toString;o(UDe,"resolveYamlOmap");o(HDe,"constructYamlOmap");qDe=new Ma("tag:yaml.org,2002:omap",{kind:"sequence",resolve:UDe,construct:HDe}),WDe=Object.prototype.toString;o(YDe,"resolveYamlPairs");o(XDe,"constructYamlPairs");jDe=new Ma("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:YDe,construct:XDe}),KDe=Object.prototype.hasOwnProperty;o(QDe,"resolveYamlSet");o(ZDe,"constructYamlSet");JDe=new Ma("tag:yaml.org,2002:set",{kind:"mapping",resolve:QDe,construct:ZDe}),eZ=DDe.extend({implicit:[MDe,ODe],explicit:[zDe,qDe,jDe,JDe]}),Xh=Object.prototype.hasOwnProperty,IT=1,tZ=2,rZ=3,OT=4,QL=1,eLe=2,OQ=3,tLe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,rLe=/[\x85\u2028\u2029]/,nLe=/[,\[\]\{\}]/,nZ=/^(?:!|!!|![a-z\-]+!)$/i,iZ=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;o(PQ,"_class");o(bc,"is_EOL");o(Yd,"is_WHITE_SPACE");o(Os,"is_WS_OR_EOL");o(bm,"is_FLOW_INDICATOR");o(iLe,"fromHexCode");o(aLe,"escapedHexLen");o(sLe,"fromDecimalCode");o(BQ,"simpleEscapeSequence");o(oLe,"charFromCodepoint");aZ=new Array(256),sZ=new Array(256);for(Wd=0;Wd<256;Wd++)aZ[Wd]=BQ(Wd)?1:0,sZ[Wd]=BQ(Wd);o(lLe,"State$1");o(oZ,"generateError");o(Zt,"throwError");o(PT,"throwWarning");FQ={YAML:o(function(e,r,n){var i,a,s;e.version!==null&&Zt(e,"duplication of %YAML directive"),n.length!==1&&Zt(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&Zt(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&Zt(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&PT(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:o(function(e,r,n){var i,a;n.length!==2&&Zt(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],nZ.test(i)||Zt(e,"ill-formed tag handle (first argument) of the TAG directive"),Xh.call(e.tagMap,i)&&Zt(e,'there is a previously declared suffix for "'+i+'" tag handle'),iZ.test(a)||Zt(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{Zt(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};o(Yh,"captureSegment");o($Q,"mergeMappings");o(Tm,"storeMappingPair");o(i9,"readLineBreak");o(Ci,"skipSeparationSpace");o($T,"testDocumentSeparator");o(a9,"writeFoldedLines");o(cLe,"readPlainScalar");o(uLe,"readSingleQuotedScalar");o(hLe,"readDoubleQuotedScalar");o(fLe,"readFlowCollection");o(dLe,"readBlockScalar");o(zQ,"readBlockSequence");o(pLe,"readBlockMapping");o(mLe,"readTagProperty");o(gLe,"readAnchorProperty");o(yLe,"readAlias");o(wm,"composeNode");o(vLe,"readDocument");o(lZ,"loadDocuments");o(xLe,"loadAll$1");o(bLe,"load$1");TLe=xLe,wLe=bLe,cZ={loadAll:TLe,load:wLe},uZ=Object.prototype.toString,hZ=Object.prototype.hasOwnProperty,s9=65279,kLe=9,x2=10,ELe=13,SLe=32,CLe=33,ALe=34,JL=35,_Le=37,DLe=38,LLe=39,RLe=42,fZ=44,NLe=45,BT=58,MLe=61,ILe=62,OLe=63,PLe=64,dZ=91,pZ=93,BLe=96,mZ=123,FLe=124,gZ=125,Ia={};Ia[0]="\\0";Ia[7]="\\a";Ia[8]="\\b";Ia[9]="\\t";Ia[10]="\\n";Ia[11]="\\v";Ia[12]="\\f";Ia[13]="\\r";Ia[27]="\\e";Ia[34]='\\"';Ia[92]="\\\\";Ia[133]="\\N";Ia[160]="\\_";Ia[8232]="\\L";Ia[8233]="\\P";$Le=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],zLe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;o(GLe,"compileStyleMap");o(VLe,"encodeHex");ULe=1,b2=2;o(HLe,"State");o(GQ,"indentString");o(e9,"generateNextLine");o(qLe,"testImplicitResolving");o(FT,"isWhitespace");o(T2,"isPrintable");o(VQ,"isNsCharOrWhitespace");o(UQ,"isPlainSafe");o(WLe,"isPlainSafeFirst");o(YLe,"isPlainSafeLast");o(y2,"codePointAt");o(yZ,"needIndentIndicator");vZ=1,t9=2,xZ=3,bZ=4,xm=5;o(XLe,"chooseScalarStyle");o(jLe,"writeScalar");o(HQ,"blockHeader");o(qQ,"dropEndingNewline");o(KLe,"foldString");o(WQ,"foldLine");o(QLe,"escapeString");o(ZLe,"writeFlowSequence");o(YQ,"writeBlockSequence");o(JLe,"writeFlowMapping");o(e9e,"writeBlockMapping");o(XQ,"detectType");o(Nu,"writeNode");o(t9e,"getDuplicateReferences");o(r9,"inspectNode");o(r9e,"dump$1");n9e=r9e,i9e={dump:n9e};o(o9,"renamed");jh=QQ,Kh=cZ.load,A6t=cZ.loadAll,_6t=i9e.dump,D6t=o9("safeLoad","load"),L6t=o9("safeLoadAll","loadAll"),R6t=o9("safeDump","dump")});function h9(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function CZ(t){jd=t}function on(t,e=""){let r=typeof t=="string"?t:t.source,n={replace:o((i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(as.caret,"$1"),r=r.replace(i,s),n},"replace"),getRegex:o(()=>new RegExp(r,e),"getRegex")};return n}function Tc(t,e){if(e){if(as.escapeTest.test(t))return t.replace(as.escapeReplace,wZ)}else if(as.escapeTestNoEncode.test(t))return t.replace(as.escapeReplaceNoEncode,wZ);return t}function kZ(t){try{t=encodeURI(t).replace(as.percentDecode,"%")}catch{return null}return t}function EZ(t,e){let r=t.replace(as.findPipe,(a,s,l)=>{let u=!1,h=s;for(;--h>=0&&l[h]==="\\";)u=!u;return u?"|":" |"}),n=r.split(as.splitPipe),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length0?-2:-1}function SZ(t,e,r,n,i){let a=e.href,s=e.title||null,l=t[1].replace(i.other.outputLinkReplace,"$1");n.state.inLink=!0;let u={type:t[0].charAt(0)==="!"?"image":"link",raw:r,href:a,title:s,text:l,tokens:n.inlineTokens(l)};return n.state.inLink=!1,u}function $9e(t,e,r){let n=t.match(r.other.indentCodeCompensation);if(n===null)return e;let i=n[1];return e.split(` +`).map(a=>{let s=a.match(r.other.beginningSpace);if(s===null)return a;let[l]=s;return l.length>=i.length?a.slice(i.length):a}).join(` +`)}function nn(t,e){return Xd.parse(t,e)}var jd,C2,as,a9e,s9e,o9e,A2,l9e,f9,AZ,_Z,c9e,d9,u9e,p9,h9e,f9e,qT,m9,d9e,DZ,p9e,g9,TZ,m9e,g9e,y9e,v9e,LZ,x9e,WT,y9,RZ,b9e,NZ,T9e,w9e,k9e,MZ,E9e,S9e,IZ,C9e,A9e,_9e,D9e,L9e,R9e,N9e,VT,M9e,OZ,PZ,I9e,v9,O9e,l9,P9e,GT,k2,B9e,wZ,UT,Mu,HT,x9,Iu,S2,z9e,Xd,M6t,I6t,O6t,P6t,B6t,F6t,$6t,BZ=N(()=>{"use strict";o(h9,"L");jd=h9();o(CZ,"G");C2={exec:o(()=>null,"exec")};o(on,"h");as={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:o(t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),"listItemRegex"),nextBulletRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),"nextBulletRegex"),hrRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),"hrRegex"),fencesBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),"fencesBeginRegex"),headingBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),"headingBeginRegex"),htmlBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),"htmlBeginRegex")},a9e=/^(?:[ \t]*(?:\n|$))+/,s9e=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,o9e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,A2=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,l9e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,f9=/(?:[*+-]|\d{1,9}[.)])/,AZ=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,_Z=on(AZ).replace(/bull/g,f9).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),c9e=on(AZ).replace(/bull/g,f9).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),d9=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,u9e=/^[^\n]+/,p9=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,h9e=on(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",p9).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),f9e=on(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,f9).getRegex(),qT="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",m9=/|$))/,d9e=on("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",m9).replace("tag",qT).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),DZ=on(d9).replace("hr",A2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qT).getRegex(),p9e=on(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",DZ).getRegex(),g9={blockquote:p9e,code:s9e,def:h9e,fences:o9e,heading:l9e,hr:A2,html:d9e,lheading:_Z,list:f9e,newline:a9e,paragraph:DZ,table:C2,text:u9e},TZ=on("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",A2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qT).getRegex(),m9e={...g9,lheading:c9e,table:TZ,paragraph:on(d9).replace("hr",A2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",TZ).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",qT).getRegex()},g9e={...g9,html:on(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",m9).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:C2,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:on(d9).replace("hr",A2).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",_Z).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},y9e=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,v9e=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,LZ=/^( {2,}|\\)\n(?!\s*$)/,x9e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,MZ=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,E9e=on(MZ,"u").replace(/punct/g,WT).getRegex(),S9e=on(MZ,"u").replace(/punct/g,NZ).getRegex(),IZ="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",C9e=on(IZ,"gu").replace(/notPunctSpace/g,RZ).replace(/punctSpace/g,y9).replace(/punct/g,WT).getRegex(),A9e=on(IZ,"gu").replace(/notPunctSpace/g,w9e).replace(/punctSpace/g,T9e).replace(/punct/g,NZ).getRegex(),_9e=on("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,RZ).replace(/punctSpace/g,y9).replace(/punct/g,WT).getRegex(),D9e=on(/\\(punct)/,"gu").replace(/punct/g,WT).getRegex(),L9e=on(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),R9e=on(m9).replace("(?:-->|$)","-->").getRegex(),N9e=on("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",R9e).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),VT=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`[^`]*`|[^\[\]\\`])*?/,M9e=on(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",VT).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),OZ=on(/^!?\[(label)\]\[(ref)\]/).replace("label",VT).replace("ref",p9).getRegex(),PZ=on(/^!?\[(ref)\](?:\[\])?/).replace("ref",p9).getRegex(),I9e=on("reflink|nolink(?!\\()","g").replace("reflink",OZ).replace("nolink",PZ).getRegex(),v9={_backpedal:C2,anyPunctuation:D9e,autolink:L9e,blockSkip:k9e,br:LZ,code:v9e,del:C2,emStrongLDelim:E9e,emStrongRDelimAst:C9e,emStrongRDelimUnd:_9e,escape:y9e,link:M9e,nolink:PZ,punctuation:b9e,reflink:OZ,reflinkSearch:I9e,tag:N9e,text:x9e,url:C2},O9e={...v9,link:on(/^!?\[(label)\]\((.*?)\)/).replace("label",VT).getRegex(),reflink:on(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",VT).getRegex()},l9={...v9,emStrongRDelimAst:A9e,emStrongLDelim:S9e,url:on(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},wZ=o(t=>B9e[t],"ke");o(Tc,"w");o(kZ,"J");o(EZ,"V");o(E2,"z");o(F9e,"ge");o(SZ,"fe");o($9e,"Je");UT=class{static{o(this,"y")}options;rules;lexer;constructor(t){this.options=t||jd}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let r=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?r:E2(r,` +`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let r=e[0],n=$9e(r,e[3]||"",this.rules);return{type:"code",raw:r,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:n}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let r=e[2].trim();if(this.rules.other.endingHash.test(r)){let n=E2(r,"#");(this.options.pedantic||!n||this.rules.other.endingSpaceChar.test(n))&&(r=n.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:E2(e[0],` +`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let r=E2(e[0],` +`).split(` +`),n="",i="",a=[];for(;r.length>0;){let s=!1,l=[],u;for(u=0;u1,i={type:"list",raw:"",ordered:n,start:n?+r.slice(0,-1):"",loose:!1,items:[]};r=n?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=n?r:"[*+-]");let a=this.rules.other.listItemRegex(r),s=!1;for(;t;){let u=!1,h="",f="";if(!(e=a.exec(t))||this.rules.block.hr.test(t))break;h=e[0],t=t.substring(h.length);let d=e[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,x=>" ".repeat(3*x.length)),p=t.split(` +`,1)[0],m=!d.trim(),g=0;if(this.options.pedantic?(g=2,f=d.trimStart()):m?g=e[1].length+1:(g=e[2].search(this.rules.other.nonSpaceChar),g=g>4?1:g,f=d.slice(g),g+=e[1].length),m&&this.rules.other.blankLine.test(p)&&(h+=p+` +`,t=t.substring(p.length+1),u=!0),!u){let x=this.rules.other.nextBulletRegex(g),b=this.rules.other.hrRegex(g),T=this.rules.other.fencesBeginRegex(g),S=this.rules.other.headingBeginRegex(g),w=this.rules.other.htmlBeginRegex(g);for(;t;){let k=t.split(` +`,1)[0],A;if(p=k,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),A=p):A=p.replace(this.rules.other.tabCharGlobal," "),T.test(p)||S.test(p)||w.test(p)||x.test(p)||b.test(p))break;if(A.search(this.rules.other.nonSpaceChar)>=g||!p.trim())f+=` +`+A.slice(g);else{if(m||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||T.test(d)||S.test(d)||b.test(d))break;f+=` +`+p}!m&&!p.trim()&&(m=!0),h+=k+` +`,t=t.substring(k.length+1),d=A.slice(g)}}i.loose||(s?i.loose=!0:this.rules.other.doubleBlankLine.test(h)&&(s=!0));let y=null,v;this.options.gfm&&(y=this.rules.other.listIsTask.exec(f),y&&(v=y[0]!=="[ ] ",f=f.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:h,task:!!y,checked:v,loose:!1,text:f,tokens:[]}),i.raw+=h}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u=0;ud.type==="space"),f=h.length>0&&h.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=f}if(i.loose)for(let u=0;u({text:l,tokens:this.lexer.inline(l),header:!1,align:a.align[u]})));return a}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let r=e[1].charAt(e[1].length-1)===` +`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:r,tokens:this.lexer.inline(r)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let r=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let a=E2(r.slice(0,-1),"\\");if((r.length-a.length)%2===0)return}else{let a=F9e(e[2],"()");if(a===-2)return;if(a>-1){let s=(e[0].indexOf("!")===0?5:4)+e[1].length+a;e[2]=e[2].substring(0,a),e[0]=e[0].substring(0,s).trim(),e[3]=""}}let n=e[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(n);a&&(n=a[1],i=a[3])}else i=e[3]?e[3].slice(1,-1):"";return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?n=n.slice(1):n=n.slice(1,-1)),SZ(e,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let r;if((r=this.rules.inline.reflink.exec(t))||(r=this.rules.inline.nolink.exec(t))){let n=(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=e[n.toLowerCase()];if(!i){let a=r[0].charAt(0);return{type:"text",raw:a,text:a}}return SZ(r,i,r[0],this.lexer,this.rules)}}emStrong(t,e,r=""){let n=this.rules.inline.emStrongLDelim.exec(t);if(!(!n||n[3]&&r.match(this.rules.other.unicodeAlphaNumeric))&&(!(n[1]||n[2])||!r||this.rules.inline.punctuation.exec(r))){let i=[...n[0]].length-1,a,s,l=i,u=0,h=n[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(h.lastIndex=0,e=e.slice(-1*t.length+i);(n=h.exec(e))!=null;){if(a=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!a)continue;if(s=[...a].length,n[3]||n[4]){l+=s;continue}else if((n[5]||n[6])&&i%3&&!((i+s)%3)){u+=s;continue}if(l-=s,l>0)continue;s=Math.min(s,s+l+u);let f=[...n[0]][0].length,d=t.slice(0,i+n.index+f+s);if(Math.min(i,s)%2){let m=d.slice(1,-1);return{type:"em",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}let p=d.slice(2,-2);return{type:"strong",raw:d,text:p,tokens:this.lexer.inlineTokens(p)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let r=e[2].replace(this.rules.other.newLineCharGlobal," "),n=this.rules.other.nonSpaceChar.test(r),i=this.rules.other.startingSpaceChar.test(r)&&this.rules.other.endingSpaceChar.test(r);return n&&i&&(r=r.substring(1,r.length-1)),{type:"codespan",raw:e[0],text:r}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t){let e=this.rules.inline.del.exec(t);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let r,n;return e[2]==="@"?(r=e[1],n="mailto:"+r):(r=e[1],n=r),{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}url(https://github.com/t){let e;if(e=this.rules.inline.url.exec(t)){let r,n;if(e[2]==="@")r=e[0],n="mailto:"+r;else{let i;do i=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(i!==e[0]);r=e[0],e[1]==="www."?n="http://"+e[0]:n=e[0]}return{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let r=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:r}}}},Mu=class c9{static{o(this,"l")}tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||jd,this.options.tokenizer=this.options.tokenizer||new UT,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:as,block:GT.normal,inline:k2.normal};this.options.pedantic?(r.block=GT.pedantic,r.inline=k2.pedantic):this.options.gfm&&(r.block=GT.gfm,this.options.breaks?r.inline=k2.breaks:r.inline=k2.gfm),this.tokenizer.rules=r}static get rules(){return{block:GT,inline:k2}}static lex(e,r){return new c9(r).lex(e)}static lexInline(e,r){return new c9(r).inlineTokens(e)}lex(e){e=e.replace(as.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let r=0;r(i=s.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let s=r.at(-1);i.raw.length===1&&s!==void 0?s.raw+=` +`:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.text,this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},r.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let s=1/0,l=e.slice(1),u;this.options.extensions.startBlock.forEach(h=>{u=h.call({lexer:this},l),typeof u=="number"&&u>=0&&(s=Math.min(s,u))}),s<1/0&&s>=0&&(a=e.substring(0,s+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let s=r.at(-1);n&&s?.type==="paragraph"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="text"?(s.raw+=(s.raw.endsWith(` +`)?"":` +`)+i.raw,s.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n=e,i=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)l.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,i.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(i=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let a=!1,s="";for(;e;){a||(s=""),a=!1;let l;if(this.options.extensions?.inline?.some(h=>(l=h.call({lexer:this},e,r))?(e=e.substring(l.raw.length),r.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let h=r.at(-1);l.type==="text"&&h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(l=this.tokenizer.emStrong(e,n,s)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.del(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),r.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(https://github.com/e))){e=e.substring(l.raw.length),r.push(l);continue}let u=e;if(this.options.extensions?.startInline){let h=1/0,f=e.slice(1),d;this.options.extensions.startInline.forEach(p=>{d=p.call({lexer:this},f),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(u=e.substring(0,h+1))}if(l=this.tokenizer.inlineText(u)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(s=l.raw.slice(-1)),a=!0;let h=r.at(-1);h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return r}},HT=class{static{o(this,"P")}options;parser;constructor(t){this.options=t||jd}space(t){return""}code({text:t,lang:e,escaped:r}){let n=(e||"").match(as.notSpaceStart)?.[0],i=t.replace(as.endingNewline,"")+` +`;return n?'
      '+(r?i:Tc(i,!0))+`
      +`:"
      "+(r?i:Tc(i,!0))+`
      +`}blockquote({tokens:t}){return`
      +${this.parser.parse(t)}
      +`}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} +`}hr(t){return`
      +`}list(t){let e=t.ordered,r=t.start,n="";for(let s=0;s +`+n+" +`}listitem(t){let e="";if(t.task){let r=this.checkbox({checked:!!t.checked});t.loose?t.tokens[0]?.type==="paragraph"?(t.tokens[0].text=r+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&t.tokens[0].tokens[0].type==="text"&&(t.tokens[0].tokens[0].text=r+" "+Tc(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(t.tokens,!!t.loose),`

      Q#V*-<*n7g8c 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 Fx#aT=6MteXp_0b@3a$RDYHK#4x2?DftYABDCs> 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 z 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

    KfY79hMhz)*O2F zr~Y1$0cEYap+wSkuqxM8pKQYnDoR(v801O{8(38i`dTGV&X(9g&)F%-^FADZqwc>} zM)~6(tYAQPBl<|bhI)6K-;A;u4RC}m+#_}6$7Ba4O;+eGa4zwoCd>pK)iQJTC9x$$ zRuH9Spij9Bx?*k_w7)c>>Sxh`b?Q?!Y1TOHdScf*qE z8*VH=XxXx@tDchR-?<9v5Y?$QT=z{9%b&dzSj);jRR{rAuEc(DNHpluELd`(l!gQ< zHq=XwI<9Nvb)V~jq-TNFKRg9pBV+gn5>_rIMN=%68j@M9n(Wu5(O1dK>#gbkgtPmX zlm~Pvz<|+U4Qj)YQWv5ukHijF6Wg-8`yxUFZLsHLjXS9-6+ZpL?jALS<%Z+%{AV?R zIJ%@NFOZ{8X`Gx)-uga$^9XA7?Nbt|coTlB=Eh@@McsJBUzA)^V|!@?7Z|dmhHuQf z;dM%{-TN$-UvtQx!LxL&3}my)P1tHTUQ5|^#~T{Y59m4kd4KOOU+9?%!btm%&`bSd z{EJy5?)!&A0^eJ8pGuAS!ud!Zn7Ow@Z@9Q3kT)|{%U@0Dp}Ruq4XR1z6unvFFN+`9 zDbwF7aZi4+*PJLCW9dq629%cY;q>bcVYOd13$*PhJ-QjM>lJ2w!*stU z>i4paI+(rN@O1xaT=t;m(=G$zx9@DD>;qp@9M#>9QgFJ%->M82wtYcrQ5c^Zeu6%n z8UjNJ?r1_gXPf_~8=`VOe3(>AeozOwkA~V)?psYhiy7=0bF{c4zL@}vPRT*`2S{9W zLb7f6Zz8ImJjoT#*`@?ZPUTe=26SlZmy7$9>x7(~1`t1mTaxV{UN$ z;cgN>&Ml%k{G{)t+5I>8_ti^BhehX-inMA_J8j~}K=|K)^f$Wn6Bg$fUFIQ$lf^=p zhM`3>4yryLyJV31uB$>{?+_G$ zQ*&TS8U{V{*wTNUF6i;eMd$M z-SDE3MgSk~vXQuBQ{<~;T=S*oNHs(M0Mn{*Q&q-l z82|DI1%u-G9rgJw2H0L>pzr`@pN=j4&a+S9*<$nel6~FS`&aXT_H&*+m9f}Kwc$EiHF9?%gR?hy#@i)2~F1olN1Vy#)c zTo3()v1I5?Nxo6HLBV{s=cVjCelMj~;Vt zrqCA6qRb=4tnV1GZkt_;N0U3e{56B0oTvU!IrKQxR~8V>82?~9$Ws;3T(9{p_GC_| zMd+BO6WtfQsOhl$GXz8bS;-kgf+m5rnq2Ei2i=_e!K@G^ctTu~z=VvUHS5@TD-nwb>+l&2ghL^pnWQ;G3qytHuxQ?5hP1z56Zgw^p1hw_( zyb`nq-WbEPUVQiFfPCq`jWCDL`~z2 zK2@iIi|PIyXe(((V%)E6hPJ_0N287#|9qtP@DC62dBfBN4}hBV50Y_$)VC8xRZu8< zfT}Pzw0v{z!{gLg?!8;Q-_JfUJ3umk?=cp{f~EE%1V*DMJWwe*W(1qJ zo!dyMA~8Zt_O2qE4A#4D4$qg65C?z!jy5R4Ef^?JXJ6BUJ-HinR5b-%+TJ+?bY--2 zP5?YX?cIDJEVNzx8|CUL(Kq{@Jv)k5Hu@U3q76hfOU_2zvqAm- zGn0oLUc>qi&ECI?%4(oC|)FA^z7PEvN*_p|zS(E)nTeamyxo6IIo>R#fuIU9ZBCaZk(5lP*EqEEyLsbKucF|e){unRLOv!46TlGoloCpmA<4k>{^A0IeD!gBh7WzAN_{@X{IJKE9v@pPb zBI)0&=$vlhg?~a;){XDLt~%pb)DLIly|rl23yvoQi0URsgDOYJRuw`V4$u2bF8Msc zy|7){ekoC*rz`Y&f+D5rq#~SUxg^@Ny4;^U&bnVrl=D=yRY4-JDzi9Ss?E+A-!F~2 z^#0rj``PU!QiZNAC+7nsJyE31XGTIG(_Iz&Rp{bh$)TUC>8}eKYVr6y&9H2FmD)QG z%Ht0HK7o+?1|Foq^*s?FLogktcmLQ0o;syHvksz)t^R|~u}FXj}6IGP4C!534fNZ@eVwBm8Q`7F>>XcN2kvp=252_xrK81O_f6|1-mLv1AV zN;BEWpt$o)rGT5n+f2UByQcBt{-N?YLSz-X%4Br2Op+cWf14m|S~ZB^YVIFn{H*Uc zy~;)gRY$;N+s}s7=`rOdL^ADJtA6dV^mNs~A;gpE(6EdgvX*leTH1n4*CPGtL|(Nv zQ~a(?Ig)@Gp=1{GR0A?(;@D$k6pAF>zWfC$Be)4Bfg>H2GNc9i#z5lu1NAwkYJR|T zr%7&>sSfT@@pBSLiM~p`!wi}uif6@qX6UMQR8FkLUUN@SLZInGK3sB;*HIt7qd|VB zB)rn0XGUo0&*hpD#xf|k1gj~PETrN4`ehL0qWbj-n)z7q{Az|t-%lc!t*93={4m@1 zQPTTJ9s03by88qVdt4mb{;26o=8Ec$^Da=ZLGLpqk2y~??tPg7|@HKI&~ytC%u-948HmG zrV63S0j9(s?)RMHAwA}NPL>TaF-=U5Na-P#<`!+FW%6?Wv;R%k;0-t&3IcD@#i7L5v6V8T7)=4W z<=aG|kfqzgMbO3lc zY?!9P4b8MNMDcGJ=63hwW|jW}O!|B)^`V12u}DLFZE7iH>nhRX5(hu6)i~Z22=+*i zCw{EwRgC;X=*)O4`8UKQa{_%$5Nn7wb<7nOg6CGmjKS861oZ3Mu6b2d8`M5Gcgi!m zCTKIOfSOHo5Hkdc8glS^w4O+`#uxYs4?p^csJRbn`&ul%I(q-+zgDD?;8WdQK5^*^^tKlL+mTm z6-9ho#`EYk1-pU4dKr2n-$4#k?PU;xW`Y9>R686$F-YJvzcye2XX+Fkfy#g$;2xvo_4wKvstl9(7~%K%yL zau6Kpr_6V7_0V`3BRz+?M)Y^0py9eN9c+7hg4V#}PDjsBkzAC#Fy{byqmA0RygWSV zxBQ3G;=C`~Cx8aH6W}~aP1T>DV)KyYuI$O=UVAnpvee$Wg8n^;FeIQ>+*RK7J5a>!h694#RLQmlxWSGA3u-{X0(>ba2oyWoVI+r>ygY{h< z<*qd+Fq8Iz*I$g78uMLu<2*;J{O8rCJ||%B=|R8M&+lo}{^)i5eR|BXuBL363XAq# zpc4`7=8PObY<#|TU$RTUs9J8>o>z!OH>y{a=LHPPk_JrLs{MOg&m>d}R@@0ol~pgD zlJXiJg52}ZU9$DaU`HY!jTz?wTjU0upBq8yyJsqEdu9%Ymv!idpm3iGDn*mXe%kSN zf|S~6ZsBr0sflL@0~;=4L`VA`f)@ zZ|Dp+yBqeI@WT|}m(>ZrUP8}op#rB?O|Gt)*$p|n-CW?Eo3raOpftbdJOxa8=6(;i zWtp{edOXi}WJL*%pU<%Fc+q26V5H>pl+w&Yswqsb&bcz)=Juj!^c&e8^CgeX3X0Zi3R!Zqhmc&A&H!V z!u3_68?0cbpbS^7inqoq9UmsQb6XbW6;98$7+kp5;t^9Q(qU>J(P(eVOJ6kzrcQE% z9Dwsqj7)pWfp}84pm98%^E}$*@gpC;rmG#geyskMfk=P8^l~X)6tnA6*?Q3#K?4cN zfH==BC*A;ct#kjvKUIFzGe{I5p=Ews*DBp=iZFr+2bO_kTI2c0=m?|wEme1O=gvB} z0Oxm!V^~|&4xRXM?iIl1A22fTngo%1jEd)Lb?Y4W$6G*L(t1YFU6dY z6_EF%Pyk-cdN*JRm1V{zjUPeAMEo6oEgn{u$R2*X&o280ErZ7XA_0Yyg$HXFCz@>C zf83NkPH!oqeYx@At^1L|hQaKg3oX}|D|x0bB5jvJw21&20Juvftgo%3H#sLJ%2C>D%W0p}yCTYW& z$nr6yEEVv-MF)epnrVo6E6~zK85#UmA2=6}f}FWEedeOJN)9+S>-Urthf3zt;c5E$ zMSK0+Kbdrx3c&jW{J0;S8@tIHFE528K(@XdX}rjrZNgETO-#Okt{`NWoIB&#W=^gW_YndVSTENEXi(xX_I>AqQj`xjrt-2ev}wjHN(uQ)CO) zA%jX0lHt!t;@+n~RTU=EmmJo)`~gE;9L8Q5n<0jO4t*Mo)S`iq%kg?uV4aIHowRZ# z^ga!&q(l=`hX57;IML+eTLrvLN>im&Byj?{V69bHRn$i$Ce9Fi)8F4`N*)HMXfRQK z2UC}~J(RZamK+j8CKB?M-*G;e$8^|1S?*CeytHnDq>nj};(-ZLq_UShoh=bEp>p_R z(_pp(_bvg^D+k_=QHiAI5gA|ok&ytXDAo|GHgAWof^g;$(j;C_cpKvz?a+-ipk zVMGiP*7DoWR8HZGr^s=mcND+~J|9fu^3TZ1JsCR0k%_SEh)R9SccQXg!2^^`mI7Bq zkOv9!M2>p=kqkOwFHgzmn&PRH70lqI-Lpu?4&t;-FtS2+f=KK(hJ-TFQ$S8N4++YI zntvn4bP#DDWgp-VhI|8MwV$C%SqK^p(n6Kg$_=tMIm$!SZ2IQka*gHNcIcJ4v(IuC(u4jEkEJV2lp#bdm|HM#QD_LKT71BLVtaVu*X9>ZPffu z0!xsv>nA_D;yh`yM47KX*TLp#i6F~m#C?Ekk76QD)X??-iP=ihaV)5^!Nuhh@{aHdJQMExuOAib=XC3-!lORxFJ()ZNwm!zb@A_x){=Oh3 zN(K|pxl6a@0BdZ1_EzJkz*YxnL?s=t?l_SnhGulqPJlmULkDet%EVrg3OxenvSjhz zApz|6zrjw9*e;14b&}ds6IJR%=emb9Fqdy=V{NWNBUmAxc)*+D3?u5_;y;uBiJ0)r zhdb1IJ1rTBheR)PaAWW4tb*3~CFl8vmeeJ|1e&}DL@PuAw<-prfzQ#zublhNy=wn^ z&go!Iav~Yi$8tRU2^`2m&jLBt))MGE;?5jtwmEG6lLXRRI?7D-5tZX0&{7SAzr<_e z70mB=BK*wYC*tTQ4~r^jf0&mz9ac%R7!N&X26op0A0<3L&f!7M?Q@SCfdXPLe!6ntY+W2IU+Dg)CzEy_c-PQJ^L&H zeU2ipO$E^fJo~vEun~bLyREo9gcNJbRttC|Ein5Ul5qFC5}hIX#An@A&n!K{nOMl% ztsD!w=Uk^{IV_B@ic`Mhqjm>hed`h=9#R|rjEs*4XYeTHkt9fxSzL+qw-WFQj+pRg zLN63!tH8+-&mJP*h@Z#B+dl(sIyN zmujbJz`lk`)9S#+kdMwRVM00P^5`oWF#d~%0W%k{qXeD?uUTNMPlA`osj(-(?n_1Z z#v)|_ut?JrEkKKOzL5TLgf3nw{UHgn&vcpj4mK`Uh-I1g=21-sSIEeJ%qyKgN7%(R zK(z|zDcxtpG?q>0ebicr){$qR1oY=zP$ez2h?>lti9-ky{O3*ZSrYrSC>5&tqJ|Vh z17fHORDbvASCPr+@yRMC4nK8D&C`nWp4RY0>lN`*iX{RAkA+%FH7{S1$A@c^IL@)o zoFt!8T+5WLJb2o3CZD_MXc3PRznepqYUlw)?R1yK*IlCda+0FQiF0q=R-tf_Z=jgA zGm$-b+@;(VNna(R`Y*3o!*3uaEB<5fk(QcF1L9|;!42b8$|g74^$M7watLMnUVY|a zS%P;xRq)?0uxhP|+U16Tu&6g{N~HBjuha8igpEk^ zwfACw(+g{e7_AMGqX1zm%5%r*)hur!C++l%cjD)nRE1II3(bm?-uvh4&TPo4!>(TY zJIJ%TxZU9&OBWpAc6Fn>asmy2T!2ZPZD!f zBoPVZD-+QiC&~^dU}h@$4vqonVUB$y|YD6!$T!dVFuWeYe2~B=t?m&9@xP zuGCEW-M>V%lJh;Zksu7?Cy8^pf75^?lIBMKbj|>VQC>aScGoIX*=zWa z5fX&XyYbu+;KJWk2|p?!3c&kY^Jni;c!+~7pGa_)l1a7PnF3xY%U4kfcVsZ|_c5!3 z#j)W@I{_V%4DHVEA=?TZAjGOW3@&cQR-h^=E&iF}ls>DsnhAbhD5ktJT=d9lgvrta zZE%cP4UeIy1Bzl_FT*)3Bq4x@^;?N4u8N?lIVmU!9FU7($Zgyu`N}}P1^4}~79ZLk zGxNsl54G2MWoUa`Gx4f=-iPM|ig<{`TieyL1hz|Ppih*U7S-O$L$HNxIXuLkiR@%f z|2i<_=;V%nS!ynD{@AjsIh=qttlt}?-}wu6NAF)z1ze4<%1Vda{>?(;cO6ugGtAyt zZioJMzI#UE&x)L`-D4H6Zf!fIcRzh)`VsHccEft_!DFodOlCUcJ$#WO&UhVH&Mtb6 ziQJ1nUM~)NRQ+M_>>eVj;VmpA1~-)C&yUV>5MRnt3puE*WAr3`yRo!fW9h|(lh8#h zvCb?>M!V^XBk9Col_4Sl>_Phkr*cSjgaaSdn)BmGj8nT~aIszC)ngwL`9O*wGCSR_uXB z`!{_1+I>K;Spq;kvkr~=hu%T4_MDAO3ZJX(UUS6y@STDzQ3^M{2FT!vcWVWBj1 z^gYj>F)cEFkWby{mjtaEt_e9ws;KY*$Hq6(4+(8;B`9M}gvD zsn>;E<_Molzukbi@Py$w4BwgkP#}81?i;J0I==1rkCAIRapF4iwARD&p{S**=O)|d zj>rByR`nBMDhm4uw-;B`QifZ)s9y~KQ4ptU*-i8~wr{J9UfxwDRvv)gE=uQiNA2nT z)~@nXTb8$vG)HIKBu_-d6w`;zH)KInhRJ>0h|91WDo^WFeUtVWKg}f z6^XZgm@9GO`oEDu1yv0c&BkQBMD4q0=eN3tj$;h56@mlNNhJ<$2M#a}OcKRFIAY zwWeixfPbj$oq<-{>WIOLeg3%CS7&NW-_rW|XBSaow(X_|77lPzb>@j1dXug6k?eYx zBd>eWUtZ5pZ-w*Ien=BZBNgD4n4Nk+_@D6D5 z?lJ>s=j!N@1%r9d2p&DCKLcTB!BnRu?zAENpbf!revR`EUb#BQ7y7tlFT>ikRM?%+ex|F(3$G5j+0xt^S>)D>?a{ww@j_`2`B}V=Oxd`YqZP1l~oZoxnPOHV*$R@Xfe32^9S5@)0DSFnZC0 zQS5$^mFA~B?Fqm0@r#qWlIsf=%)qrspum1uWaMQ!kQXHKL~{FKsFS}<2=T-*u<6Rp z2?2tS#YDTavlf{)@vt_=K2GD>JC%uJo;9#C(gCN!)ONV3n!T>HVxho!`+U%|+j&7Y zLbfhl2Rn22x+k%@&WQ_yMtZTYa0I_yi*6f!$KkMroa6v(NuZ#&#=<3zci(SDJUIOR zwc*@mgpG}Zm+x{sTLI)x<|s%O%-~ShG7>zlC%qbH8+htX@nYvd{f)c75~|9dbSA&4 zy2B`It}7Cbu4}q&xA#%LfHsrZZt`;2=+^5%+fV)FhQFO22$tM6dcbX!_hl^G3v9|z zDEH)RGKVVeh{|5PXMz{LaV7bPQ>VdCkz1hTU6B(0+qP?byI1afJUeXi>x&EHfZZIT za-5!JgEKh5eJ33MYc@>YHqQXIJ07G_*63&u9wPko!H^DF_oNoLksWz}p+!zaf-L*R zMh^zw*#)T+)W+Z^OfftQPdsH5Ecqr9O9gDf7?9ygM2M7u;9w51!GOSZsi&gqU8@$c z5}D?VL>hGknd90PFe#^o(+pb}W)lQHX_ap2AETChk6chcXQ{+YvyA&Im4@B3RC1-Y zg+MN!u$!lGa;GBWyh25}TxE}D_c`0>3+|O(rb+VVQ0r(zE^%pmmezBS&Lq#12Pw%~^+bbnD5D zv4F15v*18$__bs^GO6nws*g2+sI-e2WV|;PU?#>-_9_=MnaS5CP*-vq5W)#%4F_*M9rh_#NB}qU(i$TxFV^ zo-EiVL-7zF+Q+@6zJAI%Ryg-Pitwjshk+iJ)1}QpJVsuRb-Y~<3-)CB}MHd z5DVp)y85i24lUb60`lu4q;iS_Ea5(Q!O^o)b_YI{An`Jdl+%6C0m&cgK%3-X8b;PLz5Rk zXP%xKiPC>8^!u6E{LhFO?ouA2>)Muc$#l(13v_JBhJVZbY4&fzyGS~y*Mm(|wt@p? zZ;2}3?jeDCSa}cn@5m`Bb@5X|jkPFn$ErQmBY-|mok&p1{2A8HU26Vw5DRL>kKO&u zoox~$0AV@3@N0UrR88|@6P5L|fj@kZ{>w6_JRY}fc0X^vsUg?A{Dj3u5&J&{d{tY4 z6$xlc=DRptQssJewu*{k1{~Kva`fQ!SNH%3(8Gdh0DAJ3=!2RDx*roui-eGnI;+oAK`+N8fc#C+ zB385bEY~85K!-11{q}d_G8ERT38-OUx(M!K+o2y&4V_Qb@_%64VSA8R)~9mCbHb@HDPocbI7M{=f=Z{?~&+%8OY9+O-Z@dkQ| zzg#(jxrwEHu`i0b_;J5Ppp*^*^=Ly(17gxRx#CL}Z9$uJn!|DzRTX#fZx_~BZ*|WS zPb}^=jNjKD|536hY)yH4;HL<>tn!3&`m-GaiOt?a$L9;(7pV0t;xTv6i3nQv{Tb_Dh!xyRZJ7f19f?j|BZVOMFf{r`PCAJaB%$fZRk&S@=2);06skU<{ z6K!c4Uq5mYF!hf8DlOJ~$xpA=^(>jbTp72|8~k?^8*h9C>L`VH!MsUbcD;hc*;?U8U{6>K$n2~Beu(L8ckh)nIk!h^t; zYKiAmE{Zcl=8OPM^~kz9ZTO`#^2C0!}G$JFpUluP!;UsLmMGw z@1v~=4#=a5nCJtNK8Pl$%Gh%MCnQRC%SE&TIGz*cyDqiFA9%P8P-f9YASre4l!_d{ ze-XTFF)^w><#MW4Q*D5LPkfzV%G1hNJ_om&ZpKwdDW&BLxti`55XuET3LBar+nzJ# zV`&-SX!UczW=-N#YWe`Lsi#aVI0x+Bn%2}K73kpkbtR^NH*?$ zXdY78z+P!E-_&c~d8sZl#g-BN9BZPU_U)3yrg zHB_fdYUic5oC|*`GT(=C0vQj9q1W>Qw(XLtos^c0Q2V=fi^-l{?bmZE12=uL%@5!= zHY(6(F8p zvh_t}@x#$`BOrI{lD|a-Xo(230?^pSPUDmS}nTxh&(pOhU2Vxr|R533|cE9@BaTKQES%+OtlFe!35 zCgC)Iss^cEB(e%dhLdD^WlTgQiv%44wC#=ds&hTAixizcV=m^1mN-Z-%H_lQp4zH9 zE2rq{lgQZssS=hsw?|@jS4W3|de>?-Nav!?p8&CyC}|lTAxW$a=#Vo8#02fWs8dh{ zpE6Gt$?@^(6HP`-*gNFO(L=L0>OS-&2WUg5oTQ2yN$hj)Rd&Fy5vp*bfl0hf($9M7 zEp^sc((X~2P_SF)USsUzOhGMXKy=l~;u_o5nmNg!dwc3nKX`I(U2547NsMgbeHh5i ze`dR`*#Z)sejWn`V41#>Pn{(;ap!G}&kq*f^6JPoy5m0`EwZ{t$}eDw=%3dpYVlLO znBQ8w-O2oXUa4bU+{if3eFW4WecRy~6#noQv?3^DOmfTlfM|<>_#pfhD2<4WR*4{2 z5y8{0L{CYTLb7%CsSq4wIbTC5)BSV%mYS)!WjCs>LWbyowoU_KK8< z|I^tTF93Vz(-Gehniq{d?p{P$?f6hpR&08^)S<%Yx9Yc1Ps3JIUR^ z82i8m&AX&M{Va>Zp?d_^@xx$_Ze&}Bx=Z)V%1hcO+7pj_tJ#z6}d%{P}6M~J3PSN7Tf{ks4g2<8Thmm=|wNAVQe}A99 zxj`s7A?E1^R=#lJuXj1~x3=OI=or*j!lP^#R5E-JdH$LC05G{_KCGE3<5RN-d&Ins}toJ>toiW;+6(7PTfKF zFzw~U)?bQX5nWa_Y4QqsCj{^NY=_>|6x(gMYXl^+i~&jdDJ_4!Z_mM<9R2|^gZJH; zEh}9%sf^zFd#3(cF!*2yBERS;Jp7V~+z4>6F&=V0W8_s;F=-`R@X=wdMy01ctheI> zKKsfuPCfj}EO9f@ztjn9Jr!FZxQZS%#2-^?6WL?j+ao_h{{lV8K^SH|5v5>$O_qp=r z^GZ$rB2Cf{e#ngrLkIM_0fVi(O!r1cE=(oofk^PRn7wh)&TO6cHo4v7z}1O_s6li^WXQE?1BSbf^NlGPVT`=c z%xP$vd8>cSj8$jogL=?u`tcobtEWvy8Um1GW=Q@qmKTl^BtzkclohY?=byfH)WuuP z%@k(;2sJvg8iN(n6|8^UtHf{TpfKyZG7XpbrVbtz|BZr!kWfpyIJN20LLsmyfy`j-Ea+E&RuDl zNt-Xfse<^J!0}tyKNfTjlA;3OPabY{*bomAT zu|+=L>ybS4mi3#jxvgKXN=L-Y3v31O5k@cJXrn(4+ulArkI4gkMi(Sj{!!Dv(6UrN zadP>#D(Ko(dVb@e!pyQ_e1KlDpYySmh?>_VtgqAQ2hZ=~776X{1>sK*ufoE@f;K}P z{P+<|eB?v+QhTf5A4^EBdgMKvMj)TNY0+Wrd&jaomTs1$jz3Uw<+Hl+&oJ*9;jFh! zZ-F2;Pq4`YOFh0u!Se?Mt?tvWz2XkPd(+^>aR%#ppLa$b!jE}@!~);s*JwXpz^$Jc za@tT{^HJFBec`>ixe#8x_s{uWO6NpH*#8svZG;+p=GKSUC5?542Ix2$CY|$q(-+#H zfV0uz<8@iX5CbmL*K%7-VyxLgzKyHn;DZTKR2bi2XRC+NWVI5F9kF}7wVyRwzaPLC zlgVo+wtPftz4N|ayfsV^^YK>Udh)GtMg11{lbGW+uxQIq3=O0=`B2*XvnH=UPTuGJ zir(z50I`pz=U&^#P*U`wAa@?|-YCU_e?Mx^b6U%~6fpzw6tzcLepXxgEEs%7dF%b* zFz|-O7pMs`k$eCXq+R5CRI5sOB7{wr#~;>+f{eIsz1Bc_1%a87Phx*<3B;H7U7dOs zzU{Ax^kqUgudK;$Z{vc`qzKt36pl$+1tqc&##?KJ3eW7aFc@9l_hIWSI8gfjwOU;8 z~%)9CC*;qNF5krORRarkGjF9K)A32U&dU5>ZpXnKA|2(GOyV##gvxrmdcxh4J zQH~!vS1}u!7R|K~ow!|ExS(4Q*!3c&n?TRDN)7%3ea3GO-@26?_e(_$>4Sj~p9~${ z`Yvz)N+CF5rApsa-`s;n&L1Oh&+!9qyaMy}fAa-L3AeUF{J;0!{+$TG^m+WFGILUN z_c<$~3+JM(8}=Pck!M@KFC2u)-<(aovZR99^6D9_FaP6Z$X+IJgr0*k^BJ1(2X6%< zlYd$zCAyU!_|A*!22IVtG16n0O1tT0eFkHXu0KD`6p)n{fCf2Y2>?WM*75E9%o~#& zf>D-))6=(R`Ld^5yk0(iccNI?d#c*$U&tU4g=+i?u*?9kiUkT6vSOlWWh=Am#0$iW zUkS0Sah}^a-R#sA_-wT>QBl7v;kZS}!SBMVNg2g2>v^%Wpo@|3U@>Y%8!3nexV6+k6sp zOyHeI>tzQ6!O5DiFKe$Be_mW3P~=5>B_(**fwdgBhm@`TQ|w~M>|pE>LH)t5i|=2* z`W>+)mlmh3Px%g$iBZtIZR$Omut0DqiV}T&aAp73_b)s;-4j<~cBd!^b&X@Gx(s{* zNUsw|tDqbZ^Mj~p`A)I~6>0MZfwm>$lT_i#IlNGD+jRXpfgVr}hfC9+uZJSD5vkQ523ryhAuEQM^CnzRDh1t?@yG$j6J$?e9 zrG{{qEL6rt{n((O>9TQ7*@Am^ck_NOny5nNQRM6)Kef>Nz4OgVkbhwXB=d!LnW2Id z@#0imZ)RHm0&7*MQ{=mLY%T5{;y`nLw%|^b9rc(+Am(>`)m7TZLr>eggmtxY_AWC| zTmwfkQz)Z3`eQPl%rB>DiTvU7O-OBnlc%iQ@GzlB$uwnTT0yw;`6l(N+2W;F3IRyo zJLGM#U7;E0ka0FRzG_{K24Kvf&3_?-cTTHiySxB&-_J#yjh&om&Bp0;$pUEVr=K(i zU-I@pV&G0QfJ^jLq({2^^K8uVTIN+L$h@7Fr)!3RK-Ak;qsKr`3%2?|Tsdapzr2eP ziw&HIeZ5ftJbYf}U&vtZk>O;flDA8o^_PDkg9~z*bv>-bQ>d)fSO0+w7LKk~_J3=h z=ey84B=DO=9i!>H{8B+yy=z+xKjzPM8NZ`s_#pOoVE-*CB{V10SCu~cY3g#&;N|Dn zA@TCjjRV&4-ihd814uF85n{-&= z_R7)zbg;2d`e2%ewJze^B+m`-9jU&AjEU3I&x%ifdE~Dv$lI_+ah-9v?LOH$KR0 zI#tES2iyM>A8h=8;Da6i6Fzv)v$@N+<&IBF&%X)6OP&8B2nAXOEdIMc==y*AgS7sK z|0W2p^bP*+2*RgckDdoUn)MlHrO^M0AdGqWj`1G^VG8SE8tdVI zDTI%n+#H{&n);VQ*f8__*0cHc=ZoF*uloK&Axv0!m-OnxzZJri*3_ zWOc0K)WfVYgG~JC|J5J-<0Si(s29GZ0HRhUCUf#j*^MzPhB!sd7iM2pA$ewIK602dX}YBwk+DM~DV^wGH!Hc+D7#hAs~vh*vFmC30Qi zNmW?{bU{2;GVtZQ5)P3%r1&L;_#u?=v<90VTy8Zy9FuQEx*k(FODF~e)Ypgw#V_Ai zte;jfBc*h%l$Un;(IKKSYVC(Ai^HKPrjAHbJoc#Y^$+#avI|HtV=to{)Oc^Y!Qlg^ zbn}g7gbl9=!d)y$U!dsehJ0|+Q6eI>)F#vg5scgY*bYDKfoQuaWfXtdS>?j53)y4J ziH*HystZt;WG-*sPL&Y6Wh)HjeckiPHu+{8rtB^jmiO5v;BK`gcsTrKgStK!<8k^I zmY@3IFiJ4=w+&3XQ=c%9YR~&HEAaI6C@G2Btn88xLPpNI1zjMv*fkGk3?jG?yg z&w<38(V1T-q}071auNPAK-|#B7ODv+g=fCH@Ih_Xo|r;Tr;&mw^0&=!6L`d^S-Gj1 z*naxHJv>BW?b000VU{2&Dzo$qD#g+dn->V*HDCs>U`$8-Urf%-dk^WdhgE}gd^8jC z<_B&)4|1PQei0|F^n(=mY5um2u*C1K)u*T1k=)S_!yw{GmX=Ygd8`$!730&^DLv)o z5#N_Hy{C;M%j%}WB}27N_O)CtRk$0KDU;jldR&J3^YbuI{zJ}l;@;q#Ho*tZlF`e1 zYOaUJW_rI3%O@C2owuPUZcTc|iAV%;z7m4ze-gOA3q4h7So%!byN5K?aa@#0+1C@~ zy7c1W-%nvVuQz8sz~_H`iF?tO2#|(Anyx(Y9WKL(t9SBI`}8Ob)KX%BruWcp8KFE* zo0n*VJ|7qftKfCN$m#?x^ejF1fH$SOB~-RqerJCF~!e3z0{^3eE$_}nl(lhd6^JT+S$$t8i0I- zqJ+78l~ZygPUA~|6r(2a$tA86q89jvy*;0ED-81`)}{wWeevA&7T(SaTf>zWbVzuJ zf#~WqTyho>DXg&%0%}xM3D0(j-%*n%Q~IlzkOS5LOh85GT>CTQ?$sAwJ@C76 zjWxW%)o;yYra@W~;PCI6zNdCsP%arp#etekx=6f5l1eRDOQznqh?>TL*MQZSiF+F* zIhkGY?0}e)#wLvfJ?PV_3=r3<@AZ6B=*rE*X(D1oG*&x*6VJzDSwuxw_<-gVaTLbq zVrN{r-f2=|3B-m#MUf9Pz$a?XC&ypru~<8{{aX;~?d zy3=VYDQB*gX&&BzYX9Kfz9KUqKgUcJCVB2-6J31lwcP>$25mB!S?&xKR_zo>aQ>X%hqo?*o zUw(B}O{s^sVL*&}1FLOng%`3;2wS{x*m+Q}NtK=FgIP%}=1=F%nU@j`vIeEFGVkq= zm~I|$U?oKbd%-J1T*Q2k)+f!uXOF02X(0)cZwI<~H(e!mr;~-%hPeZvZKhvoN@YC* z7lgVENfwRq$6_2ur`;1MiK}MX^Y)dH3Ll9r)^ZYqV~|odMhJY&r%eeZ<*wIDs?k%$ zO`NpGy+51ESVJIz{Dd%l#(^6@u~#&%1b?h{%Yee+oowxaV!waXFYTXuAyHAlaZ{h* zv(bH5Y?$l%<|X4kbj39b`jqzljriOH%6cFafUFv&}4>0YlIkGyu8DiKJ zcFwf$PbElUI%4*N4VZa?*TK?cxB=m(+N@4}W1;$XwBd|t>F=*M&A&vepAb@s2o8Gt z-OM4!jpIifS7qu{p%=>J^;rI&kOca6)I#mRV5;tKS3f~Bo<7M}A11g0<1H#M*Z}ZqBjh)Bo@`K*dtSc)6G&Lr*NF6|P?0dNlvy z1=q{D0%hvm-`ory;;l%-1IN^D2K0Hih}m%RZ)&1ahs)cBwjqg;Pq`-@L~?Yl1H1Qc zt(y+VFH5%ly6|YP94+czL%uU5W^ef|YoGP*h;%AxYw0$p*RcKNe+4(Q!n)I~MldQG(97``X!QF=^^8xlkg zTE6&2Aaqfea3be!`s%@!Ag6En9y*HQ{iHCyY~a3uD3lY!)Vs3P;f*a0+%wKx4p5M{ zC9BQ%{KirZm`8AkAA^{O%KEPy5SY2x-$epn!ml80ATeq&h1LPF?pk|Aba<|J`5GTT zn_9vn(#R;mF^>m0m9AhY-6wvaB4}ZR@3xmet01Z?CBb(TsX&So3kHbw+$7y%~ z3uGy-Rub5(ma-fxK7`9Xx)saM@950m# z$psK%DL7^YRQ_~we=0858u6?qy<$zf0HgI#Cb(laH3xt6!8-O*2-M5;>Rco)D<@D- z8Fc2S`bh%9>6999CkqZj1?QxfC1iCcXE*7iF5}abCC`r6Ve+j5BxEwieZ%*B?Tz9= zC+Hp+WKMv)Xz?!Jjt3M}jLFYIT1)Cs-<;QYXW6vOLp@jP+4N35ELGhn*i4D~=$;=+I=pEKwoEG3osL zG?7C)nZ7gbX1_`t<_V$8*VxpcAp5~I4gVxqT-z&fwH3ORC}37#7@>Wm&{`&kjxZ%d zL@BO(ZSm3=Xb2G5{^-VqT%=h}>U2-K*H|gXjCL9ZK_N4Q59lDKZ-~nb|LrK`v-OhM z5|M}b@uqF*9!_O*epb=baAPt=gbvzC0|{D}yG4R2Ij{&?p6O`Wpu6^1ewn`Ybzq_F zrU5FCc`}}fh{T*pWg%7bJjSD#{_&)<(2~idfV+MbleSj*m`b8~MaG8;-x)#(CB?uU zd~vy4()p@Hbe@!m@T5Z`g#=?b=5IXpBcY94NxVs(-@URdP#19WnnRW1* zk;K#vw3HE}!%vDkq-pM145T&|_|}F+3So(K@b`jSCVspKfPY7WcVHZw{ z21*S?=0ls(&7*BlxKMF$0mhtsw58M`i-}aj0=i^C6F|aCMMVLiA0KcKC_ZcllTwJ}sq)}0h%3KSatLFc zK}T*{22#D1q|s$2lZXs#&*3$hU?BwWgo836n}m-JF7{Ni+c(t%r^m5_3%wdqfHobT z$mqJXXqJ_VFgq?iWrqZj;JD>pRRKW6B6jn7YmOW3=0TC9r&6!c2tcy2NNPPqC0Q|B z01Zfe*mj(l1%Q-PNUxKktXP;y2V?6IzIH0 zFIJ{xoazBB2%s)TY|X>^mPxbYq#&F~>d$G=;ql8d$^$RolOJs+L8zEPGy@iA^$N~H zZp+8|=f4s3~LkmL&P%7$yd4m zv|Jg~9;UMVlqV;JD<7KSk=X;ol|CBt$w)sQw0e)?4$P2X z59-bY_Gdq!k*|2~^T>54utG91c8)ce$QL+&7T;NGf3gRagdLS@Km_ukyCcSwq8<~) zh*KoNgwMoYRy&;s8Hi9s3t@v8#dpq%zQX5v`^Kbj;j;O}=g)5wzskIJe6F?czqRJ z-|H#@n!-1_4WIDVGmcEC{Nx9P(qlBMy z6<<2@q3TxelwB6ksgVBCr-@efk*B`X1#7IwjKN`T}` z*9er(fBD+{bLLyP1p~tM{j|pi&=A68U6fAomy8-dSd*Zfb+`|gXD|#DWm5RMRPu>B z0k;%G^`#0S@O6*e{3c<~mqDzW!WTor7t`e>%e_i~)dEty=z>Qs_<*QwuY8!_EU-{T zI`Cb-Pa48%k4G8}DcULE!Y1KTwXkX8hpqF%R|#Msgheu^GI&#M$A6eFL$Fpr_|?yw zOJN6`zAN~xP|C&YNl<0Rm*e46Ocr5zru1P^UddHi&*Xm%u$DbO_WKCaFb-soS}L*dIxqB|T!#GT+-LK-aw@7I zPjgfsKor}SxI^@16m%&$-cvb9^PSyg&Zi{EbzwgehP9^}u>?pL3koZ_p80^0SwgP( zuecxqXObm@B@oPNz&_NOhOcOQ}Hyk%_JT%m&1(CF=_c!fwzkPq354DJR7Y%}aN42ml3ErdA5<&^xzcJI8yE?mgk{K+{ajv$>%E7|yA7!)#Y*dbrHJmm+S ztT?S6Xr=ja|FvKgQ{_s$W6FK!V>JkCS1g31FcY^2cm?hDX_cvKuNe62X*Yu@kGWp4 z*z_DZGI`&Q0{POr{)wRKVq)Eqe#PatW6>aXe#}k+twtksYU^Kqvrsv6+1E=)cjLC+ z4X1kGul9Xt|HZZcZ(IM+it35C4^p1oshO@@p}d&5PmB55`*D$sR1YLZO*)-8&CU35 zU*@6L?|A(xGy65`>%R-XMR7WtQ|TKQRgdFPd|E5hazEOW5io z0Jom(EjN5DhSowtXt;EuB5k$a6d=vL?UVv8`Kuz{sJnYgs!$dVLizQtjBkc|Q#4|dUXH!HmMVUMz6k!nBLSUF^=j9cV1Eehu!D!n(BQJ>%Sh2xag+vdyNoxR$ zS07nkaP5mcN|POW(WP2-A7Rm-%0vW0(4Hi=TrwW^t{*^}l2|C|Cab71@OtSy&*gXT zStRpDInHXE!ayNJK2<1n?^tMaQT zeqQmmf^CTT-3|F7tkhj0symy)G(>o$RXW)-;3l-VgL%y~)WkcAF|5uzAj4Sf#Bx*J zF$pvX{8|FtVww%YmE)_Q3eg;KrtK;jI|2Fhz`!(csCM|~t-LwcyPqs_l1ch-u4z#B zC#)JySS_99yhh8nt@XV3P~qDYrYK=92_^yC&H|HXT4pgN_NIb1`JkK`re#lOczYDTp*YR%Hv&l@n8D7IOHhp$hzY=F`kN8t%c> zzfpZug;pSEB#dL4-f4Dx{I+fve|-Mujr*F4v?DJUcu>Qk#-PMKsdw;M*NqO{pEg`N z`u#hbAt68fv}f-wP5@D;X}rm_aQ%r~S^K}Aekr{Fx1PhmdT*gQJb>7H+;EunrJmqI zUk4TBTzXz%#w<5WoX?;X?4HVTa(HO20_!6?9%)=SQA3MVUlz`j{yu;4EF4ye^%9lH_6^gF@oE6xrH{l zzPuZptIR%v2*2PzqH#9%&h!1dqb|F?(!5A%fc@T`H}C&CejoP6)!T)}@D1qaBhheM z8+!5?gzxZ|7LO`ye@xaG>&;-#wt;`=_Db&jHGV(B#g5Clpb|vDjW0hR&b2F{sVD3Idt{-+>+)7g{SZKTwVvpzb+%XkIz19lN$)R}2ECU%sB< zV8#uea3QwQu%f4OGn!xbKK1fNlKKStrb9hr$vSrx=;yxqY}j zfN}NgZv87QoIB2L!b`^j?&C}7>1#`Wzl7$2z%S9g?5}qIDP3l|OZ^W);EKY(^L%@K z;Ma*ys4Zdn$yfjGNlX9M{qC?zvS{+dlE2kK-kMdcL{O9U--R`cv)U!6Uap=H{CxzH zdbX_Ztk0>3{71Fhr0*md=Az9=mYYa9;!RyK!j4;wdGi@yk+33wwbC(~GpM$NrWJyV9Zm6Ty0o$&>&3PrwI^zmn zPeE^efzL64o(SxvQvTuX^5!K3k-oh^i_Q4PHW^olZ{v3A3(Tw9f}ewt-@DcTYA)Df zt=-k(*pkOw9R9jygBB>GN=W7~vJxn{H{LMx|yhpuD&PLCgfVU9f=qfYb%r{l4Xrv+U5yq=bl zp1k?4-lm?WCPDoBCy9&hdFgh%e!t)QnAHCqB7adje+7t!c)Z_h)q|RKc&E2BT8%^H1j3@mEat4~Y znj%L@U#z3ramQivTwN!hJBv+P$DP*ogUkay70iJgkRnK3uKCqZv4+`6wcKz6LBw%EjDY(v z@R`a42tEERI`3Ie?XyD0vz%5p!PCc2GTa6i{R#nA{wQf5#-q{f3C?NwELOtG7kXzM z7t~dD5>>KI);Wrldzvz~=FR(9%z~$?z+PGC#X zi#@PFSJ8`{l1Eo&UbMnIb6cIg+Fvk^4po~6wKxXJ{d=+HKwqxA=q}AOKh-7ZB{%FY zSY74V80&bm3jF;3Wgg&_i}eZ_aH&N#h?;!zNYA-@xD!=e>-@G{LqT3UxM?=j z%W5!} zs*+%;k8@lTad%{f)s=z&RXHL)J3`t) z#_XtK83^xg3yF0!1+T|BZ*M)%y;eGgniU1~a}zVe+Vi<`FKG|2wS|rcS0Ci+mVs*B zZlY^#k z{;9_WBcIz|IS-7UD9%?OsCgvsHA=Fzf^8^amlZ-S@B%9YWny+XkJ))cR$&ob^xAI4(q~`OVF$tli+p#E@9(c=jLH&3Vlr-}$v$=Jw0qVUh0vBuT%JUyPx% z)`9QJ(CPO|jsm%$oDvUijD%}f4?zIYJb)?vczMr#{em3{K93BqfVU5Bq^fiD zQr|W4nQE!fqTHYyF8%S!%bfXkrWxFt59~kqKY31v7@ey>l07+g?nF#Z>R9RmOeYm^ z)RBEmXBqRR!WLpaPDiiz9?4OkNetMj%!?k9l3o0r+_aHg?use8GK^y;257#r zFyVAY(@35$xZr&7;qNeFD=>^LP#b-J1QwFV^ePC7OZnVFdF(%o1*AG5b759GK*$Y> zdum}%UCmHoOg$6E=#Ad%be6TZN#i-WHvgKQF@52Ce5|0E<&U- zF{7+&1nD~3Ua&4H8`vJGoVae@EWaA1CC=p$IUiRb$F5If@X)JYlq}{UO8niY@c=S( z?sV_#?D?GqWv_EWw})!MiNuf6Es9nsEKVtLLp|&9AXiQpzn;LxRL^B$qf0cBCE48V z1^I(A@^SApIA-nu9toi5p=7Qpbs1(hxtL?bvYk^h!LtT^D-q&&?rTcEcbPA{ysb+1Tu?l3Imp`-q zD{LK+0TD7y(!X4Fh?A$!o(7mwpXa;q!joiGgNCcHo7 z0ZTeLju5lZ@6On{M-;RIW|RBQS-~mGu=UGPBSy?%q&)V+=XO_!Af*J|&Gj!B-Fyms z6sJa7X1U7%NFrP19>@A^%G3tP6;SqaeZiJ_D9&M`n*kW}4-E5I9jYBV)dvs%77MSX zMeLc2g}^k6Ez!h`=a%sG;_1oydA-$3?cgn&Ul4RjbT%n|GM$aKnqN!<^iGwyp9T{O zLZ4-VJ$4r;ynEUD5WnBwaXrgVR+Qzr>^qX});wOkl~gX}Y8P2C)muM``A{72t1F*n z_fARs2KVsn_Wh^17Q0lp&{yTYvaUbQrx4iz|AB`q0IhlG(INSbx4^}D*oJv1A(Ukk zmXoA5bw@|eLY?g`xrtf+d78YM4gSd786mw#EZ=+PoeET9Mw}XI3U7p%1lDn(OJNx< z?oBJC3`&Lqagrs?w?c&OE&`cy!adBrX)gPi1glkx?1MRzN2<#raxAIqi4|raKIuG9Lewu_r2{Ifhr9Vum7d8wD?nxR;OWj)ZhBnxp2)oF;nQlrqB9q_ zr zx(+;M=@*$h34EXEJY)^uP`$T+&onI=ydQZ9L0lc=OIPe)t`$@9w5ELod)L^hYK_={ajO6f*?yyU|PRiyZ=sRWa3|t`}dzP{EZac@^>MTqpg0-|Gr_R z9?-RvYmv^D13;h{sbrpzI+?L1kUc7iB*#Gfd1ry`qPb^6!^>tlUsuAJEX%!G$V3GfxY?dCPH0b~L2UpBO&zfIx zTU7dKPNw>)^76q+mip}kIn_oo#!AL2_8* z^jLg|&0PPbji>i?j!vlz?vU-YT7De`U`|*r_&kf%Qxbs%Lq1$vM?T<#SHK|}riQMhhwh%JL!k3X8iVxTT zzzhUGEQ#FHkbHwHrE${#&A`)pKD5ew$mmV6ZkB-w zSRCzSth-`zA_tH8Z?H=xspyd4AuL zUo+{bXUliuWBo3xK$0TX`1uArjQ5)>&v8mzQamcgLN2NZqXdONXP@j4BXEZiC59Edk3t7E5X z?_|c|QUoh+yj0p;#uw;>$ng?IgdhL+c?sdPR zAMr01zzJ&3sv19ChN87%>76ii4@yxwMLe0I5)axmQxUq_e)KzaRS1=B*eS!3kfBdE zyEf}qQQS28PHcRueg7Z5CS45!>n;Wv(AG!|JrH@!5%+RG-b1P!IaW^!X^<)a992@W z>3*hQQ4jM94ArC_%L%a!e~W$Qqlm9*lN_bO=&{sKT1It#(9Orgg9y>34!aSXFVQ$@ zDcA5lo~L&&AEUuz#gcUQ;^D`tz{_K?%>DHne^A^`Cj9qrp>bO?d*LD3QxQOm&Tn$h zsA6oU`ZdtjB8km|!(kdG;>E3%=jfeKaI#6dVS>lQ-jO`r&br|1S^Jf*(t18Tpe!?j z=8rLTQ}!!gb4X$ewV+<5bODzy3^n^G{~fPqa=`~4=F1y@1a+`3q%%SDWIoim5h?SH z7mwh(_eZ{x!5xrKR0}2J`mI2@#=UwO%aAsZ4xK+MLOB<5QG!=WL?_?`8uX*_S2zS) zbJ#_6>6yk?RIeVqeqyM;_WPAb*+Nhn77wgxcBvuEnb0fWD9DQrO4PNf<4WbgJSDxG zTOwhyEIvN^OH=~vY-k6Pa>*!Dp6*qE0h2kv&@+zCawr@Qmf?dk%{Nr3N$`!xNquCp z72*tPSpQ$&d$K#J+q5s|tYbe4H%dE;<}cu%Q6PxA?%sbB*dh%Rs!8Q*V>q1#dk2Fn zDWdHtYP9%i`f0*o{>CZpA&RiyJxQhun9`Ae;PC~XF zU?}+O4X~85FDYwGElg*-RiT8@Z`hrEm!8ZLXQ(lf zAiu-sw`#*4JN#ruMB<6whvASM20#0&4NW7|LkWO00o7vwn$OJIke?>WkkO#2jK%?9 zWh0&i^)_6-q?d1o6i`IJ`=?WpMZV5Ep&MB%e;m+XrR@)Bp%b@`zsi%La@VcHrfb$3CBDeasRjrsC7 z2fb7V7FFAT^6-0RP7x$zq!s5>aUuG*k`?zEg`ul48geSM)95yp#gvFTyK<~#Zt$X; zMKaRlI|{djAJgDp-UXW?b2HY?D|&H&4OE7PAfOC-a=)ScPith?n>SnXZks{qB!nj( zX6!^h&}?x{wfP9I6m`Ep=r_~g^Bjqq&Vofh#y}V(6;pxmi5hSJZm*cxPbnmXjXLE5 zd2NpUW1v545Orz$y~mUy2vSXqOEVQtt3G6iVfRT1H>cMhSLB~L@s_3RFg~F{r462T zS@BeIR#g5;$3}`-sQ!ez1L{1}FiAomjW{`a6R0RK-**d2B(c>we_p8Oap8Wqlh0O% z>4oK053^`k8U&oFzP>*J225vp0q1ZPyX6U;+;M0 z*@Qg-P!*G$Tz$d00cE^G2%#CdtsHN;Q8a(BAEdd#o zWfFK9CM~9+&-*Xj1dr<}5Ep}e*AzRfqBmRR z_K}D+N*OU*I1u2iBuBj#g^zm3m+^VK89^*uzWsedNxz4Cd_cQ|KL#K)>Qy~Po~mfj z#?$uRLD$%PQ$P6LX$kwqaSp{+%BhCG{E4LE(n&uzoTMQt;!*FfJ~ykwRiIs3;0RL5 z?~G7`S4~gW=8V7jr|%rWgb*q6n58S~7KhCo69iOM{++r-1OM)a|44Pw`{%zq|5EDQ z&@Iz|6fZDgi-iY54$;4Ji9(}@ua7qUiaz>DA$CdbBld6FTXtUTgC#Z-+UAzB_LW+- zW_Y~^9|~!6a$CEvOVxH?n<~w4=X8FJCIz70e*(I$l(jD`wc1@o7$PN3KC+ z?BP4F<<8m-VUD^I=9w)A{ntL@lYa0O3YD;K9PC{9!8%SBue(^ z@$Pk=9AJjfS;B15U~2mBTu0$tQk<@7*SYw$Ot(ml%DftaVf}FB%*N`4tODQcXi1?F zgAvnIeudGc*9$6_M)tV(Y!cl+j!-Pp8>wQNCxt1wabUGC771lig3SDq2Hce+soArR zZ~)R)do@HnR2wcIy4pG5!GXr2emGY)S-h{Y)2A6+9+@~@ue~mmi^ZDghm=&J+kx5k z9r7OV_UuaDfM456#2r+wOkE{J2aa~S90GQlN-48srkQ`Zvm0mYRLsSXm7+~}n4o0w zNT!M(O*Ipdy69?6c_-__VUVkMWlHP5mbvbm+MLCw+WLoj2VG&jTD%rPb5ip_Ui9!3 z*(VXy>%H*NRXBSNYFs}A=jrxC2=^VY@}Nyl#Bw!?Xgy^knckcAVnR}j2AmC)DV+-* zlb)y#x{&?eIrKT5R`-99u)@MRZE$PDpUn(QeJw%QSO< zk+Lqvj|QW}r+Ca!=_3|D$(HsU%gjui?W?5MGa+jbZBLqeQrRIt8oDArg>@k;C#wCo z@0GQxkXAK@-E0V^E5?lz^sVfaAMH8BI0dzfMmjyRXV9RlBHpEhCVI6U$n}hWd%%~b z8g?U8@ijtem#qp#K4C13otaB6360lxbB06WBhR##ADvS@c2kVE+(962r{VoiF?Z2~ zp`id&cJ58WoVJR(Lc9sNcMLi^ zzPGuCtj;`~(tYpz$3%7}!i|PFK?4osrSJ$n!r%d{eiZoA4W=|m6k?UF^{_u2Un)3i&fW)m2SAvc6DhflIO!~Cumlr zgITWfqlskm=s6#fUHd2Lc7--NC-N(id>+WeteTQr%OY`*>lFBv!M9cv&U&TY+W*$M zS{X0JEl^+RgjGc*T)z<#-g$R3r>g&bP4+@$(r(-BJ45Hj@yoO9Pl)^RyHc`T$7fN< z`h{}VEozmS;2Tdsp=Dc+X^t*X9kL=9h0R9?JJ^|wKzRgETRuS~uO)W=6nDDNiY#|% zV3SMiO+vWuXhl~eS35834M5Fj8WR^u*rX>(Lu+wc2lr@pVdl06PSR!yj*U$6RJZ$E zYI%jZ4|F{naB&~p4tZkfdu4xSG^tzZ=e%~Ym-W|)XIY8Eb!Vk`R9(jooYU=0hopR7 za(AFbSgN5b-f-?>EqUJK)i;S)g~GXC5ysy4K1Hwm45vIY5OQ7$*DF3H3pi>Bf$y;kJ6ONz>t6$eY1@ zeuvh63Vilx%3Jm5!Pm?J$xTDXq9=wtvst9yM+_-p^@mYVvA0KDKl}AsLSIG?M%7Rq zb_emIXMvdAt)HmG$ajQ0WPHuHF8NI^BC&7jcN^ND`7fTKm0$5g;m5DP&72px8ecfH z^y~N?YTi;!`D|&)(sGYEFgnziwVoEpj7W;0QaJj(dso9v1}~o5`f0C6{d-ywFLI5Q zsWbn6IHp2xdBNR)CK1#%mhYVPX3j}yZo_^T*qQk8&t(3(xz85V^qa`1axz;ucRIBU zwl9KzX{eZIkgJHOyLg|uaBOZYrp?#ajk98^^|x3SIa9xRkJKf(771s_s#*=oHBj-p z6&EmpZk)ib9h&J@zg^Bm)+)QUo{Pk>Z7G>5yWnrQ1vrru9E7Y>X1T8bI!jEQv331@ z0|+gtrEaZu*|0nFYh)~GA=q_?o;7Ael*V`+*#V+BYOS+%P`-zRiM5e}gR<33<68il zvmeD{zKCU-!~mut%pgC&Y?~0~AcO}3C?WIj+<>l{=nJZGy!tv7G{0F+mebES{@ATY zg-c{?_lG1iW*vkkF-+4PFU=gKTN}Xcf9xP&pH>W%hpZe(+qi`TO%_^=dB?oHX1Vmu zbyC~glOrk1+!^$|R;gbTZW&K!ZrN0S`^7i%;+sulnDy(+Hp_euH?j#5d{63bnp%bY zsOW(TNiRDKT(melAIxa3vUW0Ul6rfA9!$%IlSPmdhP)WB08v$xiuE08FX=)wFjwd+y#K5QbKx}Iuf%K5R1DLN&m@4?hk#jzy?VB9U5-` z_&^J+Pk1Gpcsg`SS+UNNaa0% zn4j_s<*dwk{ovkh;bCg)`;KJrraXA^YNo2wM?z+Dn$bSC1P;8BYb_hS_fIeVD$#*j zy4)UGblH%5c^+|b?#)G)d!%VpmAb=G;d)rJv{n<08%2mITJq?W7%@E5CBz zwLq&J2E?s~xZnBTvm0FCHt*4u&ccN_B=1ZTYX`gLQzo8kouN)b=A~V&ze#1JpBw8v z=SUm+oEyf{JGl7acKoL2u1Nf7IuA=iyy$Ib*izSiU35I+hW~MU+55bldjSnuck>!L z&9&?pZ3T0|KIXfb-*>1L6DIrym%ceLm?pb~$m5$)oIgahqi%2^Ed5&hsskCbbag#= z&sP*Oh9;=6ZhFZeF{z<5w{$I!_MJ#4SKTu?^+$r_{xQBKl+`|FWZZ`75$gOBV!dtF zZT+k4MAlY-plTDSv~FeT{N;-WhO7H;DfB+s4Bzwgfi4KSy7x5E#w>q5Dd8#t9Lj-- zt?xc*n0F{Gn01ua#n7?$9~9c1HgjK+Pi|G{Yu(66dzVvL9epqN_crZ!Y2N0cKUjB^ zImvLRt?pzDag$lrrpJ3_T6Jj;)Q)qsov1~JuR3_jul_xNPl)CHhIp=p)RMau;6R}8 z$!>V_BFUQxM~DFTrJm(T%U;>uVNXux_w34|C!XnP8-EpTI~Z_H|4>u_lacmd=l6q= z0Y|DIEcbS;k*jMX#cPoalK28mp*pYfiKNwAzHj->;b%LZJliUwjrC@gkj`t-Zj9PR zj4|bAnDT)ufm@}{AS57!tb$+h3t_1cPpYLu{Bp?}MG*QJsrW|1P=ON}>lG_{PPqCH zc8&>+4LZIkZL@G5QF;)qEZX(hgeTP$f!D%EKjz{9l`k~C5TnfkW?Gs`{6wr7{iUk zmKXY!%;p@6UGSRpT$~b8{xlq$aU;GnBH~H0^W{TPJ<11P6eogW9KvQpQMtfAe=G}X z)7mj^B}9*Mp7Kho^-`uRc0`)DS~QB3C*F0QR@-v&=b@}kJ=esFH_$RV)lg*PwXGAOkt`->A$!0q8M$d6@H<5hk64BOt-O;B z#9}ME`rPsQBe7%bx>|}Jc|BU;DCDt5V(rm?nsOH=hN9rCzH9GwPbS0m3FO|fPQP)9%82EUoqinUSTuDy9-UeQw5Q! z^wQsg-T=?bgN~NlTU4cYGV?%^wfFiBo-zHd8rSOkvt2m*cqXdiKBUw49|XHhXnI3E zT&rSRgC+Q{u6Z3LTv|yi!37}m`x633wm)&i>-$A{!!mu0p$y2nKl-&?JLw39%;rRi z;mw>p%yPgzi|Tm@Oj2rRP8dhH6xgXK_K+j|j<7)pIf)ef+^h2tOMSoVF>1v3R$syAJ ztie=Ml4xTP@iXhOE4b`p~GL{!M3ozx+WM4UD(bx=k3C{j2{j z!?V@?=UxAuV9xuCdrx*!`aBdB4M;nKU@_;hnj*j^XA-)dQ=&E~CM%b60o#yDN(ljN zCKe*B7;L?&&b@ab94Ll}eGJJ$uMdqPTUpt4RvTu?MoE}$2_;1qm?3=G(`mIw-y!xY z&&U~}85(_zEW62V8{vqe4TxA_@_3O~N}%jcD${^Hr&=*HANK3d;l=kG&TTRx?cs`z%DqpEY0i zqby(BZCZu75#tUh8JDOh7ZMaguQM=bk^3zT0E5&qd*f-JtV#5hm7;9Wc6h@vC6Pj7 zIEZj-E#4R1e~@KOQyZzlLIcyT%6O0sYS8cw`9_YqrLbd&7M}{_gwIxIM1)vG z1!gi->XiN^xqTt}S%)4Z$WOkFJcQqtS*22zh)t$M&uuC0vmQZd9S#RRSpuE z(KYOw*+gLtlk5?w+}QM>_+b4Rl_Xi)X@?^DE~E!W*Z{A5on^ppVtyt2ZZGMpq@)pA z?JS)9E-N-vG=sKwJslFOu_B%7W&(0~I?`Y4DgM$D_|UaR*0xbl9643r-AE(V48tC1 za)6--FSiXgtZL`rW{h>+!8_R#d32R)$I8?!diCBGmKs={Of{#P0+GcnAwkP!3CgyO zZM`}l9rhLFZuf-36#TEXfxSY&=F)(lJ72AFJr^r;E)L9l zsdWk(6L;EIqh_m{JK?;*N84`ZjKyavO%2*8#Il;ZyS_yZTfJoi0RN$LBDEA3pI&g0 zfQdK3CrbppG9YW9-4jyMOR4$OtWgsh+p~VrNqGnT^gU zG@?C9J@|w27MHl&f2x}zv+Hl8>azG6*RqzMRY0CEW|!b!#@_Fus`;~K8ehDT zHCfkkII%vJu+pSa4&1%4|IUu{V`iJwSID3^x^@310+I8JIQy@yu8us2*iO20xuPjA z6+aqi!a){VU=icL8>I1j*A*hYdVOe5m1aqgr4i!XTWfgSJFiD5%82?8A!;EdVXH== z%n4yUZwEAw$n79(Qz9+RUr3Z|ic}V#TbG8U^nz{b~ zFWiyqc7oE5aBqj3@;b5b+NbyItN2G={T0m1f!3*74YaLq8)cO`?lQ}lw)`%Enbxyf zf8oDfOm-%_CI5DQQ%|6rxlVwe&9cNnklH+*%cZ1W*NS*?$h|r8$-2tjA&gJ!N67<+ zJu(f#D4mT82A?%3fc(3Y*ppUNH4cw0+q{2p$2U*ZSkl@x?DR}zZ#LA336Z>f0(`p? z%gDdI*L`t^<>NA24nd0Y3^ULS#@flQFF6$)x;%`OVk!pair7chnZMm95l0zc01w%o z^&7t_@SK?23Nbv%kirAJ45pq4GGuZFjW2<-i(K;@d|way=;Stuw!)u;gj}1h-p$LI zB#$lds0-*$1p!mWmI=X-fa}}LBbSUXRiC$H6khMbI!v|$`Tz!4xo#;Pk~+~c`A)u~ z|EN{&NqP`zfR{zb@cF-pBuG)J2~qgIfFi47a$Nqk@;RO3EL5ydE1i1=4Vzkc=nu3UdYFfLs zE%Ri&X=EY^F}77fu}kaWvm;&m2ruLhVfO)hNH84|B-+9rzijMcdL?>^s1AFtY7n3L zC0%J)Nqvv*X<}TDPz3 zdCBX?7&mHC{^>lC!eAipv#JSmUC^|FL?aq<^N!{MmKM5%DrLw7;$bJL86#aGp0!7g zC)cGau@4jyH0cMA56kpyvwl%)a)_xW4NWiZ(%gRCj_-=DnnYzyBJ4?ywh0;mP(X*F zxATM1=@c`SYO{^g=|+Z{?QDQ%1FQ`jLw7g5=p*DZbapTGR5Q_&-%v*ZM6w>>puFCZ zI&tZPo?O>Q;QK+gS0mt$QQcsITY|bvM<|AsKqkn!LyXNOILInw*j&_vhM9j)X7DW$ z{0+{^4XQWoRkqr$tFs;ZV5J(Yi015g^BRqV+1B~zRp&wwF9U4_8V9sq)+1g>m)>Ju-t>ACT*Yj`? z%Glh%3z>I1o-197Hz|IqpT2C2iRwwey>8;W^Dz>_N{CksFff^hu-6|7EfB0dKLRup zCL4^qfv=akLN*I!gnR{LIriHwY&wZHMWHA+3T|4 zi)%$0)+)}o8Beoy4TyKu&@;Rpzxj#39S#p;;L$?7oCMgaLiwOhkv~Rx_&DbwPtUh! z2;dDGw=k$?O;j@>{=!#%Q5xe@kzRe#5tn2=owO9N$TkT2$x^8#+(P_V|=VK1zU3++i^EUl?l_i>kWZK1x=?s-VceKOo)N*T6zCGFB%*6qi}WD ztkwWl_rfLFetYRxy!Y9}+gYQkdbqfQX!y@okSWv0%&%r|v?LjPT->8v@%-_j#2EHg z+)KRwU6W=exEUEgqL^%ElpQb@t|G-ZnAZ7SA-Y8~ljN-Si74{fl6sp6SQt!; zH#2~2#`SF_2ZK-gXm1SJ*L-_)&dAp`cqfkJ@RPEcP?+RZMDz~{@}7Jh3q2~{kB5_% z(HZDvS3A|o^xM}bM)eLa#2;3J#v$eiPAVRtP^MYcB!|CG+SXW_^b7xE&-k3Z;TpeZ z(dXDJb68fKce7JmM-Q*F3 z9#9psA(o`EL9}-B@hKU$F|33U9It0tyaVeeb5bosm4s1EH|3K~d_4~x4mL0-*mYd5 z?D*HKq!RN>?#|DL>DBS=M$u7Q(-|EpgvTii3>l-&K*^D02188#Fc8HJjwh!*jZ(Ca zQAFPk<8= zSRvj%qUQ9gXjz>@8Yn=uChL?%r_!s|=r^qmZ(FeB>8%cR+q_ zA`qHN>&l3u${uB8BD$mr+-L4fQ?h@YMZ_;nf6RYrVo>U}6SmRTmh%6xcb{KPg<-qk zcX~oiAoODBO)&J10Rqwq9iR@fdGeLX{hRBqmUCe|FYK&7O}!T+Lv}L<%1_9Mqc|2jrKVV=j>OxOLxg-J;G1;!%JQ9^Zl~|vp4eFT zgs*p%k|0yKhLh$C)RAjq{(J=)A4QXn*)fVitfKjw8I`fxxM!vvIDU1*Hlb8(Udq+5 zQRV&x>CSlkG&%i#ihPiI2}4sVZW!8+1u}njOm3pAei)*Fi>P4E!+O~ldMp#Xj&6Fm zKLNTxVh5e)hSjHoKqN1zwHB$+mivf}?u)5FQ>*EU-6ec+w^$%&@oMjYmz|b|l-6?F zAUQPv&Slku-_n;`=|R2dDfjO(gG#|j>{V<+pd|GAMI9-uOOHyL7(X}xvStYvmpX8A z{~U}G05~!Y9reaF5B2IIrlPC6%=Vc>RX^fE@kZ4_pywnv6ye0hUaw-?4Vwh^SRY5! zKd$I50|ww@e+;=m+~Nx|Hq6f*z#ZWzDGv7I1Lp}8^;XC$hZ{I{-Gz097N<3k0~?bs zNN~T#L4GdhyOIJ1JWY*OlTs5PG@z|x|H2&`DWoY^u(DiW>%`PtkD3Oi#*QS8e{}?T2TnB#J(eTGj6y@0|ZUG&)4Se z-8`fG7Y7xY7b4E{OV^2vHb;%bOQxtN5U%emf_$l~qHR(Ot++Ha$N9fWFIQ+=NH_Wwg=$T=__hS$}Svo)Kk5G$*H_R zN?iZ=lZ@o7QNX*`GUl}{=MabhKK}etd{n&`lL0S;s=LBoOQ{j^ z@>3A|`E{2!<$l{!QdzZm6^les>f6{eskHw$-ti!%`?XDM)@bQC$d&c=tNCF|I zi|FXvqp)QT@0B@mSql*dXWbTcBK^0;@6*VZ31Kf^p!(>7v02eSo*r9!FL|E3~k?=wU9UdN7Xs0 zd&Tni;@vBA3NmKjm(Aplo%rc+vf1URaVawlv)S}5SKXbk4tg2j3XDW*gk`L_}5ZYAASS2@W5dx`74$I)5CU*iG4^ieWxZ&!Dv6%+}yztIOJDF3OJqeffqQrka; z5QAJ~;B&wNfXA63ew-JoX3ktOdU8|>NZ|T|gM)_hnTh}94@wQeWNRXvkm}VV8CaDQ zy)^ZkV_AmErB9I>H531*KR61(>enWqG;dGmq(L)|o08>60BrobeUw%$JCdMOD3YmF z_vDtHpLFO`t-A{~X}^hsI6#RCQxyvfq>lQ;Q6@6j%>@WCf4#|agI(tX1%Z3-4!HMEhh-Ebi#h5)u)|<^x36LuRB(o{ zbG!I}T7mAU(n`-oglOVs@|RcIqRQ9CGUc#X@<}L;0!kBdkSrWH^3{4&aqrKc8R6$d z&i!LJVoFV<1xBAi9Rwe@U|Y`ujM-!?%-1t76)TYFmo8yL$OB7WRh;z>L(9{7bUa&! z;*}bxW+>$?hD3&rBoUUtkBSV)eUYe_$0q0WHZM^3S}a9vXRQjpw136d@jMv&>CT}`hNbsk-F7c0ij+TWB5v5kxb~Els2mA>Z#m-G_nU9T z%!0i2tXL}Co0H-vK#Dm#`01xDCX)jqk00b6zkZMS%wbw>nEz7R&Phlt*Gf0PI`Fki z^}BnNcX&cxl()2P&8deAmAw_y;f)b(C&Wl8VUH)en{Uj7v<$Y+2ImpxDlB_Av@A%6 zxdrD)$*JFot`6%5;q&~Fv~#Y`u@Y{m%Sr3u`~t_Ve>$JM(}?A`e17u$E&F$h7~V*Q z`#;ys>R1X=@kb1FEkX|@uws7b{s%YCO81BGd%T?7bG$4r+2xR6$YJ$5Mn@f}E`9hN z@%qN__oN$DS54&KV#6}yZK@s|ICHfOT@B)gkw%n1DfBh{v2Ha~j`(7->X7$rs9@yJ zj?5(MZTr--6{u~G$&q|qwab8$6Ms%tU-}c1H|NOFOFt@Pn8zu#9dBHJ_7m8OXWzh3Q^oFgBKza(bmOK&aVTU z$~BgJbxH66^8?dV@2zC06cl1@h32tLIjY#}K$SIX733L7(U7I3$$xDZg}+V3WR!5B zOyLq7M2?s&d&P`^m~jgThol09BpbMrLi08ac8s&x$2seIgEIuHz2nHi27Ea z@6&w`ttDaonN;cSnd@bVL1qB@p0mv~^+e|_P)wJtuR$>MvhxkRb*K~==OSI``o>QS zUUl%NYbQW7!3+h)Ka#YWD@_{=CUWT6p0S}L#pv>u02OpRpCA7w#R~dBfBM%C9K?n* zkB6l*Gc?OSO0CH}##+HdTp2g`r2q~|5z;W1tMuC3hAG483D%$`&B02v^$Qnnb9;4DUUhZ9mXQvSTA7;E#Q8jyO_`$t_QO57q&I>n6LlzRM9rC=oq zbngTd5GhWQoaAu3sw@j|dM4tQ!kLqexg6#Us<#Rs@Sq)YkLtAUjUp#$9RRLLlf#nA zx_2?)P$pMF(ALR_2lFXN0>nocN`C9{^zHhSB*6{BA%~C0?`wg;@u{=0()hszj+w$+ z&yXNz0&-HR6-T=zb}z1bxv_?`zAv;7TV!*Zg<@be09S>@ryudVOMHsj zGQ89wpL#J@3=Y?hmI4q>%`3l-JKis(C|H6ipq}bwbu}~yy5cpc2$*$F6}&i;K?i|= zJ>1RIFPF7nCSiy`xtKbYS2k;a>*pCxW7?@;ed=R`?rqdzI^nGjm@05hs(*bR|EYs9 zH!S}M>W^!tJzPy&NuAG#U%=LUkulMz#OSkLk2!%xNi*pJ}aUfWhtGK zM1EtS7c54&hccsbx%$nwUzB-C$=rlCkhyRB{-hmiewnj9g1A$!Bk~p1p-@Y>HSR#= z{=N0-V>`8DMi2=IlOY$bHo2$te7mlh|DHT9c3^0)SJI{u0mjFOMeO&N2@2X9HyC?-ygY^KeewAahDcZx zRtLDe&zw7__GzP#wzrgpqcHhvN5)4r;7jOVov7(r%bP>hBERck-lp&J$9Wm1)k3$A z7zLH3iwdmh$0oCuIsFeCr~N(^M#t}bISAAwdU-8PRz_2MIu2nnT>8Eu8_8W^-;Cd$ z?nsp&kzd2vnM$jZ37tIzFzlUvpg@0o_TT;h5uZX!EMs#!$r%nf)-sgR$ z924M3Z(N~X`is zSA-e%M}*~s#=+dP(Euq{AXG~aiBHkKBr^{3CnOPsQ{*h;gj#@KX_s&}Q+}JljM-^S zDL}a})!9lKwhPke#GpLR9h}(nffYENjKko`r~s?9pcOE#*?03iC_!H9o3^?$;3F27 zO7lqf-3)Z|#CXlQ^1M@p-^L%L1#vMTr#xvcq5e2bT5*Wx)y^Ycvm&(bl6J3?t{2Pq z2=cM3`c&jKUEPnE&pL>ig51e&HJ*xU09Yh8f|o^B8qVA@^OTN_5G5qE*DBiMVxI=b zX6qg9vr_ZXJ0;==W?E+FnfWIdB@B!v@DFD{AM&HD#H!4mo43k&Cd60j7AoNq{HYa& zXT@Ev2L2pN->j847-Rp3vBP%Iwmm%UO_sGB&48NnRZ(|bI76R#@%JY2?N@hMYH;)@ za9)Al)Ow0<@4%su4mQ1mAO3k*u{J4Q2X;+3FA;nmpycRy;6*bI`*do`+yRD#^Mm-4 zjdjDdk@%%FRiDme&-0+tz5G6nlpj`TEEBT7td`cESJxgzPxUi?s_m}5wsVY9B-{EmlhAApLNefB>V|VcQR&F|c&SNj>V>B& z-@24;qz4s}pcQpDUPMJM>9P0FBA(VMJRVmvZU%i)bo(VxiQ>>ZM5PIA_nC6dDN6tiE`*kQ?rCODl90)cQmR~H7XmvU?SDp@t(Mt@Oglz;wn%|D=mau7banxagHiCvKGw6&@(Q zDV-5f^x;tOx}GF+3}nU%4?3a2=bpmVc`dIsmFRD~-=0VoxEaHtVI7~N49^c}y<_~9 zB22zPvv5mSuKlxlUBmhWJ)T`6Ak(fCkTqA67p|#PbWz5`m*B2gY#@y~hnFb=S$?R~ zXe$%=c_#3K#N~H#_4lLL9f!Z3-Ze45aJmk337_dZl#!s!eqkJI9RTU>t~VL3IQg!(GDPzL)NbPd<{pf%RK65ls(pITMyKvV+VeXg7oZB3e{eOh6_Wki z?=7u4;-;^0Y;Nh#d$ohPGOcdvw7vt{eY&YqCZIR$>wbG5kH@C`XX$OA; zVM~IQNN_1pg_KRH4lIPDIgwq0uk}Y4CIsFpr2$NkJArD-E4=vrbIiEyb@RRjTN3qRo{*p5m0U0Vb@wQ z$MdrcFgkIHZ~##19FrV z3-!v*uh9D?w}RgG4Y^Qym&)n3xYrlOGlM!=hwB$iUCbPROI+g8fV6q9 zOLiWTn&ILff{O$(K&kuCW&MbEkf^KrgWzc-mY$OYk1bRdi(4puA>GI z?tLKwD`DcdIfNIcfQnOq|JVfgLciy4NiD&#D$~i!gFR-?icAROWxXaN&u$bFKs*n} z8S`mZF}|*1w|DBM${WfgJ}7dW>GYo4(V7U8YD}L?l``_^ygRg%ZKh81H)_eM-g%UoX!8a!sf51zCfiK* zO=a~I1T7#6`Xh+zO1n6?xYEkhxVS(=y-Q;{)E$&ILZ5 z?}Yuu*PJk|+}u(e03?fRz2?%Yg)io5m(xE^~x$cg79ce^-k9BqMFDwKXn1f8DVXt@t8 z{_<27oHE4>nzy*63Ooz$-5d^jYM}_o&%$cDv6^bwl>5(b@TJXEyp;G1@HnSvO}ubz z8C6WQ(f<^hH$7iA=q50~E{ zQgF}<`wkg$g_?fI!Cp+Q7HHu?LW0l7SAlNs3{aIXdQbRe&&&4;pn$c;kSVt} zi;^QR*Lw)p;z3(NEpF$!65}p>TB-bWi4H*>NdC21mdAV+*tqR~pcMK0)w{}5$!M7R zLQ&1ntwsJ%(mND^?!=~F?RzE%VQ;12LZp<)-=7rb9!u|J?KI9Gj$23O`ldF+X#J4}oUkTS%hc*7`{}{oCKY~HQ zW~3V`b*@B3Z@|QXjkp-ET{S)vUW_aA>S6ucMBcbG0y3x>9CbC!995>%hgrD$)nu1m z=J4a;dC4&L6IA5`D;_@c3Jk(wr!_qnaq_3$15uB}c#-V|m-jz6A3J=P#JC8+{`v0i z=m_~RK^E_TAQiqd5*Rt(YOy?!o7>)B4`eX?$FlGyZex!_y#gziebn>UQx5@s%DXQZ z;PIu!id?jp9K^i4UFm@I?dF$r(N55J7f%YI-wSOlV>f=^y?QLq=zF{4?^FuxUZOv* z$mI$Nj0kKmZoy^PasOioGKda7QcioPy8)eh#*ygSvL5x;kms10 zBL!~vg4b7noLXs-5EX@v5&bejlGtA_g{rD%P3 z245_M#?*j*8}6CjlWn$z0xq{>zQ13*7xLornJR6wukPHrtrkYdoTKH_0BtI( z&dhveC6}QZUrV(}2lTe?@L&ACa}1Xpc(+L-La|917U6l*kTXbpLPccgU^63GLmB(k z=5X6W)WdSQlm&3h2b4Rt3rn(^EwD??`L=p5uSGwGeae)EfDVIMAaxG?hjzB@ z!uE;Uhrj?Jk$*GV$x`gxcm35~7I4fQrRY!Z4#a+k*@!*CWImS^V82VW^_iw?xfdVl z5m>wC#3ArCA|p{rQR|1hcl4rwG9kv3F>9lbPUcqDp;Dwmy{GR zDFZ;T+YMH2D#a;3y(q(fm(c23IKa~pf@8R(@qFC0k9>JO_PHhZdzsYej3;v`8t;DW zo}_LxaH0>nYg>=IL)_#1(j03(ad0GonScZkw&$O%c_vp!{k5GUiVDkYb_>Y2)zR0v z7FD|>1E|sbUljxtUI-rJ+PO(Pc@&I;s6Z2of*HwzC+en}m<0D6p4W^lbo%+LhGG3g*ldJ+~6DyG++kki${UA$V$%_;mi?Sk|z;dXBgno{-2H(Rn29P1)HF zwYN7<;&J~CBP{q2jPMp%5wi0?VuUeC{|zI&kczmNiM*VHxsZmvlqq~A8%fO-O#Bat z5S3EENh{*YE*DD96HCoMM7z$PS^D23!t4^|tEK-X5o+XD@)XqY7S-|=*YV|7{f`o% z=JjfW|BFOe-H!cVNQ5?(b*9x#4pnT4umxy6l3OB)HRuap0iA!HkbIYW~L zqtitbk4yg3Agq2of9Jmp!iE32LD;v(O8dVXgd6|eAbh|0{^PT)&o4f2|8Ij3`2Xy~ z#t0Su-(!Sn`O>CQ3$;Nqmf7AqQBb9PS!;#p4{MWccV=!7k~t)7*fk$F4O}dvu1#Dm zlhv`KOc4Cc;5_o7vXKFZyqi`!d6^Qn9Su+0{u3h%Myv*|ZXWcQOCeWN#2(%JTQhGCv1X&?XAOIKIVn=an+ z8OEczBAe;j-SO#JXY|MCKHpW#7xKRNUuzzOixJx|sGNM<+x6}3O*!pSml5Lgt9nuY<=ch|VPx~PxQ)JEfvsAynlO;V_Cnr)&=O`2Qj=^Eo zvR7FxaI}1bP6!fHc`8|;aY*dd6Vx>0kad;TH7HP&$oP=BNVG2i&n|y`$@D_~@iqgMx zew`vY97`UPwWpf(9{%R}rEl-5Tq5d1t@pPX1?zG6BeVsufY#^(I`m zHI3yT$x3@ylUp?YAer;LspO#tXa30MFiqPZD^Bd}eVVb(Pg!c=yiKgT2^r9kJx}-P z_2gfnq|Z!!EM$389*hpwESjrXOA!{3+GvdYi%b6b)23VBk{+3U{&o3CRQzj8i877- zGNFxTKdWoG1FLy-$kxiS!Yx)}{6Ef|n5EcaJ~TKH)$S>E8Q0%NV!|7;$YIich+c_c zp51xYjC2cp6Ek~QaJ%9cu~YEa;lbpzmZX24of<~H5s{%%4z2E1!);odX$K0}Y3|PD z;YotRFqD5 zDr1MCtxUM+`@{3}r*R_3C(C8Qx#lfPTxYf+xP6?m2#vMzQC4(9z*0VWQN$8*6Gh827_7v$?^0}P!+D(W}GI7}-oVY2_EO9~6=cood*ZQRyzQJ%oJeeDiE)1h=eIRSF z;17M>Wz#$xjwv$CCM1a%8^D8L{O9=ZeW!Ngxr2v>LK=xG%^mk8^;3#t@+DrC=(NVJ zG!kq`>CZL=O>(HOB4YgoMD`d+Ymyn?)oqBV6{oZf@FCJMiN?otml0A-vd~OI!nuj? zv+GTXSatlPHzQ#A?LpDc4CGl$Gt7lhNbyt`UE0XKPu2O+e81TJ2J`?kJ+>eOsTpzYrRx*~4;>T#HEqbd7 zuPonXW{K&$h;T=l5e$J9W^F?_CM$H`&9kq)-W>9p))(2KyM}p#HCy5`R)Vj_yRWvJX4vO*5w+JcgNgqg>vLf}W^KF(FU1Q(=y{&k*+y^{Gm^N{l!@uv^PIw5)Hil!&d zcTxFzyZ*eUE$qs)0H1~q8mm~soqI^#l)E|ZNwO<`nw&e2c$e-7@xSW-J*Cb&cFZhM zcg0(V$o-h>`Q3|J$NU2)mN7zjh&u_9j*HV{xo&j&*i1Mv?9+6p1vU2x(2EdI+IX(9wZ|Ad+xAJx(y> zd%AF>%r#jIm!@jsM25$>QCvD!xY?4=GxL5T;z}&vlXOM?LF8pmAuni_$GBWH!QCat1mP>CtR>dO5pkOfCw@Bvxe`60;u{3tn!f)zUD+B)_By zG&u&kbw`(fIHzY!?kvma{X5Lx4S2D6=4+auNa_VcCwUJ#BDWb`IRV$98VHe2e5Xa^ z;1HU#0bQ=(v&`&&o#L!EC!{lZ{%Q-`=YAzmY#HhjI@z1{rpQjgA9`} z!-_NEpY$0*JNC9ae3=ZS`i_85a3$BOV8$#w8iO@#OYpx?Re!unda4X(Ae@6nXpuoj zH}awgF@gpqGRhTlHYMi)s2G#K+Z9@FS*^Kx^IMfv1fxRVN&eJquF;2^Rvd?v{Ei4S zi$3Oo3=GPw4Q^%R^F4Z5^EnC<%c?$NbIbR)gwmX<7PWBl&aGE^;cTkl$4Yu_tN`H_I}~$XEd3L4iKi7ZAdO z_yJ|lLEBSkL@XJZMYxl;T6aCkDGMzdOGd=t5tjOha}?PWDl(gS%jZK~Gl!(QLH#|^ z`VNlU?U}b9bl3N;*7yIeXZ~-DFydLqnLi!>|6zoGnvCU;{9u!)L|%nq-kA7Qm4Q93jAyn)}wgtQ;8t zo6=JN;IA+CU(!MvGXP)~4W@&<0puIb0b?yBl@9sNuBBuF&a;R=4+liA_2{9Q7*oKQ zfk>h<56dD$NDw$_02>JoWDM|?6B6-oWi%k{jo~N3;A?|#UkbGRY_(C@_nWIzOfYc`CyL6EL= zkb@B)s2R{l_qsRegv~C*c%OG0tqHY08C8T zXddJsgfxEMP9>QzXiNtj8~6bRAP2w{j3%CK4v^`f3@!|q4kTn_d>X)B^bxv|3ddpK z`aV0n3n5X!#B2;e0qL<|mHU&K>_(C1QNb3#v>6eKhbhehH`kcL%@FeTRC9w|5<8LA z3`j??zcFa zC~r@I+1?!;21$e&FhCz0rbGx(@^&xEUMjU0;YK|*c?;|4=Ujr z6>Nt1HY2`>J%MN-6In1}$_($|urC^km`14ipj{Y{3C;zKIWaX| zLI`e!V+V1p5A8$%pHY3vod7Z=z%NplN+d*+XAuG0k2D*npcK%nE%X&M+;<&q&Hzo; zucARfrVlKB8&NIstV#+=rNB*Dv!nw%Kp7b00U`UjF>%HZ0m2&Ch-t`LZGN;$&oe1={ zD(0;?43A%vo?FkfhfUfq{A(m~umBMT0Igh6WWsQ&7)}!mcP03}#KyWkAV=8vducye+7|*8H@=gOF z@@(+zivWi=2Xdg75c(TVDS(Hks*aNk+fLsl)66h$#0* zdt=npDL@VfEA)BapoTeD^~$~PJ&FPL-R>=Xj=tXnlS%x@HUfF*FEY6R5Ds96$K2@f zzl{Sk4$rNc`r$ZqZzVb_8|+MZiNk!7Q-?V*AxZ?$WIz9E|1duT?2JbxFy4-upzWAo z0mdsW9=3H+6n&T4By+s&?AiHoU32f`#xXkLjaC%RA<2|vmh8{8+i{{o<7)? z+1NHrgxRAZN)(XT>7DgQ6GRp)gn48IEwipPU_ zC|^t>cMP`xxmk!886L*ixp-#WZWb(s1|ji)^btNR4tDStL*&J}u%HHXFxC<4;0VYG zL%j&_5b}?gCOwj0Ko}+f+kShFXR9LNhpf|2v#PIn0vNmfl`!{Hhyf;&U}QYpbp{c@ z+XFd@iu(s#yz!ZP<5goXLhl}bDCxU-;<6e8l$V1QI*MY0m?8|YF#z*o!2&4oM4#P? z`fsXCurzhIfVr!`F|JRUr(WT!%Efw8e}=QCy1Cf;8z994I>eCx^9JCq_trX&baj5& zkzjo*J;Dqvhu|*%6?fVX0L>b)z%q>e^^<&1#)cdNtTziG;$U6?Jo?|Sl84ZO?VaL* zgFSlyr~-z0G^p|t#A4EhSsJ&54srhV#(!XhlG#HtqiHBO;LXMeWzE2xhXWN8H(^&L zNq4FGZHQS$p7!bIBPA|x9V(449Y950-;t^1SWcGVDadna@VK-svyH;?`> zs>SzUb2>jV;27XM@Dqx|B|n<*UP#9E3}+cESb)1-a)*B+0LPs@@~hb+rI zcl^h4Byt0v_&;$*+E>X7;;W8{4(IaTJ=pnB;_oS`X6YSDU^cufJ%o}aG01}v9byi> z6Q(1#iqwN2@53+4=TsVx{@MpYJKKg$FTr47tOV(XNkZmF>w-62A{qf>aU0GS99U`N zs0C7@*(eWQ^Y}pep_2y*zs9U4zaME zwMnr`PK0tf|8cg@(yKXWYe)m5$<{0WFEv3&3#KW<1|PB303wR&>|h}j)IPV{y2b~F zR!4EM!``)~nMscmjy$pyi9wse4x-x^tN~9d(!oCHzMIF%bG51a2CRG3JBmRKcTqMg zgINu?p{iN#cUYh_eq1?G+p`|Ko$XeXs&gXjWfs>_OkpOY6%vuduYO;RImo$tckLyo z-^o#F4k@zLMtfjS#m^StJX+TG;+N6g`omtc&I1t`*3Z6H!MLivkdH5iy~A3H{b|k3C|B9k?2XUT7}>c>QAbmdXCt`P`)`^opRe z;adom>Jv%#=j!9R9reCkZJ+g%BCcE&_1#-2B}2q( z@d4f*|45x54zrdL*XLQU3}rPm-uAMayUK|l1)BacKi>G{&QAq=pD_^l{Huar3x8Dl z=S#)a_O5dZl9s-uGPjN6>i@}Cp1gdVa2fXc-lx)~!9!$V3mlOeZf@xoOMo@3=={jV z2ft0oR4flQL$29B>)UnVzW0=K<3)(}saFr&`!D~o=oGy2#+-FD<%uD{U_m`f5LkS? zAHUe217Qn*lR@SS1QV;bV6-oTyi)gNPV%1_Z{jA>0MlWYS*-9qRnOU!sLX7nG_DUK z4uFmX0uT;8^LJ9Xv?FX^^Y-pFFI1*KKw`p3v&qWYQrws5xPC=sKfi-Rf)jOfFAWXp zR$>BFjs@g#w^aV~c{VC>%q#5^584%(V6iw5rjr66KOK?bTQh-ur8qvRZHiFC4I=Rb z5K4~$;-+!4qmHUd%sKiuKQpBK;%Muu_vUi%1_htcN6Pzl=z^1G^4fKiN_u{LU510m z|7b+;rh>6JK3st-#te4ru<65j+!1i9?UJ(=nTv|jzb1l3`*96C@xmz|gxZ!xMA>i7 z<37i*pTn3e*b#~;M@`ANQ)v{K56>s49%FHI$6Dvg{!M6;J}9cNp!`ld6Q)K5ac46t zWU0l183em{<=Zd}ZS~LLb07ieAZOTKa+HP;QXSt?X@*(i*Ia?784RLGT8ue+VNh2&W?@F@aOLPkau7~=HN;cf!D0)k)1FC-HlRkUwMNyjhhE1vmZasZ)S^9p zC%%Zk9Z^6DNBK4t0tgn0Jtf3Ew4Fh_K2W@yB^M#cEJW7@B8YUe zQnNf)c~DMIwVczb_oLu z4FXAqTcfa<42L-9e9(UTonH>P3ZXb#ZwCh70pESv5I(VycFYLH^QF^FvyBFe*$UXp zAY{pT=4E)MKm;Grki@to?A>OV+IBEk;I{qwOqZvx_G2exEFl*%><-~P0>LLG+rGFn zER;yc4168F1q_LY{Pt!^^AI#EG#|Xlx<;DWF8Ow2BRMfk5jT_6FUHwEVL{B2m(B^! zfve?H&CO4QXZBl3seUSMiukRb-+=@ve|lefpODoq`@`Sp`iGHhmNZycyIwQ+Lza>0 zQpWKgjWe4c^hZxD?^fTpc=PLH+bi}=K?-D*a48~8-873B^wTw4;!{-(AS-hF{C0b1 za)g)#_sMr1PRF-0pbx<}bfcC?@33 z8*dX8XHV)M;tSXd6jysOJms4`3;Qc#I5vus@q)M^RCQwXo;!7I({L5Lyl3Ul7=4u5 z8!mpOX}m<$u;2v|aYEeu;jQz)_q+Qm&rdy=Rv3b)f*s%Ln^O}{J4BTK^OiLlp#8~y z+`{mZ9kCst$yNF0NrleMxZGKRs6{1K{X6l&^NJO}AotIPldq-&uS_h@^`l!t;y>*^ z>9*M3Kc9xwd>a}&RQF!;2+}(czE?yLt9NSsZ0ubulled64YM(4vS z5C85B@KkOk-=E+-lY5aq@n^fl=TeAjb<#$g@~*%y-7iIdF1&Sr1uZ(;Pcj1d(oS9e zU3!vf!6>_Q?0ToP$c=UHAVY58b>W=|Hb_{>I*iza`fir(Y*XSC#Q4&;j>uX z`(D@nUZfSz_x=v()wqe2k|9`ZXl9YRCponqwP|(@_aoLakPS$+y3zCJY}A>(x+RK8(-fyqf)f^@j(^~V&qCsZ+kFfTfBG?bcKK9H*O@I z);S63>g&cs9zjHM&a%&@vXbEXOSGO$ z3Ul(*Sl=nbEJji&HYcox*48%WozNSxZ+hl?_DDUgtIVk9Pj7F%c60()Obtya!DxKG zcc_P^k}^I@AJ1TDJvwL`pM2R{wK_f)YMePcxB_VyF9U<#^(F;oCzm6^!p7YNed725G|nUwJ=tg8KLhE{B==tIx$mr*9Wo(<(X z*qhM9X?LvM$dZ|WWTNLayin=Wq2{bo*rXQN_mt%du+_*(fxU|tWJB|eX}g2`Qd$| zTkW*WayyUsiKqL$1`V`AZ-+PS$VE;w%EiZ?Q3TI%DeN1_5NZx4$5gCpN&kE7#(jw zcF2+{Lq{`(2PTt8VV}AXuuSAFMQ+ z+2P@1S@cKp=bo4q%(0sj$LpVDuGk-z$jFVMT`BL)3hYg6K!)HQ9wc{6ZSuqzDTc@;0=r zp#4g4rPEx~aE{dt3$GqF+6!ddZl_fR8r3Ek)s)ltaEo;OV&=q*>wVYufPqX(z6YC` z5}$4HHg1Ai`mDRrDYJd^Qx9A%{Th+J6{9nT?%l}`Gw8NKmuTJXv>x&4#b*zt*PV@A z?b6Y6!_m{jns%8q=kU|Cv!`j;z~0F9p6LW+JkcW!|0tbdD$qL}d%yR>!8uy|IoeEl zufrdsxd{8qr)g_3Ncq=~5^nXZ#vna4J<|v)X`N3N0#_E>>1QqtX9Usk>pjnjJue!N zImW{q-Y)vREBDPGXObL}bIji^7`+Reqy^DFM<72Y^qNdRj=T9ZwfVTIz2i|R%JtK6 zLpS7x?d)QJ)+nSh%RJH#A@=yiFC@MM}y;7 z0Nb4$ZC;#pmwSq-pB;zHWiXd+tIlPxX2(?w9+f>yM|za@JxkY{ldO2s=j9a2^(-0Z zoL;;nqw3x5;(XEGd$bQJd2a2fcK5_Npo@?-a+s>sMt?Yu zn##jXwSDu>0{|OJw;>xWHv__Vj;XTZM3z3VSyV!xlCFOt;x(~i{pNW`ugPM>yIY?6IAf7JD zGDCf)i`4Yae}Q~5o|U!#&e}V=kuOFpIwwPEra=9Dn?z(jZ}yNZ^FR`? z-?qd!B=X3Umjq}eZhj_@`0k)A)3AG?X9YTua3&6zIKo&lk8XBzMT8UvQ9uF#_5Soso}kqF@Tf|%j!S1NZz z-_wstA|&Ww{iVzKIOq}&Vt~&#3vojFVy$-%LKGcbD3>X&uqy9*SA-D#s;5<49^vhUM?WggR3hw zaE#9#^9RV8wi_Lt@CjvV|Qd_3VE%+0Pkra>UaQKgwDXL>41W)}Vag z$*)Q$5#eP#!#&EnaE2qJ&I4uu-QSTUF2no+3);@eAtsoLK=;#ggxITv2s#p&+o{dL z)~@Gc*or`^>5Yk^_K5nQLHW_M(b7!K-=FfRDf@xQz%JxV2f7d&eCb|l1BR)`1@RXN zbMbtVbNv^-dh;O*G*0)f5q~NlIdlAH9&s{S6eum=LsVPNIy%@rN!LYGXJ_<&i5i~#bLahE_tR5{#$uB24W&z z#}YO#D8sc*KMh=z>2yjz49C~f_DUBqCw$2Nz|5ldbyQ21)w$s7+?!htAxu$nm zZi^-A>tGeTD3xTuz8QS$UfGHXq~j`>FbtBQE<&S!)MM!4Ys$azl3@bK%DTAH%08Tw)C+636^Nhp_;NEp3Av1NgA-E z&29ClUFU0cGAFYJhQSKabUi^j^i|!jtF9l9-&Wdp`a{!P0YDc^O4-Ii<(5)o0um>p zb3{$}E#LRjk>lgSZ>23+u!l7Uyfm@LjM;<|GBNkaGwJq|B^q=Fv%u@|2kDgqfzs2i zdcVM^;cP{`$QD1I^s`n_BTB29b@-Rg`<~2SGU()W^q~j2JI=Vn6C@#$2Sgle zGeo3-v7YWYZk3)D09EY)l%m%w?@EG{S+uPLNd+k#zX2i?wJ-yd^`FK6F@Dx^x@E(pKF^cqZgtt7(ZxiTPuT59Qa~sWI+$YBO z(^NgkpWhpcFVtr46Y6#>VK8aoNs#ng*w*;5@^W{Kq;)Hu3}%0WaiRNL8MEY&@D4d^ zB>J2b`fvc2esJft5rZPdN+%R)#2(#432U$QItKGi?PD^2GQjz}f*=wDgD_g}Lx{T< zNb#Mrjy#1TZDoWgl8T)Rw!V@t3cLOw9Sf5TNK&Z@&J36kl*(9FaSo4Tf3gBLxdM5| z_8Tfw;H@2)RFoMBsNav|agjFk^85;+#&cFp2yJeEuvZEGlMQ^JL!r*1&c7T|9+2?xRDih&9sbEf3W(WtmOfYwaHB5Ls8zIBwz&k3Y2g|`cV+*}O@{J@d zGQ_9BUB(E{-%-?DQe5|-V;Fk;i9%+cxCNKphrk69$q;yU0|r3#kOm~9*qP$~!W;`O z<3NNS1#3Of!GRiwVYx?SYg&6lm7R_oP2+;&%CP}bo8x&nX?Fj^B%zdin7Y~;*!7xV zuQgi9L|R%n*FU~uMBPmv)NJm;NEO#>Ac1=D8c#Z236_pey(=`|O-HF)ubbd~e(!q& z^)!6%h4)#ys_$mOw*R$&6KXCPcPRyyUB(-UC6Q(1=t|(<LnG;6O^ z7%L?_l^(GPq7ZAJYNnZw)Sb5UXPXAhM>%E_Zo4mBf1hWYScw515Z!ZRNTKNCcze{* ziak}q96L+VzE)K+K*HpPTFfvBEIOwScLk%olKL=$Z4C2(38qH-J8}NQXKZzYT~qXl zoJ6%Gr|$}=`UlWq`t%%pI>RLm^~njCxGhq+sOC8;FNnBXNnYU;#P)E1d@&*7;y56z zg(KkZV7GObN602B>*yK*#Z%PdG1T`ihAn_V5Ea5FJfyKlMk-oCc9I`u-SgKv<~Y1! zl5}o7*BW>uG4G>fGUK`PyMnMztzHQ`L)l_KIeH?dM#7_ahn@#Y)`9K~upx_dj~6)6 zQWXE(4@$Q0&^l{>Q?(0Pgijkkkk^1eg{r_eEg>t#>no2F@q*?CnJULTp|BOmfVjng zc!oA7#H77XaQh;=r+hD*KJOsjW?C-ZZlEq{CGr&QZqWm!gGmFQDcWFMso2k58(6yo z{7;^J1C$H&_s|8KNbtWGtMF07krcy@2WJf#u@V|&7lyt?;d>Y$q`qhdi7fw%y?u4l z6bRNgK^OpDd;RNbAo@v@`-40&4Y7{exsyKku!HI$7?*4?p0RQMCqXA=Z}@A-t0L;r z#OKRkA5FU%Z?)3(?$&v{ah<>3{Xi!YM-{Cb633KIopL%= z{H8FDbeAMOAUk5_`An7Xs<6o7o_C)qa-73v9()f`;GF*(zk=SyMJHrmO080717XtC z%O0dl?*%of5MolFQ}G*Ul?UjNm`#D!IEfkkQND| zgX{ay={|APwf3;o!{i`5Ra79Uo90{((2rUJw`EiW)rf0hrwA-@=xcTV0WOk;hpIU% z_LY}{N1N!Mw4ErAF<)<-I?o0LUNljcni;2i(e==D^4{F`9F3DSd5Ap#(V+KYn(-gL z(xlUab`9KnoXer~jIb2_xBq1S%@kz*m5VeO`i8Z1 z#)yLNO_>*xUZ!XqAVNPvrINV!ZH{9hnAhs%yFfcgf_(IVbgO%=kUub8n*XE@wgC1x#J%Tvv2Q8ouC&-1RaxKHn4EvcKJ})o z(pZ~4U{mKoUSXj2n~?7-tAA~1B@K}4a!@6u7!=iMZ&v$d2SWpfD6ekxKz!Fdp}99{ zUOkHP-K?Isf(U)mIk-}-^wn0e5c~W1Ip_`g@!S^olIS*&dp<~H?$5I4kDW$|N8469 z3FWzSewfUTEq~pTEYEiEOwm?belmZkG#VZ;)mg1AO1Y&AAXw-ACSJ(0l~)c zz&17N0PeB`ZYrA~oPOW8R{5}CoX>YSdBx@nEu-OPG+{yB_`w6>mN;Mbi?S0rda5to z(dAiOP9h{1SR~#&n+L=?Oq376T0ose7z=+>S+V$ zbvU6{A7Wr7AL7zuksBVQNUeGd`$Ra0np1f2sgkJtWZlR=}9~!lyws*yh(@ zp78h(=Nsu<9TOi18m;1d9^_cjKcEw&Q9(9&$?p{AxfCw_v~-?u5;cFGgsC2&mf*SW zXZ;38By|+c<6S8Ht2QzgJeXi8&tr|AHQ?}Wb`Vdcw~ruymik#^xVVZ?oqw(r^$*kQ z?|04x1lfoz^C-fGA=U^IE}=<5-)_&&IYkhGvbpD327{}}B)x+XTn9Ft=O}R?s3sIP zF8}J>^Xu*e&fQa#cD!(NsP*^3>V=a-0AVj z#{Y%UTOo6h@|2Bp&>&-wl1i(> zhempPg_QJeN)&)Bg5HJVDN79U9L~xZYVk2>F=&AFhT<&k9kN3H!DvohZnSk}emFXR zT;7LrMS1WiS%fp@)Hg^y?nCaQSREh!k^Jr-^0adZ&czc-yz^E8<47?iT^*#jwN1PA zhD><5Gj9t zJiT!wG~#uOZ-Zp$GAuZN30{jB98t0I4h){FPVljzc+Li$8$+(tdE=!bj)w%TFf2To zp`B-RbEveCnlu-gXWJ5^Rg@6-wr~GzLjbF(Ys308%Rtxf1wT=Tq@0=00cTIU; z%`pu*BKC4msuIPW8wt-VS9~3^)NA1b%?u1V>jPCi5#^B=WoaI<;gHLRg37==ktg1@ZP;eZL;Qbv)F89>$p9Iot1^}n+?GA__b4;v(Z6- zTvvvyd{ZyNmhh~U8o8xzzT6;E+QRk(y*T|O1PCg11^0fVcvH`lgV>+-Xx8ejRoBE% zdos;C&)_$K7uo=;i4sVB2OWzHLR%fEpG)gJQ>SlZ-?m)!#&b}wqR~+;NWHO~>M{9MI(PaEgvGycvp zK?{RlJeZJMZ6TZVi!wG~T+HA$=iB)&W&t0psEZv!U`c(bjo6djvzj(n;rUp(%T}D0 z&*aNihN>M_{y}9oPrTq`@*Z%Z$`?3{J_5O+RKLOC-=C`=v!&dft56$lx;EEiQlS?-wk#?oI zsy6q8uWV1@tp}Dm;u(FTqSrU5*Cd%xc>XbYTZubo4yrf}wZ<$x!~>yC^)jMWTI5!NXFIXh%D}0)!DrK6PIE!yV$53M_&Myi zWM4TEva`qPphRZ7Bz#C*YwxqFgYWjwDa3vgxXq=^Xx{s{OPY4gfou$_t$vi-$ooux zeAu(0^4Z>^d+{~gs}uy`{sU6O)Z`z)2)Fkqdf{j{oFmG;*C$@Upf6iw9YX|I$ z&6HM<$*L8TMx~RVq!5xj4;CBSEW}ZVbguU-`D^ISa}UbZ^e6sEJ0SLbi@=H?o4ZhCjle6vJ_O}SHe?s#avOoG%W;kU!8%+r$Br-ti|@4Q`$9C|WDG3h&Fxj~Vk zCn!z_|0LL)pbS1aRoxKYeA)R67t1xRZhiR=+(D^L>^#o^N!hsV`do2qm@ipt2&p=h8aaQ+d+n3* zXB+1)9TeT3Q10l4^4m-2|EoBwwR&h~E=bso8Qa|Psy)e?bEy-yfLdG)aE@3A{Sx9W zJfuvAsxjsNxnP}dh#N8_M0($@0U}F))MEghy^i9NE@+50YeIW=I;LhLtfwwtEN5U| zRl;$}heB2_dUgaOa-^0@B@ZV{<=#NG0(i&`K6!2I|k|ftGVSoK9RE9&+I(uDJMOi?0Zcoh@+YzdbmmdVm6cx8Dnn` zEZATh^b*HXuASAtnH=fA6kM;?XegI;P!a+FHepIL|x2)#A9&HDi#l{oOW6b}XC0joW0y$UOQT(DQV z0VK`t#nBmj=}amPB-M~A;SG|o2VqIQ;uw%9l>h#xPl^q6EajCyC^+zT5Wm*z@;Dzh zQvGS*i_P#=>nPL-W6pM*oWxkF$O>0@9uS@)3AF>hEr1|81)2I2o_!P^&Lte=!h+~9 zf3A{Kr^;SHTT0&AboWO9RNXBse`x{EArBx>@ZW=b=H_Z=IOt>EJ zhDuOl0v3tWe>a7pN2yppDn5pitq~Scc`U*dy=!EiP?Lv}{nDoZSDU7iSgTcU>DoFT+>P#D#OMWCyR9DR`P2vjPfq9y5*n z68cTP$w*~fklQBPAGrYZN!BhF{#6UH$*?v7=Dxu8bfjPMH;sColJrzx)vFU?&sFNu zhg0crxeWvxKtlELUZk3x7I1A!|9~Q8wyWkCvQ~EBPDs&TZ$`_Dg2TM@cSU=`+UG-~ zxp2S?*+3HPre8d{F7=px>Bzdm4=%?4hJ-mo-1$b+zo+sU%oPm1a^Kjz3^VyaW|2+i zE_u`NJOtbxR2Try@9#Xf_$Kc{|68c@jjMijC5>lXyNl}2Fo7WY8`meR3QSALpVQbl zN{4aXun6||o$P@NogZ$2Nm|>TNmiRxa$g4~)_|Itfdg|tZ~e_AZ{F)JMm*MGR?v$6 zLK)=#ko(;kXCMG3nG0niyKum=J>>|Camr}Qup9vZCQGw zE?xP6e!wA;zb?JqR3I`b+lr(eMm$tFmF3ppd(!R`0^NJ!i9mYTvB!@EUX3o?y5(E+ zzy@qH>38fWk^}fYA_?&T;d!p`CP`#?Q@rOE*1lIf_1`P6UdKd`V~rs$+po`JcRgU- z!b+Kbe5R0jo7NnHm=(Ya|8StAo}17%qw9IXcq%5=fFUR(*;{!Fjk zS+d>NUfb`WJ)7h`L56r}4nBKmfjQN#^F4Inct|a%0m7Xn8>0aWYXtBCx<83!U{#yO z`=0;Ncc3b3B#7?}Unm0c=<o+K9ar z!}~?(oUkMllJoy#guOWc!U7b|4z(^2QOl?Uk~ttTtX|}l{cbrIMV2Ke$W@X*6{;(G zc*a=~K=i6ggkkSSMWjoKRQ$r!-O4Dpvj-S(i8t)RCnfvyRpU+U`Rk*G6875$_8MfO zo1PfXLqaL91niwX|0N0STcY7w7GE3TSOf=of|K+p@xdjGm4%o0YZ4D#v(;N&dt14T zgBhxMgKT`RN>|_ns5pxeEs6x{Pgz~9-r&4L0L>Z4PGO2azuQ^|UR*%jzNh&mpq^138~}@aNR^Ck$f_5BgXu=Gn5L@dsb62+xT(;1!#0gYZ&jy1 z^x(pEXx}zW&rS656f5+=>Z?*Epi-iHRE&NfcQ?IAseY}jS<3j0H5Vf4?B4#3=t(B$ zY$5tU|II1!JAd306h^?{-qY)fq%XM-UlEH!+g^0C2zk}UR$qJTC(}Ln7-2Sx{3Lun zmj$0AaG(Y|V#;?)5FFHf@k?Kypi1q>5{q!}M~CUSk}JtA23N*BonR>SWeWMujFvLf zalHRJIgQhy_~H&W7FCMi^GJ%S?v;3ei0E)B8J>CZ{D9wA{T8thXKR@G9xMC21FA|^ z^b&xlXm0ff%oHp|kDoKrY98k}#>j;gdGwLBJ+W3t=~0yzcy6Ta>BEj7#C zI&aCoq*pYqAdjE}GB_iYcFj{3DtYKD?4|Uv&BIYQ18> z<)2o5EN};D-*o-}>+y>F=i*bab_Ml->py7*N{5!8W%(d{UBdPkjlv-hrgjiuuSecv zT>)L6##m6#pT36^igsD7*^MW8m*eBy`O`2@rh(Vndmp`d6TSXmla(b_<2ulAS;PD6 zeAug)>&LH?0c3M>K6nOSn&2h-_saB-Sf`(;>e;VKak6jTZMC-9@9S8+_^T55C?eOI zglfHx5ZF&Yq@6bDMQu8VTJSkhvARc}oA;$)v@e5|LjQ1LFNC;CCf(tN<|5^Ibo3NQ zaJSxdkMS=|)p~@W4)H8`Y)Fc{Nj>rFi4#oTlZZ+n8p)3%fX!dcmh5wap6xkOll1-L zSD%>)^-Nf6;msaoGmi_`(Jz_|i_?tM3-&jZ2pH+>?@6%1sI`Y$Pv4Q!;sUv7hZ5+% zq=9@yD9g-Ymt$S)OVOT&v846JB@J@gRAuIiVn@K@xp!{AMG6siz+sNUmF15fl$Yfe zddTn5X9dNC@69s(ghR~%MynJH>0V%dja5F6)+{fbbwFI3AI>icEywk8pKgG2<*f!l z?z|_`qr+@bs%M3W1A*e~>*$jJt&jmtY6^4;7+Z#eS>DB}26I5q=LpO}#CftW+)2&V zsdkWQzt>>$0!x@E8EE-&$1m?I@p@@FLpOhlPySiNbIRy3*`sa-_6dq8T*qmto|t zrBQ`tm}-?GIH@H#b#1Ibotk!3)TUA2iZL?yqgiC4-8vLGQR022mKxpWu-yzvH&X`v z8+#%xQ{P@uvFWG&P8DTLunyf3a#fNq7EW<|v9lb3TK;>=O-)f=gM6EhF%RSOkO;YU z9iU|rC8CT!f9v&mfypcO-R^H5Uvc-T)t+IgbuFvgyY#jDd<0R1tmrqUDX>*J7I^KG z*KKgw)sEE5wle`^nkKhP(=I;=F7(b_^Z9%p-H3C{t!p2VtS)n&L6A#LD-K1J?zO00 zv_@d6dzL`g5w}0@`wuA!w6kwEzO%OrjZrT}00pP^U$y31y=_fWyeNd^!gg85+-}j7 znYRbSR;pvi4k%X>-rOq2NRHlrGOvOtIX+C4zZXR@3ijtnF-J$}UnJ?&f`wPbyYb3& z`Mz`UtBR+w$hcsv+#coEgXo_nZvGc{LQ7^R`i^3;w!<-FdF{f0TKYHl`i>X0MqY7j zxmB{P*oVX+e1&$}jhcrV2%Uy5yqT+`cxzF)*k-zx375}`vtMUzRTD-HH)IbE4ySMQ zUV)SYHJ8B=rB(F7Akl#*>NM9&&D)CcfAn$vCFQ~*zroIymxH%s~hSN)(O8=_OmdSo>;nxm(j?JjGg{_xV!K>*wI)L!rU(Y^QJc ziXODtANJXfGK>`wo7P$%4W*X-0Kb_!gI-EJnQx$0WYgqCAmS5sG+{jtYIxuTL zn=EL=1&Xa`6+L@y;YF_q;&}~K^sIkiS$k05<=VWxQAz8vD+CI_RqqnX**d;vC9Ka& z4qV7o_gYG~rI}P0{s&deQL{j!6Ui?R+w@;8`0zF2?T3AD9tz0Xb0=RFKa!+InzwByL@>Nd@j&YwCZ_abM$ah6v~(ciRgb{Vbx{^{dOW}GLx-{r3{H~6i-q0m|+8bNFRN+ot1ORtWQe!(hHt$vV#RGR2fiFQ(tI2{5 zc(^SUjHUw!0H4?ApURQGp8wVzrKo48sMq|i+ZMy+Dc%)U0Tn0}fUgY1syE?5d~he# z9lvX_p>TtW@B|=|6UsLdon^R4)y^n=p(oUh6ydK4tQ-4mi2#}k(&54n*aIsb>iE5T zv59I>#UjII(6lzH1Fz#{qpXGpId+O>5CDC=pnpZwrHaLClPR5IN?$sn1ns1=zyP)q z;Oj;`91$o3u^{Sg$oUdGr)6r@NvC1hVO_#VWu6$VjV@4~0zz|?&rT|0#o>k%Aw5Fg z4LU@8MO6+ojV?Gu z5=jfw;NtiF=P1xtq1y3v-$F4lg{qIT+DoS$xPUivNLhr^{}WDCl8GZ<&qsFXYHQn$ z0HU4}0KMj}r!{*KLl`Fk4)3$90hHRW*Ms%9;T3=b(=Y96{Ua zauBH7!(uO^LP`iT-)Zn(ROS?(Pj@@w5nQSWK*sP(%4w9|e?@)iR!`@`Ml*AwliXWZ zz^HoQ2QM6|$R$UF$Rei2bIJm5$pQnFaivvvp1bav#b5*LFOZdW0 zU5{pdexTw^i5mN;(&`b)1uAsKh<{%8P~&+=S(@v=qf|hWpjjQ#!|OH9F}Xt(kug@g zwHUN7N8%7+T%QKTuc_P;NN75(yW7b{sssKnRoraSeC(?gZPvq=VUt9w$)$*c$r!2U z9KYiP#7E{r8hBct_9Cq>ti;#7rg|?sb`juG(uYWTG+g6!h`Z3&bX!al{iU}7fK}3k zN_wM7h;A&Q$M<>2h$`X=`*$?)O*8dJkz+dCN4{C^Lv_d%Ap$d=I?RnYU=NG+)^6fj zuOAV6|3jrDK5*x!$}ZsWDDsf*(=akvN?SPWo(Dc!KjmCRN(?e=hX-@t#7pvGf6h7Y zYgTHOP}+zOoFb}Bqm;o^=x&-i6M%q?(Aui0@^b<)H6ejz1dCs8o6%XX>;!dQepuP! zR%|Ki>%^XtQkkUgCJN1sDf?Gf@#NX$*I6t*26nf zs@KX0o!3+iAV(ZJDfR$2Ej%4lwmV&AWO zA}L05Xm_5*`atsjTx}gLLroFD)r45p71-AKIo2(DfHY2e6XJsfV<^SVs0FhMGvMg9!NnE6a)Je|$(;Yn|0O1eWs(G9m7QmFO6n)flK z-DoxVbYjhwSAKUnc%eQ}>bhBp%P&M~YnROlBrQVijpO*5B8}+7@m|~wnLZYtE2xuk zoS%X3xC3#kcXOoYd;K=sw1z}GLln$>Ec{{hsOc8mFxCAltTHQZc*DDV ztxFO8IqU<@eCem<=e`qf!^3=bE*(<7FhXk@;VH&^uJW<2@j4;~6}v`mnVxn~YM=W> zqVd-$%(0orM6D3-f4Q05P}Hosb~_wnKr8>n6uI-|!tFpKnuLh870A#{DM*x{uBQZm zZji0wVFNR@SB7}^TvX4T(Yo(4w60j6=9VPLGh4na9U!>kgSUTs;wZJzR8T4D0zApH zRUC?H03gDncLmy{60_V=-YU*+xy5a0zyN{Y_l$mXjo(IH(d*lle}YtyreS{bVDxL4XS($8VP(|BLmecOR!|8b^jjcc&p!;95hHpTI5zkDvnV{DP zJgmjnH(%dO%!oQ@vSR>q#lzUwqpW%|Y=fNOm4u2nZu<2ON%YZ9 zQSd_SSPvd}Yy-{=GHJSbc(=2;%)+Tcj&O&aHKLWE!yFWV9J?i{!mo1pzTjX8SJvcIC~E`{Wv*qBXq$LVo;he((wH4K!q2dnQe=G$okA`aJXN@jEkU18MK! znW=~t@`b3T{Vp!q;mn9|%rNI+Gy#wU0w&|dn4CK(uof}*DmPKQ_;K2S-ry*7B3&55xkV^f%1{HAReE^-f3Yl;chm8t_kZP$OLbM_e zY0M5)WD+k_Wav~+Q_FOnhPcWf2G8$8JQ@W0UOMfXxj)3qNCY-@OkM4FK7VH6WnXE; zn~&)s__UqHo1X&rG&i1JtxJAyR%_WQl^9s*@I{>YMV|KdSm^^N?u)k<>DN7vO3!h7 zPndc7z8G`QN}{#|^b;yX6xU}o-|vz*)r2cMUqI)ML@0Tq+2+4a;M4AZKlthU+a;-O zwYBZ${9x|e)6Z(8bGXunjN@J@Mjm|yW}s6@wWq;~>eL%|kF-Lve+0DrkfpskR{H!r zZ}1O+XUyyOI;jM&|LNEN^ATJ%ISO4X>vA+Fn3U>s;U2!a;g_FMR-*<{El4mWQQCp7 zds*U|MC11U{_TB5=Ack?CVu&4-!4F#jS00=B02pzXk9|dCdVfVJTp-d!b8})Q_{o& z147@+Jw`K+GIHK+12p$Ny5_bRfT(e*SSEu^3j{vqp=oAvr7yEs7O)?Sx{uT&5^db0=HS=#qC?KuN-Y zp3&v$t3mfIzm44LJ$6lK7AfQCO;k%16+t zxxzV{d+fq3?9VyDd|8T4;;E_Rd<7crqitBWJKJO${d(>8y6;*xh_!A7+)y z38j`Ar43Kyo9)^Mm&hlB=8H`vw+V3h@`CWntH_awFxQIo`6^}25swt#gu6JDf=_Qm zesrp6WWG!)Hn1*s;d6wY=ap@$OnBci=Y(7UC93J*ZJsDLQ=xsR;iRC6l^qCO6z!dz zW@EG4{1^5`{iHHeBIdlI-bas?>U#pqZL8W*wfLs8dtz!D+ zZp+4#@(eg?tKbd_(w1wdWEr;%+V()t>@~6-1Y&E4(lAZrG zXGy$lf6z2W!NI|xQ6#DMrl0<=6(8|KV4=ll`^6r-d~SbO<<=RenwU*nVT=7fcmpr_ z-P7U<`x!s0F}7qfgMa>YR>YpFXT9Zg>qCHr$pq`cXsOdv?qF0hKUNs3W2aOCH3wDa$eQ0`(K$CicN?M2au zDBTx`N)vy1kw~bs;uTM52GOW&Q#kK=jJRDpw^xrsMCq})vxa?AGSlNqiG93FJA8Y_ zkXInnTZyT=sa}@!l$CSu1J;uRs79_9J};cJHI(R8y7wHZMkHNDThkvTmz%cD*<(!9 zht@*RA(h+5?7&H&p{qAc;#+0qF5@0*7=}Uv=UG4|=kfkK`M&Cmmj3R7JVh$6M1lX+ zo8;J1bUN807lXj3KU*r;(<>Ad0fNzpU2I`lF3|rTOB)9~WrhGQ3CwU4G(01Kxuq^o;c4Y`rS@5;_Xr z>i%>sz$MLt+w5-8OqXMNUm8M!4tzy=maneHUu^k=J^-dep`hk)ZDABqN-R*JGV6p= zBi@eW)-3~^I~oy&z^%P3LEs_b2xg$yqUn=emr%qKs?ekt^Rln04W>vU(F!gAI^#YW zqGH<{-?XlhUK4yoqb@B4EpnCffx!C!I2X85CDl= z;$8QOXC3S+=uMW!-RDECPy~1SC$sPy2XOTg8>%wlj7VEM(e04Z<6jgv43 z5tOmVra#Fh_XyS`yV^ZiEc}+GCq{=&aYR1cK6w12s+*WH={^d?k5FR!?B)xALDZyN zard0f6RRgfE7hpl4H$s~x42@Kr58(_Dh7+DkID@NDjT_vcQ|uVKeX2~uE^%BR6qgA zj`%Nue{YS1@E(bPNN}PPO_tyB!S=4Ll*zMmKc~1dgU_s}pD)bO3-=xQ7}^)?fex0y zCynZ~zQLw;P`fc4c;t+J&GY^o;iYtC=nP51UvQtMfHXWt(!p7+e16})f}3c02S96$ ziIDX#@Xn1q+kclXH{&@Dp3}@YGHa#;HaZ)8XyFs^`pByxuVX^Bo+49griEh}0u6G9)z!`79;m*?rYC`li^3s+ zs$03W_?)>;Wub(Sz?-I9D@e?1MVsK;x1An<5#Bz^;NS6Gg*c1_Oh+WQ+de5dWnniakgE)x09C}A{9P!PVZEH|6`Pj%M%b;vOj zAx@4%n9Cfh-wJDquDPh4^$EMvIVkQKr45;-DvQ)o(6r>__jRAu^^I#^A7_|9pFL#s z{MF6mtH9WX1*O07rahR*z-JdnuR-^TIO1GUq@&BaG)CMZoo6y@BGEnnaAOQU~^1Uz+f8PdddsntA-XXw)9y zSh8c|_qX~M4_w*l{n@EsN-v03>T0_{c$}w(H!bd3$oZclH6mEc7VNlxKavDF?dd0G zeE*$>jn=O(?@F@!?gxK3A|i+1@C)AVOK{U|5c95=TGIKqzGhw z5IGtAIMKWsI7keHSDt*;?45>ntxG!r>Q-qO1kkTA{9rmVHG8Gv;QXWy8sS&T_Qm+C z_WJ}S*?D_P5wp33d*e+s9VMK$j0;k6%!bdY)p^kb0i6@w z8vgWjU8xx6lKQlSQu!iKZ=8R)IqG5s%*$Q9R}w0tR>-2o+N6ilh6-9b3tK8+9vz_j z1*}5jqSLg)1?pn(Ztcr6ESGVnY9{${JzcC4TTQz~rYytGP_?9KBfYI1 zQ_UOL;SC$!WgT zc_3+tQUwtzYH zcuybu@Fc_Z7Zs{n-bu?pW?#0@&Ngb^Tdi-euq0~x8`_Jjs3zpD9?c^QBwr*Xl@Xv^ zc^dwsP!>g)^xs*xo zs0CjQZ&Q_l3G27Dv4^`)_st!lJ`OZr)SxXZU-wR|rU0fyc8s)+b7b)`?9qlr^$0sP ze*hwa^b=$!I~Uft&PC`(1b}VftN_I{0X45Auz!I0`q6`hceNAj_#eb$LF}S~gt~|d zm@5!wx)13NRMb1@+%e8(>`NzJRBc;SK2lYcB%0beQs29gZnYb8kX?wsRjBN2QkEYM za_l;@ISKyMRVuZ3a`CrXA5!^HcPSX3KN3Uqz8waTvT}2>4~oHvJQ6{)K$q3HJ_-IN zk%1$@E<32bj#Bv;V@V)8t!6ZB_dzH9%C${0GQek(rCpTH@iQUoen}H&Y)>ek^UJ89 zlO~IfRvoF0;o!nFX9f~VBq7KO1FHBO5=>Mc7|PGSS?{Z(ZhmF~VOp05KX zXf(?yF}foi?_E@q^;Zr6;;T))Wr2FVOnqhl2KnS1ZlQvvNu!y&hhqRZjM_>nQh)Wb z&ZfwNen-X8Ug`S0wSRuKyP&>Rca3&ov~fMbzn-wG`Z&r|3ZQ*Hzdtu#pfJ{bp@!7Q z!c7(txh*?h2Vrm8i2dLwd$9?lv>n6&!$}{B$dJ*k*5fi7ci`!%kx|ltibow4bCu)q z$EErK&G@zZ#mZ=EXB#bf-_pm%jq)t1ls%i=~?(QtS&N9#Q|b zUUE}9`4kD@_rXn*TOz6zckMyeZ)_gjz8vgTob)Q8+vL(fpyDyjgw!l~$|*{Jm+%AYV21r!6a1yu_Y6(i;+1ct8+M-BlR`<1NIKebEvcoEQ2=(o-QFmA zUD_(S>rK-7dDgE$<4xA#$1zQ~jqBLS!mgOzQ~nVh+1AnJ7l3cCuNO^p2|?d#(v2o-v#L4Dz}plMZbWO6eN& zs8>q5cq|pfUFy1)t3klD=~pL(gkJrsUg90c zs9kBDL?Gqf;zS|Q9Xq`%2tWVz-pX9P;Ziq*(D-zsP?rb1wFgFD-XHD1 zX84Ed_D7*VOO9(;)2Zg$bH8U>|HPSt=11=y{j2z35ai4Za6qm>73&|2DwTDof%gvX z`G8coS_>}z>fz~rXZgPQW_OcM(j(sb*_X*F)S5Fh#g8t_l$zfG9y#p!@2gz7VR*h| zC#=D;|1>8x()sFJY0W@6E%UCMdwb`@Vk`eJQ;U0x&-GrtadR?VTH2Po=P&V(Z?n=z zpg*nkq_zCVjEL$8{x5M=XKcUN(q$wYLO3X6U(`Jwek~(HR(qu%>lid^Zef#mbtrUT z(4!utDVAT@?1CnF3Z`W&^*#@6+ieR?QD$c<=z-ix13^I+lfT-lBbc#4@?p+0R}nXS zePG9*4B-re^t8lk)QiT*mvR){oCF`s0#~!f9yi|)6Xbx!U&!U6ab{+q&0^alT|-5G zEuPAxv&IJYDvtagd-oO9)cf`cf2XqP3B3skO}ar4k!Av+N(sGVC?X1IR8$m80s%q~ zO;JHZ6)6e|h%^I&qJRbjrHMg6KrB%a!IIzP|CE_$-kG)DS?gWz+3fRuvXgZmT=(_; ze$JFv>%{?eetlQFEFb&jm7Im_*m|mAT%Y0D_0jRV9&Vu46`yyoxhY7c*+Ah?a5n}E zjMImb`lHa?`q)`N1kociWB216-Pm*iNniw(|OQ-PH2@~8GZS8i_3z&cYHo;M9%%szr+$iRp*=`hIg zYJNeZ@e!XGT_-NTfOMN;F%TsAY286c6u0eSGv~~)&SJ69K)F$=zoz13AbIAZ!jR&& zMtL@INPH6tI*!$9LW(X2+AN{EmU@RDGO$8_42AFM4VkfnK-ihn!@U))7kl$ zJx|({t;aJpA+m<|Kc+!^SuaKMTioMON!OlwyV*%G0iEt3X$~yhP&R!{T00#g->9U3 zc^={Bx9j|P-SVJqs9fBL^o!C*U)m!QLjCQxjf7)QpNy3|*C_qsR2RiFmyBshww~19 zb_T+}e)x@arlEOLRUh%ky@JqyrPj#vd!ApOku~aW(_=kn8Ty*#uq%H)YrQ7x-vyBP zp)jwJX=VG#eE(-*sHp?!9?P#Iz$#jpM|ofvPLJng*(1)1&HCSyJ+VHayIeRpvfsW8 zIK55oMXX$}we*R_@{&vlE&k2Z_}BT{``^yU&TW(aw$5J6@GJ?PdsPJ>a$?;wXRII( zJ&lh})IHKG=6r8-))s%AHhS*wnzYzQ=|BLM6Caq|F#)}9vCA6hsRKkBWLKZO^XMuu{!VerBgHKlUsq{^v#H~41CbYwoX5its>+>Vlv)#>>=@--%t<%vTsl7I<$E2N ziJ?g#7A=~W4IvCYvH9elgk%a*j*ThsOZ$#=}>C+Av)^hlF+^Mjq8 z(&e*g|Jirjj)f_LA6}V(=QywsWvMdd6@KMv!GhnO`@jj=wVdrJU-Dj;Ly*Iz86zrE zwfFD$N}LmPE$fiyt*P(i)EhPP5p5YuVi4eX+1m5lfyrd#o~BQ;MnHu8l0o@LRbxl~ zHutHIJzR-%$xT8;&WAJzFkQOB8h);ccK+!eocHI`H-1o)C*o)~Kk`XflisnMY*m<6 znB~Cw6#VU(xg|u&O(|I2dsf3;1&Aw3GRT}VB=h1_3La@rnxUn0KFocU$iLqouVCB7 z)08})!V)5oA*QjAolkg%F9dz|k7GqYno82Cc!VP9v$z9b>nLT_h%VgqM$-KeQIakw zPS#?szYMr+a#Y>s2I`^Ts{FAScb6Xt=3u47H_y0xCZ{*ty3wwTuH9i9(K|qE(!#uE zVv>T?z0Vtpgr_2hpPks7nbL$HuS|O0|DsH5o$6`bvFtOavw1J(TY%&#ciF+rw?BVIe3K zb%1CM!li<6%#xJA(v`(PV`|DaYKO~zVua7DgI^mB5cua?ADLNfvcJ6iy%91yg?$ajIn1PA)j%tG&X)yGkM0=2{+ADd{*XofYwK7@^GZN&+wi zHLe6GK<3`Ggm2C|m3+8YwTTfRsdb|bAi5ZJu74Z)@o@&0ir(k7(+>C2=Y*S?{=K7* z5$+m=e$SbvuE?T?`L6{+F`FBkm-PNX&uxzoULKS=asp^~({U ze%Jmx>L;GZk|?bFch^tmQVr^IE$Ui>)Qu*C;))$5)jR)J+OP8eh4yn}3249D_SJWt zZnh9^wYk)_5gR+)8z1=BGzHc)|37HIsD`$fJNFOWX^(I2NceZx?@q64YoAB^fL{wc zu&vMY!Q;@50fFlm_HV9V;(hjib^W6Mi|ZHlzjOT({>}9}_3y6Vl)&}tXFPl&aQ(9T zo)$g+AFf~J^YI$aMBUiy#+Uzl*RSV)a{azu`tYM~?%m`0#i51wFP2tD-~Wf}H}{{e z-`bCjFF!YVKR4I6e)0eL2l&6w|FnaGrMIsWdqkDgF^)aZl#uK z3T_n%cmJ#C=TxW{8dNY=X?JqgK=HUnYMPjWo-2!rO+m_-C185h59Ybo{F~_4);M#Y zvhZw|i?dgSMPOPL8&`hk?L+F{tyFSdVK&r})ayaI*{?|K5tuqPVqDDIJe|gJJ5tY|-_Eb^6XZ&k` z3g=Y5c~rUYhI@C%$+05!sR!j#k^9Bs6ZrepJbJpezOPvB464934fdFQ%Xas8*z@=I zCT-zX`HwHo;`4;dZ~sm7qdB@sIf`6~fAtcsq#4c-94-RUPa(P%rIl?u3Lz5?V2G+k zq}urm9WSD@OAf9ARL?Nz8`St-9a9-nWY9-Uk`PIyNt`N5TwoHV7N=cKvhxR|TrkG{ zg-)8rFO?Ix#|BT>M_=*Db>le&d&2cOOixC<_J7XIo3k`P09as8M43W#oK5N)iq)=dY`;aGINOK~0%_yXZ+gp~T z_G6;A<5N#?w5HSgcAemDD}qtX6c9+f{KP06o_S=x~vtG5q?Ve0q<=iMSlgvV~<_`~#4&40yoOpl3 zNm*=cRvNJlHyZoYetEaEYS^<>g7hB8##SelQ+1{!MV<0NPO$V!k%Zn*tL?U^%bzxg zp-E@Q5iWGmA2UmC$J6-_Gklr-)u$H>H}S_VT93o`>3A)0e|U~DB+~8|LuY6vxj!{1 zR&{GF#lbeSnn}Dyg%g^mKc5*d;1J>#iN1i)rJI$nLFtD3zK>MnpBR~IoyOefc`1!! zGgdq9_!$Yc-m8X4Yf0_zdYpmhTYBpD5Fdg^!IcH1P}63cIdzE-?@27qJN&Q<1?aq?uj5y4oFyj zC5yE#UcKOU$B-{0sQ651w`(C)Ncg6>BIwLV>b7DD3*KTvvw+=p7Y8YdLU^z?2O=Dl zPtJ2nmb+{VQC`eu?6(rph*^I4ghXZ>N|4u*p!F*C*~5<4MyM#BVEkwuHI`=EN&g&d zsLaXNWhrT56)V$EOywI(Gg8#$_vjOczvQ1b#VYA;6kM<7x7KB!MsFP zB3x6G;O2~fht6zIkuv3?loNJbxw5nWkGdViu3NG+`0yjiq~wNKu{&pY2Kkx_`9fdA z?@Ha&$>?4nk=Tbg8;ZHbI9ne)BLx>UcZVRr+Px?X$(^ zZkv_PK#|=w^(d)${B;73{OVrNATzQo3uO`GU+LP%!v1waS+2aI8$^ItbQ#DG)30IM z4DOr=ggiEznyjxgX;O8r_0?Aw3XzSfNNsF5|Eu=ZlPE5#T=tWrk!TS%VMi+%&WB6= zx$H4nw_%lI@X1pLKR(UPy?Z|%RPkGq2L8%u6j5ONkvnNBplLhe?xXGb&~mJTgF|)z z+~+EDCj)%Z#_0yPX}_0N=FYb(Jb<;pliQcmcJE!7X!LjnrkCO?8nrU%8d5YNEixN> zjPfPP?ylO_1-P)?I95IS_Z{Ju`7)RhNhK<<=-Qs`*P(G?Z67f7e!az$+?*yNfVIAX zE3Z;MLkv=O74pw)w|TUS;(P=z#J)1_RA}Cxiwk^(dbo+rAUAp3<-E!vCbt%|08GfA z$aMqn#~Py$RTudn_wzc~Kp>>h?ioVtA7 zN%fT_$`YT*m0RUB@7M{!3R>M6sO0@#)afictDO(toOIxO;nL~*H0cso*+)A+eX^u> zYN`Mx-GxJyA}g#xwL22`E*^)ueLzV?@e7a^&%eogS5T4nLBw%ZT($x7TgtJu8BWBU_$ADg^|q?|ry#NOniE?+zZo;>y2 z7flE&bfv<~#f;_rYiR~0Az!)#qQj*%X-!t5Mj~qMVOq{+5N(~Xtro_oiey+cG(C{6 zNLunJOkceY7rwK^cylNvJw0y@TZo6J{(Vl{LlUjcQMl6wXs*1LTt+EvPqN?8JDaBR zb%#9A`6WCL@%U#IG#(Fsnyn^Gj3R`e7q(ro=J%X?UydV;O@_arbZ~3CwSLD5)7o?d` zHY~V|+)ud+GBnEUO(D*h{1Lwdx|}cpb@YorM1ci4c^B>- z4pU;vt`|T*Kca10k-LXXZY_r${D~slhlCQTJ^n^wLNZIIAPOA%IXKtp6H#>Cq z%b7I^nIBB={t6P7Q>2P@n-ifQo5Y@ccid+M%PzxABrl|oWQ_eL_rw(EeSo*nW9+X?n>W|0*EUw$lEE) z-dLE*Gu}&sr!|>VwD(@@g&d_M_S9~>TP}lw#tyG!RT&FAvy-*TVN&2O{V`B%Q$A%^ zPK$!@Y3_ye1=p_0tZ^rqA{KalSy~q*^e!Kz1r<)C2Jp)RuREm{P=&T}!b-sb+6rIB2385waV9HPX5=rEzSQxN~J^naifpSFC| zvdmFj+KbC@Dy7inN+A&~9BNw#3hVMy%wL!l?+c_kF(KCIJki!XpQj2_X*n_Zu=n&r z5p&@TKxj7!q5;9WvV^)4FWo2<+5<2T8}F&Ez5Mtmn8ZOMeRe2O;U`I#j_8)e(Oh1% z%l&@B%+;mKmLM#c>06he&KM!($&%uya(NW}fGxCt<;ikkpL{ZS6bIi$Rm3u&7HoJ{ zM))noZP^&(3I@cPd*uEZU#&jy6jR=e3f;Bo6r2y)#)Mjs6w;YR(OcJY=E1jM&hUI} z*y=?dKPoSQiHP@t*(zSQeE<#bg;SV9In@0)-LhKR9*S+KBH#*pdL1w8q1y~H05Ayv z(^+6PP}b&rV;n7f4C6P_0_W(m?m6~tD zp6}kjhax0AU9LU7ed?~^-e#+GYWenG718fxicy!UZ=nc8p^n~iTt}r>3V4ibtbPC% zPX?WzRysV}zOjPDPou>nVF65`)x;{VAnhs75~n7pJQM9&2@9YKDeb8yKeN*s15Y-= zee)shEBh1xIVV7bTjZB^K>tK4-=}xh6H#*L>>i)el64`!vvWG{);I=ys-Af zwADbq&@ncgK!NRI-rUv%-Hn3p;~`ID&MRlumR_w@{&j0@>Q=>BEbDM><=ML0t95l9 zbq&*Xw|~_&Db?S#sBa0XZ#!Gxezm^i|B8OmNo_IL+75TN{r@8R{U)U1!59j{Q4k!$ zAP!)_R8q%pAMiXGp~nN@03c|uQ{lo6kicgB&O1I}Y!mE3EK1OH7m5da^}Di&U4{T4 zNJz@#5l#HHuB;-YKBij)0*FxH7dTy$Ys6GCQU?RfcA}5~{16^oSR>LgNF7R-1Qsyl zb-erC12Y9f*^qy6er!l6rTdp9KAD10qV~vq1-PPJh-{k+c!WH&M}`3CHz9|Avj@Bd zCMH}0-z$p-B&iRT&RL}Lgbc}mN_i)qCnOQlm+TE5qCy}%G@Jz?b9-=q%;;oennB9-l03({9!km7=%77#X8cpf<`D3IKhfra$ zx0iP+0B{=cIDFVZVCCWQkRVsVfE9SA55`*=rD8xbrRPMP6d!_zm}8KMrBB%Jgz)Ts zx$;gC-V;f|jsyUY;q|4J>ZSrnCDJ1~ETD)-IAESA&Ufoj;D^|ci$gTeHNo}@JVG{v zi~=KhFaZ;&}9*k;2c(9?O+(E!#*oQ4-(KTeY z6FfkL$*`WvdOk7d4HT1ygGs{PIG8N&p~C2ZAGLSvoI0I}^kPHs=g<%~fJgN}J;5gi zC|@2-n=_~k0mL{^A5Kq4>GKT&c!7&B#6OpT0Fo3$YRHQyw!rcmHlU0Qi?KxkPBd-+ zUZ!?43u)OjT%HY`bw#C8kWy}Z)K(V+Nf`x7yS&Iq`0VHgZ7{PG4d=pE;!ryAs9+qz z00)WgLPJ;(M-1`;YQ!{N^#Tf^z~YF8cAsZIj$w`oeT50i87606$a4i6Akw6Je7v{U zlMNAVnwW~~4MV*`cut5IBaBH9!@p?JCa6CX8E5#4P3ZJ#g4UO!)rVo#U8p17C=Uu$ z6gRGN?2#i0Nw(&k4OOCZghHt>N$!|fd8ZNvaV8#hm^>kp|3ZN?Rw9n}Xn^`rkW!z!Y#6Hn4Z#d+ji7G)Mfu`j62Qb?SBMpW%oCq#FqBU+KpL`Nbh{x^FtgBOGbm5Q zvxZ4k{^&DLD)Kyg^wEeyG8geZcv?IhFvm@z1QsF&J=pak<`a6Z6B^otbRLXwP7 zz!k~Bs`v}fu4y!3PP!aXOokhX19R4BnI;(f@7&i=W9cS9lnN2hc9LA!PB(NMX-=jb zu~iBgYn+4f0dvmW1hW+s`WRA?sdLq236VNaz==D*5?%a^| zJIx+$G4&nn`V>wUyP^vGMn9O`O!*Wuf!I27`27uu!g#ZenHA1VPrF@vEb z;qw^KrThJ}c|gZT3Lte`_Mp#`msQIb4S2maqszins3&(4YqOm8JVe`lC`n>jo&r}G zUKO1eV)D^JID|b4_WFywbDQr$+m5T0+YC2;2n4 z#g8tNKEgto$j^T{_n(I$jxD)`aRpscz1Kfzcp^MFFm3!QVRV_3X77ML88Im#)ptS47eMS~Lp?^;AEGr~Y%>@QcW z`&BRqw!0LK^-0_FqX`9S`-zuj&`q0#7IP30WaQ^~KCifer$z--{(0jW_YDIXdh}U( z?_ZcPbKku&v5L@0U$%5!pVR-IO zK@$3n*bjOZ569v;<^kjGPecR<1aG6_20H(tjNc2WGPN^SQmRB?_Hm$=c(@M-k!!fb z*!Rnb2SGKh+h74v_OAoD4QswJ=zT|Sb`I9E7vg&TCz1#3U_kZQzZ=&Ob)hTC*LYgw zKQ1?ZC4>lzlE)oNWl|_F;*9^c9Q~b9-YLohLgr<4*jsy#B43Ml0R#qzMSzO>+Wv>= zXG2%;eD^QWFRZ`BbHO2ZoAm{O=(p%ppyg~qo39v42gN1CK=Mv?01%C0U=v6+4z^Kk zA2n|+IZMhZ>!1L@=a3cv71I%{H-AVLQZR4ep_fETOwV^+__VN`$08Ib79yv zKkI?_YCPOqPJWsjxaR*QtmnL;#jV9;I4F!liLoAB288s^t^A6g{JwoLD~PpT8&xru z3^?ni@Zl&76@Zi-5+RdM+GlOE$yLdZSbFx+D3s06jYPUBJ-8qM->;EA1+^V{`)yu& zxA>Q(L&H`(G?1>Br~GQWHkvC_MPyWVlAAIshprNO_ug>45%%}&#!5Il5nHmf?;!-o z0|aN;Z=X43Xhfjx zi^7R$yO40i=Z*zbil|N^7lM={Q2}N9SSCTD3vef>U4-v+!u~y8;k4<%WI_5d($r+x z3RI*KLiFpQ!8C*4mx@EC%JG^bEh@??x3qOPe&2Q5{g(c6MBb&AU)2O9 zyD)b^O0?fI z8HD1v5DBVI#52Br%BH07lY^md^xBdZ0+;NvzC{5DtRfIX)CCZRu5{!N& z3P^y+2T_HzH>NgH4mdODBN4E5^ap8ynyx>L%UZ-5+azY`>G5@K_uDI4pV1XdFtRvQ zectq^^=8_q7Tjed&ui+3Ku-|3os5d?y-a?=!NS(scfuMMRR+sQnYQ{)g_CC#uJ^Hp{Y2uB_#*KpyBmu{x1cdI4+G zTX9O!r_L?5kO0-&(LoDo@HXFNvw_tlGWZgf5`mS38fD={yjS+hsqcXPvkwc8YQGPt0zSCP=@p9UgWylA zP@PGFO#3&XN87T+C#C0$>sYCVrlSYJTV#Ybm#TPxa|)0Kz{2){ZgU!3%3REqX!3a5 zDasLd=Nu6#C)E_kiE>=5AeOH514~(WJsd>Hj7j@K5`6yJe8mMgVEA~H8H0tuXD{_5 z?T3ZPD|XoPh$nVIRT-k#V6Eq`U`oRnqyec{*tN+~%!djUt3`i4vRi4aC?i2sq_8Be zih#f$fJoq|_L_mtVFhqV^0*2B@+mYq6|8S3Tuv)VSL*JWFT&9#$>>ZHJ?2OOQqZHT z^KT|#KAHF*#!hA^jP{$KUqy7W?j2d1}!3)W+h~(7U*@TFl{SHQ%YsB0}pO`$5RgR$q)NmPXU*54Bfd7-!42 z#s4Ds_40xz%*5PLXQ|0GQ z%gG3Hz*eS#i!f$EI+$9wF=vO~m?>iG{aIi3W0}{V>#-rS9O{|T`r?fbjx}4pjB|}y zWP~-g-jCcA^fN2pq|Et}MQ2QSDT4J7PoZ5HlsT-RBju2pVyM&VB_a(qNrT zNZbTp*nbUq8C{1=(jD8m z;iW)A%K(;B-O%2^8{#s}ZZnz^wS$8VWe?E2lQY`4HtyT+q-Dmir`}zV5jM#BoX@9U zd!t&8x6j@9eE(Kw>pC){^J`zxx-|j)eclD6e(^V%C%OFxOVh{b=FrqKM-9bY2 zSoY)zbushZ1GIHsW}N?m+?CBIx)H}RSRRXrq~7x$?r5Rg=hT&J2Zch7ZWsB}MNIM- zJCA)vjgU06EZ@qBMTjM&uavHctZos(GYR{JyVZT7J8ZL6Pfq)4E_kMAOV?!opu3i> z>NPPc9~`;W@czulu)P+dUe+7?4onEe-PE1YFW<;4@%vodVL~*p-e|vPjSMv0c(W~a zEQ3q^RIt<$sGscDD{1q}-^1)(^XW@zTy++=Pjz7`e5qIC(zKi*L_Zffn_o_)*Pma9J z_2`B&#{n^$){@~_3db(y_0`}3$ZI2~y{B9oE4 z)wuXRtN!Av1MYvHzuk+j9op-(ei<}hu=o>cX;}~6`@R?R)HK5h_&vSlRcZX?G?b*7nl2B5QYM$^9KZdAL%>t0CLa$c_t@;1_SZAE@?BOnbBFo(6C8 zOme#gQ8Kp@oL%U!&bBDX0<&TL_;I5)6Jm`Wk%3~{SBViy!Dan^`a6q~N^oyw|BKo^ znS(v9MV(cJ;FaIRL2w|0*?jLMvB6}30Rlp<18EeC%}C1@jgGoXFsNZ5wcVaSG~l0Y z(Nxb6`(xk5>42#?JgBtHOze$n5xqY&a5X|exPhI84&8&D>6`e5wa(@&NW{$JZj4n1 zuB$mx??Gi(2D$5af7Xd?FwomER;BY)5okbn>|{DJCcDn^hxeAkx-;7w&bNq;rGPKL zcaJM|3gp6+E>Ze9a4L9^TKa%{jbTN1YMHdoDCw*H-QE1iDFf4=<0G<=1@7qY;AL67 zuLScbzXXrdEo6Wd>j&V_$y^&?1P|w&j zc~%Cn*Oe`yDxH4|8T_ng1tl)d4Nu+gx!g9vXX4q7n!;#0Sh&z3Zq=c;S&~tUzh^a6 z^84Ao$f3$Lyx=0D06&zD0;1>y6Xi}B;*)O83=ACv7>~;=32hp~XH19l@vaQc1M!b-t!e~4fX*qCi0GO#DI3S=j6 z7y%A<;~vL`bfR0q!&a6_ixzQ33_NKxYsDcQZ`yOhvq9N0_?kdT8clO@ydCV=b`6rn zO;K%RTsX(@s&_mkfC!0R3=-cfo#luf8GSLN_cnWs!E{Oo1aFR|iFF&MGK}KE%zle; zSPxC(C1YifvFTJJ`gA&_-RwMALA3vB|o@ZQ9aTi0F+8{d0vl&}(pH#d{ zI_0_b0hiL@I#}p9J!U*@(A}xk>GBDe%$Na}1LLV0KGu;B-9q;?%#ui!M{z~J%j9l7oW_~acY3Mm+DV4oa}QwDUfxKlo1fLD{eZSORCJ7F8l43 zf%3EzfPDcb{zaX)a~K0H-g0Fe{R0*X)-$I^>Xer{D2pB2szDXkS84|sN3%O{OBUMI zjD*H<-FT3V@NTp2P>;7gq7{->JNBs9QmMV~^e*o-9e@2|%VE6xk;d6n9k){NtiP-} zL1i)@$ClTrg?dkzrx!6+eI|CNGJvu@t(&lanSBAY&m5G^PDo-MU15c`ee+70@>2#c zfHd$jo%52R54T}LWfG|uoreXPE}=o{=?^qr(wo!YUtT`G&PW$yyoL~?lsI0Eb!&ptUzVhWn~zuKwdM%oBO0P8XA3q<3am#yKM!P z7o6b2m;%K_sPx=!nG1|&H$S;(Fhq8@X?sXFiYm^6{H(s;OdmQO>X*jj6OT#LH4-Pg zaey2^KC9o7$(-3gz&@%EH;$p5`XmalsTwu+W8%Rc#DsPj!)?Zlz=Vq9BYSXwEH(Lb zk}Crj;%n`n#vDDUPq#6LB4g@1nDdoA^$D&2z6kazUN4R?~K>?S?3nOw*k-d%Zq*y4a2Orqvb) zvu%^IY-`i?3!}C&Qhj$RY`kXj%7IRlxVgwvVPQegaC?ba#3?YpI3TMwz&j;8{yhj4 z+;;yOH_FP|g@fs{X(G&}bXIh1PjU3sWGyeH>{Kw0kMyzVeH54yF3w|I90OEXP!p0~ zx(>Z984gZr(_IEXq7l=!GKoeaX2%4DwQ&2pBk9P40P6qo01>}?hGMw=w=^i zE5IQGXjVPoVVfn}TTp4P*a6`j1?FnX>Y-FYylWR>l6ILNE4vcSMA1!wWCZ3=_;jrKtz^~7 z{pq#BBlaa#CmA>Py{bRS@X$KU#{?|Ob_41f*FH9`nd-Bsr{n;McIe)A3&F3U!j8?ZrK(M?VsAm^Vm>V)uiVOE)cx&iDh5@} z6bSf(rWCQYInb0jpWSYZ!_VXgz|=QCWdqd1`~tmA+F~v!M4C-mT}&sfnw9yce1#dC zC(E@nFMUXE<4X}@AdilKumH%!gRH$Qs94OwAik6im6sVn{bi;5eF!!`SN}vUk_K`&_Q92^3thMzVV-2NRedWC|QOd zjR51-fF=z7Qg#4M?oQUYLy8VFGPf4c0Hq9dlAm1%MFyql%`+LOS^N0e)Dk}mR&ebY z31vh4<)lnsGY~-Xm*?#qx1(Z-`!;UV!S`z$iOFIy`U3dR(m_G&GH53MJziE`&uPgI z0hKtIXUj?+b$^QpfT%ug+-n(AducA0tt2-X)m@UTFqx21`_ALOjBOq`4WD@K%fKS# zW!k@|w^Q{8zx*&~2;o1_DI$Vt9!^Jc^#fzz2zNz1Jg-(*gLUi&^^5T4cX3n#y*Dnk zIwV^8@~(iR82}*e1k=nDlV$usU;$VFAmLP|B@JrZfzzQdV-{2u4-q3%Jtc*I^H&c4 z5F8RZi^3}q@0$ikF8EKD4IYEQ&_Y3i{PPBeZiMG$qX1=3s%QXY^z7{gl7xT{&^J%s z766ejXNKHoC`^8TQ43XMes~y7W2#*?QtQ9?qV3o!G&v7Mm?zJE%eUpF#9q$e#8g*- z0D?>vQn=|IM1|{YbdUj&FiFErNYeETu|(*F`$g|k!6G+5UOZ#zuPm;eDm!vF=%yHf zM?1Ph;iq4ot~t&26fkL~xLM4&Yers`zPyX^Rd$5x^hSg`#c)zklCMsnt_jb;zs!=Y$vzTKiCj-}lc)F*#q_jijsq zK##KCO`V7H68B+&51&Qv?cbya0Iho!x1D0#^z~H>1LY;;ZOx(1mq9TAc4vR9jroVL z^01bhkmvFlii1gN;^(TH|E7`V?I+HsZm#ZMg{kT+0whQjKbxLcI#sc*gQvBLP{mMx zdUT*-o5$!ZK;K_U>k{LxkFS{@W4oOE{@mCsC+ao;+*^#4`cKjCwlRb}-wQx60@1Ho z9YCn$R$+b8dLLzpM1&X|x;s`R4R@7V@m$gzF4=idY5eY(y5!aW5dAnT+jPGIN+<~mnE7`KVDYek`8S`gRTyNEbjLlcz}I4j~= zaQoRaa}Dj0JGks*A!(zK^$38FCMsG0#pv4u3jH!ct`u>RL6rWVlCei{1oWyn48x;3 zUVVo6OIfMkX58!)rs8A0r|%Mk}9go|YGVjGZGFsIln zyf7NokdiNAJe{bK%O5Bncg(exJw5@~&R$H?OqQr!JWQx43l>G&*0UUy?M?b9sF)0mP_DBfqhupeVm-!yl zs&4+^9NR((jWTS&s)x`Md-2Yq918mM-hQ&c=fm&u2H-ku!JptGCRHKev8H|{!jnYw z4RZaOBBrfFG9(DHY;p}YZj^lFQeCIfG0mbVWTzah7t#(#Q;5~HANkU(F`?PvlEum1HP30`Y6ROrQ2ku=!>?de`oVypL`gmzxAU1U?EPo^ z1GNn(tdA9C4CbeB%O4w2bT0pn`U@X~%-(g}BV>zq3xF2L&*_rd;k*2w}!A7^lc%HIy zwuT8wXsUPvvdn93_S=I^O&0R^N#u)a(TvY%#nw`HK@55AmlbO>$6>FnelUO9iUQ@P zZWlMXU+E@?W*!NbTc_k^lIs7;g2OPa@5u^H#&mYP;iil+Ixkma~AAn*OvIu70p*6BIYU{a4JNHcjQ9xB->uB2`^dD z)28HY=Gk7zZ_q^psZQ1(ZiuWgTfzY>T%3r7Sg&yLb-2{+ zf2heG$HP4UHlTz#c0t=b6Sc2)K(&_@=B035&6HPK0+J!}T)bd7jxbr=w>=rt7ev%5 zQu~;#4hPjeqi|}LM*!DZ$h4$U3-DKPXRXb^2;Yf815x~AS-IJs@;hvI&o8-JTR^Cg z2u89TFdsf*BCIqSl|Lhvnk%^6mQXq)WgG&8e457)Sa{Pft6Im#lNNw2}K=iB$PwC&+!x9S9JTviCRc{ts& zN99|ofsXTWj_#=PME#+U`gBFJn?++PCNLdduPnxlX-R5?vr-0`hbWM94D5Vhj+p*uC93JSzATT(9#c}Q42DT2=G7^!v% z|6r1#VRWIQP*Z-Z)cw)38;}sVkm?^;4fN4yMFmyJA4my|Ke4Y|q4#`#AjG}6AWe2X z9grr`u4wAHXK|bx(zGN34ezQ+c6`4^MdP7z)TRZZx2{K%zP%3~Q_&xn&4#c^x=j$d zb--aoCC)zVPMjj2cX#_o3C9zH_>Lv|oCu zyIOKGD$Q{)4Sc!Cnzs?v@ErnLs9*r%FKc}12OuE|MvA=4UMy5NgMx2;UYUF_z0Xsu zl#JY)Xe*mpAEGh7mZ)X(jif~0=_prm)Cv@bz`2tH0H(+I`O+;8Aot$s_4aB{Hhd>% zLA_*S(4+RUEVCh+g$Lp~U4sh|&1w2v0JfBMJnMV}RUO>gt_!)0ED)8GH9u+ibSD*N zhDuQDtC7wyT8A zH<=HzsZKA?YNPq>447U{m-g;6;y$(Cp)#Z%s~ej3723P(O)=cMbz0rYuSSVCx%2#2 z)0pN^ z`#|1^hA;QPZlfx@zRWcH=3vHnvEo)#hzR)@NeAa&?bG`vr?WJymh@!MoIAJoNCLZ_ z8OaFn;cD*yds`!(FG*EMhVmdHI36|k$D$GCR{KNgWEy%+OZ;Q16Ckm5m?nP}V`IH% z%v+U1-~_$&jG-Zo$i2F1%R-ocoMj`JC+H#U!Lw7nuQaO6t9C@?p)&NR+>9{UT}7|x zC47@%bSkdFko-<2k1(o#jQ0DJeY93{(zH;-Myi1s53)bW{+k|UFJm4wD|5vX?iV+#qCFXz3-8FT}b(U?@e9Sq{3Ga%ly)$<^gG9{|NgT7iC?~SR@vJ>L?^&6!sRZeP27}xE7FPh9(ahlu) zM^IVw;rnfQYDm?!hQ{9~v2;@@t`w$f}JXy<^4(0A&-nwB+oD=OMJ14$*N+THm zP~#d7K(@$FKOsbON^L>lQpRD6Y5>h@t zs&3DCr*oF1>qm!)lq#U+ZR7CLMgx1x3d9;_y@(K;HXXU7%HI&)#jdaW(coeaZdZ0Q~1k9~S8eT9+OM6&vG{0&5@e;|GJ$HL(Ua`w2YwnoB=XFr^z z9x^_mJ}(=t(hD`B%c_&xPO1~5jha7EB<`!Tf?>AP zJA1K6cFqm^QYAm7OMYSUkh$>P&)FPdM8Iw5FQ51W%Ek133fCR=h+U1>&%F#{7b0S2P0Nyp~ZdLMUU~Bs{M0@k3|;Ca+Kzj)QPS~R^?8v+VUdX(6*9Z zM7a;Ca{cdgzG{=({qJk7JS|?dHQio%d^J}_r(6%NBI2;tJs05w!Aj8~#FeLRdW6Y^ z^5-u;2g3Iq4nEMbN+@C5iQK4_qklC-Dv*~6D0as65JjW@`Xe9yxT=LCLa+_J73y@r z;C&cnzr7XPLLyDEiAwo2|Da^5^2yNBFrca6LXkOKHTVwA;Op2?|M8if+zZ2lc}v= zhLm?suR;IZB)0(VwF4oxNDFN)du6&qSgZ(sKU$glyz%)Zum0&F zeWf(#@}jpQrG~b2u7uH50X%>)Xe>9hE!rPG8?SD2Bs}K2eb@f!aQ$Jj(R)&){dipC z86%M({Z?mXg!~XnL~v`^t@^}2 zM!X)^LOAX84FVC|ANQFK9aKk8!cBRl7>+^@}a+heaOHzX8E5Q zS73YpwO2uUf?1!Mp@a9ks(^RZuOe1*^x%&ZCuJINGFCKExK!izOg zCF%iD4*PS>h_L7q;-*`$7rlHeNXU+O$H*wuz0sEVBx1$Ixs)yT5- zhtLuTy(OXd(5o0i??t2w0RaI)Y0||IdXe5m4M-QIihzg#ktRw}0kH){1VsfaqT=NH z+k4O1GkdP<%$(~yoa7Hko@A}$&gXu=#s;|5rmU?WC4&TLSuPvWkpK8I%=fUs|Oo=2L|gOm$rLakp8 zzp?EZ7>8V0xse+q5f>e-Tys?1y2%kGkY&#gJ76A2F6Y;zk9t_x* zs=>V(u$IWX%2bedhc-{9Nu{vqYg_3(r3gdTX*G$bq;F)7_vRfo76QJXkTfCD5flyu zGbG*B>lU@?E;}^tgZ;+3tPcLZ3Q>$XCwIVLV;*1mDy!i@7Xckh*{%(L@0{eCHSpdofeW@``) z=Jr;KsAZTz%*#B-%BB@(_boyUZ>Zk2ssR5OjAspdPY)q!9CFL&YN;+7I@S6*dhg9} zwi*RMB^%UrNl@81j2K&*TdQCSX||Q<1>*lsI0tE8R(X|h_nyS2`Y9W@?j4RO?lH`) zPVM73a?9yyG+B5C)dd@e3Y)(1uG^w-=ORn zpBI2euu-LW0kJ!~;Lcr$ElJpoT6vr#bb?O63qR#t5de z9|mFDcTh=HSs}*f!i{fzh&yJRlhl)U!i^lWG;scT0$J)zo2HOpgZ?=R<1%9WmaFNI zdPkj?P4l_IV2BN0t^GkBjC$Vn=K0$F@T-aWo%-a?Z*7_$iT!LR+~E@&T5rLb8;sY> zsjxW1)WFN8N%U`RQmW+I!R}vK@M%h%P3q^~sd8cS8}B){;pTlh1zi*AeY#y%a-^gV zn{Mv(+RI7#&=2JHumLDo?bs)Km(OKy`@utM5ULhzueU{U47$F{c@WRKn+!qBg}3)f z+4pZxKwEl%7?d za_<3X^oW(jA1e!EtR=|GE0q*yED-VGK75yRJd_+z7?}K(&0RlWm)N61=J-K$DmFg#aNdYfWvWmWNO(C~xP3%;$5`TPs>I%i#LyQ5Zg5i< zmz56`_8zwEY6|wq+;Sa*E5#j!{;I+~glMJ|ZvHBwpS{rXhddd7aR+pXA_(-7E? zf=c@+_-4h$U-0quJ9Bvf-?_05Yym2S34hwDyZOap)hE65jurl^an58qunkDG_Zb&m z(7D{q4u?5Kp}AzL(+Tl0=jeCi3ewo~!i z3P;bGnX1@(8oe<#<`{}K<^Zk~bCR%anne`jGz3P*rT<@|AKtu7x7gn-Pe3imcJn}r zfH^N=?5f~0S(pj%^P#sSi2){R0^&Tx`4Sm2SQ+`GRt^p^#lEI+c4kO(tB= zGUQ0JL!EiK{tX@=+o(lbx(uG?l*?VP=O^^U7M>l{BmCQGwT{Yf`-lf?0`ljeN3x&# zS)58T<8|DD^BY!0_}$Gyc%GevsF{;loyrEZnd73Cs5qRW*l+2OT@K0f1DwYFBxSI2 z6?+Y8)7AzhA&Q==^8_wEgVdyUUD>G1Kk&_|1d#mncxS@!)48 z&$NF;KeXhoc%p-`@pWnr>!@u%onvG&&x#$^3cjne+~$5&H4D4xXTqgu4Y|kX5zqx> zyE=BFiJF~q0H+I<<7(eWR9ISe|J^+FcmI_RE#*tht9YRMkrqpUAiVQiqe1R#bab8&Kaye(lH0^D@I6SMG_kT$=2K+_X*ov7^|M_9@E4?lCNPhJeTpDk|2MxXK>k+Om6IwrWjD$*psUQgs!x@gF(eLN$ zgkg6-*TqF&C9f*3-7dKdR2uo8LPkPF!rCy_m zFU~pAiZ|VVVw&w(N8=JYaPbZz9?met1w~@U*hL7+^3Dyx+#@T3^OmI;({-;9?`**W z-fN72T|D>PGTS3yJOfIBctuE>#eYN7{uCDp;f+llT`kjhMjSco7}uJd%`%C&(2%KW zaXvC|Lw*5o7L$EjSI9bBl!su&`-TKpo6IBvejaro8QyNH^|)CH$JVMm-zYgFo~QD* zsU_RwhD~vHzNrS|zM{l}+K|#5-Wn@ICQTLT8kN?lWKV8JY^8Yysb_|4rD_Ou0~1bf z^4Y6NEiE2sH3ewx)^?*7e$6OOy9p5(mJN<6H}p|Y2ajIa(C6)bkdXNqhKZ!B-lI=j zk$DsjRmmK%O2fC>8&>N)@|q0h-=c9`Wks-yYZ^(YQaAD?n{4 z8f$vg#opx*z^8XK4SA!IMh!IyD=+sw1O+ZNPGc54(bf4k61doSLfNKpSsa{orPs#b z2a5{jPd|sjn#-;6o}KeFL3)a&mJBx4%W_p4+B58Ja_UJ*xzxNXOtcJz_Yt^_-z_!%A>8Fs(R?PIdDB@)nJmg!KCu84fBJJgStM$y)|Gq%3Ig2gN_?~F zISMWc-2OqS5i;RudIZ2VH@{UM#a;7bxykY=o>P-tp zAZkuVqYH%o`AI&G8jucU&KReH)A>eIP04Rib#{~f-`)jgRz=L{^gcBaKCpVgt~hqd zsTy3%Tc4_T*zAJZysF)|A$0Bcr?WcIZ-s$Sm+$02l#6{#Ryi5zAabMkOS=O3qve*6 z>j%8@H);Gv-k^m+4MXy*xUb7aO1Y$+Ir)@v8{o^}Q4)AhJiMiy|N^ZrJ zfP@wAq0-=J&`=hLtCNnfNZwe(t-1O8I)c%WT?Qkpa}7}XF^7cj0qnBnVr9Dc0Szid zuJgK(pfTfIJNUM|!AGGA1DOQAjX<4P+L1@=PdUXWcN;z%=K&OV_IMIZn-P9mfF}{{ zca0%yxpT*uzmjHY64&FJV~NO!*EnSPs~()G?T`(?J9Xjle-6@l2O`-+&5@DDDTg^1 zD%LZUp!nZKaH6R(97|NWb@9PWrZ;KE4j<|)XRicj<+0R)Z(?CJ=rY8i6qC2r34D4y zWMn-zWe0@7GI!EiD64ojJVQjV-2M3N4fY7&VMu4BkU|nJN!H-o%*SVr{A6^{8YHu6}_dAS)INQlD zs}jdmAu$Ds+Z;73vnel6I|OWQE3*QtT z8_U5#1z`LnAU{urpFUVtk3c%q*48TxrUAN?H|ypv^gEHQZ;@i;OE|>V7!&Df(mqS%2WEon zxx@(dHDt8;2V6H7ihBYSe4rW`WQRYcie3sri_vD+f}~civq><(&E(Q{>punCuY>)) z{0XcTEC@dXNO3sQLe{`VhF{;txjSLKGO;3~zZN$(?d|P@AZX>aHce}OFB(F34#z=9 z3d5~}7*GWgD8`Amjs|GcKL*JNa@HeqcKvJLvFy}v?A9f4vt`=_NnLwDqpdpyzYHGm<}7|k=y_ipd=*cn%~PYWM3Cp6eqyh{n7Aig$}%%fl0F*R8VnH2o#Ajih0?^= zemWE=W5hSQqas5p?H~XofP)DlQeXvijspgseUv+P8m~?IrMX6`OurLM#=+-s`~cG9 zVVw+FChCZfIq!jHOei`ZA6(+YGGS9n@bXZAhXkS0IUF_cGgQ82M_H--6LRg+?q**# zA%AN9GBq=@KykLvRLNj*kP%9)n=xPSCbQlz=kjPzZCYTVS_uFBFKA}1s}qa zsYfoBnn~BA;i-;znxxn0w6nBHq$N5YLhx2o>|?SyzczBfSw_AQz>IR7EBBe6iLYrw zzq2KDazY%bi0h2QrS<3*x|Cgs%uA)Cb2zCTK38^{K_i*no#L{U4&WL?TE5^=YRBX^ zWT#U?=JLN8(AsVp0SamiE6K%4z;a5_pKSGO9WAd%Y13^#q1ioFHHz zrrbY36ThN%;_ba<;nCn~=@Tj%Y6UoSW*S0AMy6C7UlB_Y=gZn>5+rF36EX0y?~=vj zp!5%TnT3;YU}1Mdg7zpd@^{>DK=8@YQK@?JVSm)aGMqZ@lspZ+p-d2@SVACCm_D2! zRon~yd><8|Y`*@nRlVcXaTXMMYC%4IgY$>B$E_TSIOfNWv9`Lpi z#Z`%$DT%poFDB3-QaaFlx=$gQsn$$5A>$8TU@4dncB#{~`_PmR8=U#|!zZ1nR)oxi)sb`u(tsFXEuJqw4G-``UI8xci!9?j-D4^;%c!>D#o#E`Xc%a~&rxvFQ4kbo~^9ZV5 zQdX=C0JSZ-@GsMZ-F?J$Ptx6d;t8l11e#*kNujlLjkS-0NU8))YGFynyF%fm6eRN| z4y)y+7{t!8Y;t1HAykl**y9l!26NvvTp}fu*Q3#jC@o1zxsK9^K0+o`>_>;z@HY_A z6)0NtH~r*%)!o_tw3R!b+wfPT4(8ccZ&CVjxUu;(#nfM-YoG(o00!tKDn|+$FQj4g!iq7u8@!}sfplBC?eRFD&wV^m zE~Q=#Adxj+#V3ab_dvsYL@3R_ClgRgAgI8CL7jx(R3tnB=YLY0PVv$ikKB4wY{yY) zXI3fXKW`f-HOQbM$e?;4zi|{%JFoDtgP`5{TZzfU-V_bU**fCzttv_ zo%qn34h1T|wKu@<8sc?&0>WQkeiT)jBP#&rY;ng6?i2Nuzqcp&Z1?dT5Px3rl4=kF zANynKB2BI}*CTr85duboxYsUhJ2vt9bGm%d)xdcSL9DjuUnO^t6 z`Z=5Kezir`cYy_<21=0Hy|m+ok7rgZ`hiGG24rYlVOXfm8(!YE=c6^&`H{0VW@t}o z-`{cC>iq;PY4xk*X-=k@0J(YFGj3WyZ4w)=e#=2&kSG64=j|(<0{+D|Z@67$2r|!V zpQW`FZbSRNt{is&yZ!@^y=01GAYN_0zZE(lL>_Ey zh^a4n=l;v+H(g%V-*nahQtbSl9EC@v>fSbx8LT0-QQ^H=Abv)YHU)l(QRKDWbd}Kh z^p`QzM6RPgMc_o#WYW1!la^MVa*Qdl5Py=!afI>Rr zPS0%u2NUXUa)|rTNuI}j&yv@i5xMt>3*7#NvSNlxVtCJimR4%uQv2EQWNmvcNnLX| zo$3dtnQxiEXr?SUIJgGeYe$-bI7P=LEb5Kfg?swoq#$x*BXR{x9#R47WM6-(mJe^I z8pdv)iE^dzoqhxy>Hq4}j~l998M(W{J6d4XxJzYdEb<^1giokQKKF})q)=3Y--9Da zFgaZBnUl?s`3`nMLc2;pI_9fKskV z@T{@yE%v=}~ZiXivfCdq0WIZ|OG@ZT>PZuiVG& zUp_JXPFWcZ8$mrZQpPf8t{I>;M26oEYeD1ijKSHmKRvBrK!yrq8lkT;`qd40FvoZJ z$hELjid5>`*Mv9)ieH{fe3JL)8);`XT8HOfauXW*eHQ?2W|h|0WU=}_vpYn~!+0cp z$+%#5nt~9de9#~OJ1Za3xW0=JW=}|{UGIMxRlB{td>?@8f}jumV>)}?|#G%N^R zMWKyjl~WbH%=LZ{GVj+KB=t@G@UNb2IQ+>Ql4&iCGelnxt|P=WXmI?)bGNfo>=@@C6(quzGxo6@V=yCoVeSzoBItm4yQ=443 zsAeq&u#TsG=-fz7DH1x7q(1rB;$q^;`WPViVxT!88b0`vLrB>oxL)>Kj?)2qE=_0i z%Cq?*r|1%&wqjlwr5D`v*z8?v8v&}6e;JCNKSI* zXsq38pqa7$(8h?su0^DKx@K*p`_cXcOqp1gJjfi5Rqu8aIbGcC=Bc?Cc;B;PhFPHQ zb>s5`w{TFjS;V^`sR#V9BI!AMJ~I5i`QaNdPXW-NW}(C+*7C6(-tOSi6Wj3AF0+DA zyVs8`o7lANGir;^Jk<%Wdue9Tc9DRL9}R!>H003-XG_V|@cQSLgy|pF8T80Frb75C z>3Zf#U9ejoyZzp4#qd=XvvF&CzhFL)qr!#^r%(S|iK9kN{q+JZ3CFKoJiu(WU+DF^ z)gjF!f6>U$-4rSiAK*yd?3Gl%xfKV?DddF6l{|sZd9bDmY|CZD)fD<`C8k z3uTTY^gGveV0>Sr3b=J?66ty~_uXd*Y#O+`EkDu^6nr9s1q7uvuY^>GxSE2J_hf!u z4>456`a$epX9GkMESlD%PQIEAL{Ku>7gSFSos_~IB2YPEj4yrRusx*H3{oxnocz1? zqO2O)G9OBX1mS{>LD6#$oTw~CRAQm*yS{@nP$GRp+pq~MyU8UUvo&7Nw0zs}}8g+XB> zS})6wNWbl;N@59(9nlxxHcdVZ_k=>6v+-_+zJS?U&O}3tQgM@s`aRb6><+-X_u1@J zMWwITY9mKL2i6#H1dj7~<0T)79}_gDjmnGN$ zcuKCvb5?8tM%p$7)1MRwb0=K+V7#rb?)0?jyS9A<2n=SfWB?S9E@eCH+Qd!!1tw_Z zsO7Q0)TI~jakfY?QZ!!)fVJh0>(%n+$e%8TO{xzrTvXvOnp-JE;~>sBXu>Z4FvIUg z{)3p42{tVrNN+bhH$Xe(@z(fiVDzw1T^JUb;QN}vfMJ$Z$w-<*tF;Ql{22}N^)-{$ zt~0W-bqz}Wg#ony9BF4oGtTs795ydA7T%<#>up~UpyF=VJ!b41#`#xk@zje~w+Oyu zfBo=xHk1>$Wxjvmi0JVH%aeriFpGSVfSn>7xb{sp*puoxV`p{p;`RtwJq#@_r8oU- zH=@n3ep#IZJV`oI_r%?jQZ0yU4e*&|H;Py;wEx$Xs~uUGrNw zAqNa>v!-~v%~<;{?0~4vWG%h{G-6kRA}&X zjK2A|Ik9L-`cV!?j{d4AUm|I|J43-a&N$S^dl#;qd7j3h>mdocCfBjsvR3vnRAN9#1Xg|0AI(p2)NuaX(P51M=<}w8FB=+lKAAcn?9(Bnug2>7}F$V1@ z^}TKjekLSh;@QDr`#Gg{Un>w{IWA-$?k;;2eWC@3X2KNuPmg#Pt$t)aw=oDB*Y~*R z7#m%Im7Oaz^5%iHednZp$@$i z3X#?kyAJkx;$iah&1~QaQ$Sb_GJHNo!mK$1A$t1hqc?A+tYdDeZ8T{u-haKSa5^1O z=p1}#G_CqZMy0GAz4ufxCb|^8j;gV*c6{|@O33v0IVg_y;?pI3!?UOYj)<812iLDF zj8Uosy-8T+`FPYfesJik$#IE7?F8dhXqjq+bOW$5Q<*);LytS*MBgZOI(p2!MYHNv z!tp0*EzASP;uje7S=WR=`;r)*3Lk1t63C!~q(LNbykl4vo397=p)>x9PDAUjvcDwC z0H}Sg&Mo%548Ed4Q&#M&=j7kRPaga<_|kfCocnGO+_yTIPIq1gE6Wt`Pf2cWYA-9sY~i^ zqayCaS)&+G_zkMqo&;z6JesutU`R?`>rT&Iu=GbbmNR3Wbu(0U{P3Hn{FaryEaeWk z`TT{8GW^}8b(Rufnc(E+4BcP_RyA&W94A+l7$GQQ>6YHrC-kd1-6>r@RVPm8TNbrn zde|Ji;L78cZ9cjd)Ep&E3Cei5o_(eyR@x6xEOMAt56xAFHDpCr^+jBCmx+rFx(GXZ zK3K6)P%Z-NZ&a1uE-0=3-7B#PIP9M0Mb1m?hMDc83;89xMR*Kmt3D6_RL`6#RL_s> zhD}w_ce5}hH|05R%1pz20!@L}_X;b!699K}x1j7wa#85$flXZlkl9ys z$@$m|3#ZTVlDtAPQ<}juV>BTlg|}}CW@14u=<|_lkz-YMOa16pnIf51IhX}FjWv+Z zNJ#%2eX`#E?_-aNr4sF}oKdF?_Bn8{W0}|I($FEO7)QSigN7%rx7cB@iAON9s?5GDD$TH%W(q~xk{ zE3>L+NAn)&2*kEZ_XtP_A59cmO}iRj(^umApcya)jwG(t*c^%FmPnj8c1`lrggc9viZ{!ANFG^3#d~osxzFOuQt_(LJca&svU9@0)1u z{mW7^Bv&GJ0uZzS3?1na`zq{;Te2t@3H50fUu;Y_0dy&WGy5L~s=sG@_e@+y3lH<~_w|DqNB;Y1k_D|D3<9VNArCAC2q(3db+%v{;KsvjM#KY%HNCHLoM!`3c-YXaF0v^!mie^reR z!oo0C_}AIEM0Zf~H0WH-H6aK@nsl`T8Y)dLgwwdS`>vJeC3fn}_%5E9x zq*rYy+Sjw^(0fJcIl!v*oXrIRk<#Y(-RR-^+K3~ zH$qFxgC;>LB7Ihp5}x!d;blQ6)7JSy->83to`nbR4~gO_@gu|pezvxRU%D_iaLFEq zmA?zzlBgFFzal`xM!-_3H!~HL4wEy>LNRrF$N$V0>!oh-XiM?kNUAMTUp9QAm-s&*Pc<~nE5qqV+ zQS4;m4WWtH@~WZc(pbD8ph#)?fFJ6gzx*RRNS%6p>7?$EZ2JPiy(39;&Oi*D7pW3B zuyN9G7!KZeis2?fPqc{%z7t99qg%v6f7{&YF}Y0NJ7tmUeQ(|>5^LSz$yn+c_!tKw z-Wv`&PP?OKHX+A5VZp%67+^d-*_p7JYB61uXybUJ5ZvZzLJLkwzvhf({#4GNyykQB zmd{;J|IzOyCJ(>B(8}k)7d6D(^@o(ln&l|XM#+a@7J=$j7X`L?%(q1nbwQ0cz;Eu4 z^}mK{xbl3@OgBrudjR5vK)jrdD4kx(hfK$Bax)-OKSYjm2q=}N*7X7{viCwcu5f7I zhU00nNg~zzLe1_&o%f;>!$?t-`UJs$&eStqYR4+Ct7wW-$`oUXEld;JS@A`^E2?7i1mwNF`j8s640V#GGH*=GubD`RVWZ0{(e?Y=haNtQsikiT$4i{P_#YJDIV5Ph5>Bf@(1wBxw2e6DjE9 zqkD}qq5@QQesQm%^3D>w7mK~?0Lah+#Md1M8gM%VqkB_^2ba8I3%s{0&&n^?xhGDY zB?F+(b^f_3{$`rjX@=zswu+Sp0{1Jf@v?7YkBou4|4`UFhgUCBNDr0?Zu4%dcXW&G z1W$NgXMZJH@f6kh6bp)AIRH5Bxx&NHWJkDg z#8N?I-_W7g!fIyf#Hy1By8gq^j5&ld>E@ZM;2XEG(x-Uey?9W5b5Z2_dQT58sS`N( z_56yh@f+3MhFXTx*~ldK#!FGHa9IB{G{@{)il2~=f#cPab7tR>+Jv!mEJyT z4F1&CtoI9@?=$z58F3L#q-|E$DB6>v0aJ;M-1g$-)wz@a3*!kh90jug(*3O zAq2jDS^46^K^UtM?87ibo`}a;zrz+ku9=L5UVoR}#~U;Ue%v0p{ElZTjK}?&k8a`8iny0p@tnCPZAlPX3TOoS7o>Cnc=T*0gi2sVwi2Ftx$PVsF| zfr;+Cet^BKm^z1D?W*uWH@)fGOo=tX!h8qe;1V8ck`NjGqXBT{$ayvkVFd>(( zV@5;Z6Db%_2U z6RytO+z6^mQ{FktM`M%z5nUL+k^)5!FSz{J7OeY$DqiTy+?q!1MaUs3xNm<=Ji^Zy z79GRbX|FgR>_znRhLCpNPMygv{0YANSlhng?u(y+zQ~izb@?T*+<^mT^a6e6UX?of z?bX@b<4+J4jGf8lzNl;H_aSd2>VUcCU+>+K=U5GD#?8AMv*nD7M|!{H*?gP2Q$Xwd zz5O3KmIzp?EfVX{mUc2 z+-N0>8(j|NlKS5g{dkVo8M|qsJCRg!nNbFc-}y@;y+Rxdb%c^gW~FkKTV z=QvaaAk@N|!h%&H?6q{B2_dUwr5qaUkXY5l!ptW_5< z=67B!PxG^-RHTv=T0su!48nOI*hE+TUU0hds};M8BkKJKPGI z%a8Do*qz620i{RzZyS$I#<*wj>-u|yvP8cD@?Nm9LzcJtN6(16d_Qg|osDOjq=R>O z7b2grM8BJsjRc4t`@1Qp*wueTze0ru4uKy~N-DqU`+r0~nJs$>K^$GloVTBv)rieb>(?D!Jswhl{|E0o4yp%BLB9Sk@V?Cd!28alDt1b=KS$^Mt!TUP@N4#(Nc>4_&-WU8Yyf6CS@V@IKcK^cr z-2Maa^B(wjyw7iVD&c>``vU(H-WT|9c;C!&=!2(`_ZMRxK0P(}{C|n}WiiHCe&6}g zsnYS8>Z#d__vimJ-q*AEtZ(_n;L1zt(renvn~WD**{|N+{x5jn$iMKu>DL<%S$N;u zfAGGQ_a9&V3-4Rs{qleDKH&e?$NwSTSLWPis~7TSx|Dc)y4I?v>A?lv=y%VjdYT=o zORz5z(x6$nTtYGd%k;JJBJDHi8^5h?v^}}%-V^#_`o>ka%VpSkt9t*mOb$Ld$0|m} zwH1_*X4nqV^da8L_shE%_iz4#_d$FcAGZ_~T@hOBJ2q3b>&$1swB)lL=zep*O5@~9 zjw2;?N(L@2!J_lm5Tdr9nQvwWZ@gdXJbr&%kFEHEn24osEq&Fz)UY&&UBZ5-fA@9O z-D#nP)JTg)-4)Bm^r69T@0WW{ev-4AE!oI3IZ!Z*dW-q?Ve`>d-`N8#Y4ey<`KL}g zn~9nodG`L*?43J*FP17Tm^yzQaT(#Ewts&`QEhLKwLf5V^5s?j#Ul*gD zyR*f@aeiqC5z~;0vgoH&Q;|60D51oAT60QFTTVOGp0@$WDn8aUATIsl21d9nM{8UV zW|Kgtp~JU9IW@^N(?vND!enaDL)@m_bB$THDXG%Kunvx#S` z3({bO$(^XHtyrl!ajFd$l*(i0n2IY7<$2+X3LITe}3S9DG|!-V=D7<>=`<$oHmGl4sI|E?EgIu1=1y<@I->1(#1g z;mY#%+MQ6xz_YG{O@@s5^BpBvbM$R7>1^bmazspg z*!O4be_9|d21ki~&mvB~MIP|`oi;P(IaGP^$Fs8a-PUp4Z~O0=TYtPh&G|MG5ij%K zhEJkZ|7see_t<=Xh82$03HoA{{9e9oQS45?>FQLZ^`?bAE}JVmE--Dri~GQmzumVH zB>Hh9rB*5iy;%vjU6(anDw``Ne=tg*WR2VxxQXPQi)&1~amh`hgFrDUC`UWReYzc( zK;*2-?Yu0ZdSM_)LV^E$)u$ASvdCW+pV)iuT%Rw&!)VMTm0uPT%69H2QEiNC&%B*|S9MUU9iIMdC83%e;*G==P%F>I(Z0`h9aL8mOR;Zn3xsF+>k}>M=&Zar$6ON+s zP|m1ENb3E1eiJC0{?|@bablg|#AK-;+m=R74mRBDTqd2etyH>I^7OyW6IqQ&{Tu=wXKxbw!Uk z345Omi1ZkUo2om8|ITQ@>*j(vTd8Q)h{V6F#E>Y*%iv!L&QmB5$ml z@Q|UR5k(g=92xK-&7eFvCxj_H2qG5Hpl#BWZkUqpcm^kZgB%)4CzMv1+^!LJZt&MK z$lo~;s4Xzmv)FLi^xGtS1)bBZvW}@r6NMR4+-^3#MKgMBb64KEMUCH()Y*PdK9D0O z)ZFNtjC}2Pf|X;mhc*^ww3}5iTp%}AbA(4uo=9qRf8dkFMP0Xo>C?fY+a#pP@a=wYI5x8;LCeW z-=#coVdgyZ_l|{7qSim0KG{jPz7Vlp4Gon2E~uV$RY6xOk$x->l8oUr1gT2w~@4;ifAh(C!Cn2d|`OLP{2mKq)<^> zjDuy4B@;9R2l?dW7@{pH4)*DI{WaBBKZ@f4>YxK}S57%#Exlmxo~>zTSa>7U^_ae~V0TS8Co zr9$EZoCp7eLLaKjSZ21^tse^Blj7S`D%@S+=Tj4;+?>C;}SY1uF zNyj7~k1^-D>TJF2muXb@HIwiI2b#|t4=EmURUy2S z8CGd|#8eRzM|`cgWk{U+K44Ns4b5{TaOu2~ z9L^DC)0aDo=M$tYD$x3&kL&7ItTp$WSoz25iTF+7 ze9Bq15k148z}#Jv znvZncUN_xa%>bN@)}<&5;n}QkGTOLQ_ZD;+!$3fgm$wKiay0WAi0y7=CSR)Rb67^W zpQ)Q%thEbmC<>x4d-jwi-(Q{#{xwiq0Or6~QfBybcxo_OEggDUTTUUuD`7d?-OnM) z5|hqj&x=aAu8IrwNAOSCZ}{rh%*RGDS#yJs6W^^$8^nW z)|J!QIg&q_TjiuR7Kizsn#|QjJi`phi&PJm&4)YXnV@s*uRvhD`ExBMxjViV{ZNmR zWM~&Lu?VK2DWmOTL|u*>n#|HH1{rjo8mv067pcOTnW!)ajis>AIJQ|$w&FQtHWd** zm(2YL6orocT!qd9E4RdBM5xfjowIBMLS+D3))8LoNQf;F5l2TPQV}tLFj+$rK{MN` zN?mvnK!DPUjpSsZeh{G_B@J!}eabnhRqyD|0DZPn!+9Sar_%2w zpl&@O z1gVIUp8RwPyP zl~54in=0by;sT*;o;74vr>LVIW(JE$qDvS znlCNqvgxLyQ3#$}C}w@?GBi=!T1r@>%gqBF?BhY_3Kg@?hHUHd2t`2R98doGNf-7M zwa*DBU`~?<>Il=)JW5*Q?ZAu~26_PeDdU z&tk;I3eno`8(UA>64@0|q!k zT{y;B+Mo#Pjzh$EUa+WXJY`+a^BI`~Amd1gC^X{K9Q+g-5k*480mvN2h1)-y4$|ML z?(6wx)U@Odw&bt06zsPY3AdK$x0ZRfRwTAo)wI?Ow$`q+UfOS^3%Awlw>5aSHT_?_ z&)MLHi`Na;q#N!RZg}3h;r;A}&#xO4kv@Nez5uVj|8IC7;Dt@g6~P<429LWS-8xI)b%2T^Jbh=d zQ^eGTbPHh&$OG_!TennQkQO9R+kG^c4myTI4%!U;H9=bJ08`JD)Oij$z3rkW}Ib_P5$e1_Z@mh=KrC z^U#MfEHR|sd;u(J_z$ZG-5ycQS5EnFOx<}n)a@HL{?Dw&7>s?5G4_3zB*vJrFJl)* zLy|pPrS+a+FqSk#mZ%{l)J0KkxE{A= z4ZZ{DP3qkb;?MDc2&|_8!`hiGaBU1Aqrz{X>fzH;+Bn!hl)j@g*tv61!#FXBB1}K= zg$xLg?mH)1`Jvivf~o*uD_Ki)eT-3Fg@XKCj1?<3gJB zUfda0DiearQU^tiUxu@~A3uSWv<&f+o#Xi89C|nuGtf7q%%|#nS)izVF)#;o(-r;N z8XdF+(cBsm&Ieg1!j?K;{q{o80r)=BD?SKl!yberjqnG3^l_l7Cu00NXwyVkbW88o zC;RYEz`NE%vWc)gYc!2D1oz@gXP|p-93gZ^q|qCpON!ryASfe_OcJLz4Om)SfC9zv5OlJKkKe^?xAp8_d`WOC_hCO_*^CyrFM7!1GupUv z^x!2lWftwj0ZULu_o)Dqq?gf&FXJ!Cl}y9*Sb!pbs45X^JA=-kj*DzVHCup-vtm%r z|LDN;xQWcCGMPq*0A|lV5TH$kpT2|6z`?_2(S9VTB55*(EG7gDL~;d?f8U+yYWKo{ z=7--T4o`wx-{1L+mOV7q<}P-B7(!`*C+W>}+>y}aabY$%P-Sp8+z6s9JX?Z8G?T>+ zZ2_f!#X^Lk;YL%B_s!bQ1IQNsY8;p8n(%Jnr|pW(k!Se$pC1k)LYc&FvvB}CnmWBU zDGyToCy~ITDa22FReK+$n`mxl7t8b4dsk0iS?Xt zo03$S4`GTuapNnF^U-{6kPD0E2wdN{pxh-b($a5|@Dz#z;cy>hy%5Ja3v$)4Cm|4H zC5elb|I_Vaaa=0{rK?r*n6PdGZihnBqGIb1i3Az9mN>EjQJUl9ee-?=X#UkEoZ4@@ zi3YWR+o#2%sEhl$hU($~Uefh`Q7+h<1m7>R5Icevc-CLS{qRo}Un`tERq#p4Yu=U$ zR?wFKGeKYC;65HJnKo#FP(e6z<-#1gTpt$A{3xCDiI492Z1LwWL4h6;Z?Ew^I#~MV zN|g;*;2Ds6Xij~2!Uh8uRT6LX5O+y{nz2CVFG|SIfUI#a3Tw4tWXy;HO0WTLiYykR z;5`Q7F~F)?^(U<@;Q0j!I16N&2qj~dUX!Pcx4>f5&yH?@C>z`pBL2ZZB8anQ#(MM4 zgJZq%KQWJ-IOjVzXiNf&lLR5G73HpH1{C=1&!3NwB+kx(EBC&rZ_JgjAzq0v@Z6^I z2GnDV2UaHuq7wl~qBx4vQK=*zL)x}T+AybrFZ`7Nw*c~Nur(joLw}X{x1Emy8sfm> z%&%WV#oxL?Bew+XY{la+-z-~UcMKr%pSP^Krb=4C2e=SN;4>ujL*_cPWNQ;C3WBk= zQ$P3fJxUz|39kg0rE_+o)N?b4I@+GV>XY}Yt6B28SYX_Gm4E91RLw+SMzpAp$R;sF&Sn~*f0(hen7UcOUoCF=&*rMn;#%{#tWr1>(%eo5B)M@S@p6Oa$$P(Ygxm)-z| z1H}F0lT~d76Oo5Me|42Cb)z9}@^B)-@o(>h=W1T0rWjhi^?Qv>7j>|luOkWP(b02< z%tDm}(^%q44MwWyL*E~ia4o9Sx*5s~m8L@f(tx6$(8=+!zhgd^e5F^S> z`Bz#e#_fLa$d7Yf_WlMKA{W0gml_L59nrV`+`n5Ss}}(Q|s&A`{S+a z4h+e@$`>@Bsfg~z4to$OgmQC_UznMX5S&( zC?S2t7ZVH@emp4{kZPy|hF6zqr#?==4xL%w8c~3^gi@bDS6vbFVdx6|s-f}A!Z@0X z|JFRx^fxYs{O*O#vm*V;BhQhu$8fX^ln#pm7BDLITvZ(XWPAAb?dPEY%n}C<_2ds# zSFQ3e8~}>p0#u>OQp+6+8$ldMa*8U%;B$KH0!n5X`9In2XW#eL9w}+)LIov)MWVR- zMfv$HOa~(w1}E!ehX^7t(@N>o%WUh#Fo3Ql+b)=eMXgXpJ6f`0Z=>iT?bSZ-cm9>< z;4<~2x{!elG$h;TALJ_YMj)DKVxtXL#{sbDThuK^SB9Q$uN*6||8`VZl!|V*=+1zy zTtrfyRQru3o&8RDe}a9Fy^w=O_yEYy1GM|{HADlbL`HCpOq}f&R@$9Ul>^_-P&<`YVYu4z8Rj0sjEbO}WU_N+Uo`SyP0YGO{tr{C8ec)>*MD}iL>iyHQ_9N9{DC%wnZ7L-w&IC@ku|7 z_?6lS^>o=@-!}&(wnf@K^hqwRs2M+Vd8)0XB?%s)HO~*BFxE{(MV!Y$--j$Cv0^=u z@5A-C4BExx5E(gd>D=-_|2{*%ql~*oA9e8sC)NEj)~0S{hU|Ms|3C#b#FwKDEYeb=-))Y9;I zmG=pntNI7AcSpJoFMnYma9zj~NW>%IB!(6wKW*A@E8 zhzSe7t$c_rhssnKhf~`^x?rIp)^4@VXLykn7tK zk3K*Dp!Dmx+no9%k8?C*TL~bJcl}#p^<6iH`>8jl|31dpKE2`nMLfEV_myn;#SN_V z$Nctb4IK5{dfP~Nd0OSqlio)=4|^`&m-wJ=V8g4J{LH*?`oh4uQkr*y(qAk0=PDDg z&lb-cM3$qg{={0P5F&xo+qbIr3{<}Tdh<`xk0$NU7q913F4@*u4K0pDJDT0=u`S2( z{Wfu@lpMTjC$P~$yq5Fal&xjQX6!zOK`ZW#-7n|fN6?ErKWdJdJ~*O!(Dz!-;77J* zw0ZdefR;2D+vo_oCdfJ1g*{+VDtqu=N>{VQ!}7qVav_EC`HTqFgOM2rqpsz=|7Is8 zx4*Rg;r)Y;?tgn&4m?ux#g`rBb$O^--t&1>PO{MyJNQlkSnJuy2v zqeQjS(yF&P?=duj&-vN3j~%$T{@AIrS6r;4-01n;KON0J9Sll`XK}%;D>=KWo!+%p zO(}xSKEzcmP#wqCyOPi-bWlODC&&%arpoS^?rVrWSc=9|&Wk+0CfEUa5+2vlm4SHb z)Bg$ggfYdwEA*uKN`JQ2lbFr$$9Vw}k9JcPt}|MXDDa2{jC`^Cxo z54ahQjaOdS?e)b}K4tJ2;PW$`Z?EKB^zHwLj!+x6n!njGb0ufC=|#uZp>p6EXXr&k z$}@)1Gsa%tqL9t9YG*zjvGQ@CW6LJXsi&dSrhVvH`P8$by}Tw0GV8HdH@tH=!`xtTmkN)ZeVyecu#cP8#U1%vH}v2r!3m=kWTzH*Fo@gz=6>$MIE3-}9`ss=KC>sA<@`1dITeA}uhuzU+cBMruo{2W zzpA@EEYVj))`;h0ggw+&^hJk7uiv+jo&y85U(uDS7Ik~ z#7`oUH#m859Vz*Y)KsrhiX$WOMRSi{`}7NoUXJI?n{4!OX02DPkoOPyQCGr1Ho_@S zk>|8B=vAKPo!vg%aCD&I<{*PQphITlqzb;-=+KY1Dm;%^gZdc7yy8G!-nIA1#=JBq zdYI8WOWZoIx_MefY}_9qd9c*JMa^ZmzM zLg?dJ%t6MAccbf-r?G?{{^pZF4PMc@r=(#NfIry16z&hF=d&(9_(q(@2efCTfD+N>{ouO)lQw0(u(96DrbZh2t zdn~C(?Hxcy73IH2T!##pC&E^XAO+jcTU%= zk7w_C+e?ixFg}${f|Gn;?hvEvbT-$1#lp_wDkG9_Kk^mCzs|j zIa7(cP&*@twi68+_^+KARX7TyO8Jn!4ss*EbwV__mkmTml)ld zCUJUJYQvQ z+;CXwmxw%qd-!8Oc>~#sIF*42^iic7PypAvqF^S?C(C?34zZ*@;eQvJNjAr~qlV9ZVpXD;co0N3kcTV8iua1fI=lTj^*b|OuHwd7(% zl}bww?~?k520oiCpMQbz>y>W-8F86cXNKoeZX<3BQ>sK<6!9EE8vufNxR{y+_Rgsb zeOV{n06G*ZS9pPeN|-E_GVxM{8aBLVtSC7i&M0ck!ErNmF-LDZ9gkWr)(NCN!_>F{ z^YUfs@)pupGZE4v0ePnwW#;!yrl@~~sVG+Z*QDIvpEC?r0P=M~ek4rDLkaz~bfgv| z(dOALT|+@`$qA|gC%{MH4WOI|uG zQ4i!qGhj{KZa8900kyzyqSDeQ$yfB#z#=S+aNzOGcTx2AAn#W}!oIRKp&8ymAqTag zrflG&0|HC|nXYVhc|er8@wb?tt!{(m(l)ZosLGb*t2T%;kl?z3`PADV%v!+8X(&uP z*o=DT(CrVBTN^DNfXwd7(pH9Q%jeu{u{v+km0Q-z6Zrz9tiqjkrypI9k1-z1Ui}SA z_c23>wu8@aOW?O?(9#$%7xb`E$d;Af0dHKZ6W2-$&Sn9>{mb?pVYJ8lqmMB39j@ZH zGHzz^rd8QuHY!l#z%O+esv>jy4hCwg1;Mn`-eN6?T`kgKfn+=p!kjAQ*V8BW&17x` zr`{HXp0L+OBq(XqZFbk{0jdBsrHuQaVi#h%MH4`Ok+G#sI20-mMAjjwQn=L&6{pgz zEjhQ8%&m{%Do`C}_&}WaK{2{2Vu!8{AO~nBmg?sAUv-^m?N@VQTcJvClD0<@OYFE= zmS4={Ll|i@sxr`a51eV*P9_Fw$~aMPgo1GZWvz_cgEF_!P%}olWZ<HwgrSbf}Wo5>LCY&6uGf+B_~zGA-2j zM6STYP^DiqBt}ce;MbfYYWVC7v1(BS$txYn-Thx|I$kP zMii4|oc*4bKIWgxNB6Flo~@f&3%GP7lXd*4F(kzw2~MPe9SigCLZiM&KpH^!(*^ug zy<*2t>;QRTnfKs_rr*LSbpRF0Ot)ixGpB%_|CBJX6_Zbk=Z)Ia=pN@A9#HVAWm<{A z#40Tl{LjzzO!*ZyKmoj{kdfHL*WH#9Wc@G6i7C|RbvIHY2Z6v$g%82CiJ zXDg?+?4^D^N5ezr!n2J!3Sj9dX4?L)99^RYLI5a#(!6TJ5I_7FJK8`5|4wue|DHH7d%lA-Q=pJ?bT3)?XC=M`AFbz=)IvvrxMs6ql2wX}UY zKuY1#Vo$E|pyfxhI5UEp#WQ}*j$0K5~Q`3@*+H@qwa6w+h@ z<@L($cT39nZPQVTzFSoOt!A1yAV}iai8xYQ`;*nA7Baxm&H-HEw{V$q z|13s%$!l8=l3+qbey~>Eh?b2?Erw;2yF=(AxZ`ujL1l#c%io*COs8%3LzFhR4|8_A zE5TV`^6V(D`p^IsEFeePVuKe$%``;4LxT9zmb+G;ZdnQkL$3_TqjAs5y+|5QO;1`C zvDBNMn1pT@EeZ@tpDbZJ%NHko_RI{~#yO*)3S-r_JGhJn>>(V+BX*cl1fLr<+mL|Y zWZLx@fLd_E_5E?9eTsE0=2KxGB=OD{7=KBuN4aWjR5W*D;xhOn!M;&q-(Lwl$60br z+Rqo%C)#hLEdkPux?tfb!d#SHxOC7!{GFQik2DoZ1Ugw=2)+G+93Dp+1rsZSC4|@f zci15|-@7866)k6rq>GZ+)b~ape(Cb^WiycTjdk9^tr8}wXu3lpIdfGpj6$qR5KHC- zJ8PlN`>d)Oqx(GR3=sFkxzf}qVJ#AcdaUe-@B5W5TLM2GzwtlbJN4p-{x6xkAn5Y6 zb7lWs=epK(pNmYJig9iPe~fSE{MT&7MO{FXl2^?lH49tj01vJ?&({msX8Te!74|5@ zi;hJmzzL)GCOM8~Y_O8zJo4Cz{kH@>?0O*`B7fgmxFb^R6)4kEaNsTU;xh9Yr~t0d z1z?hZ35y@FiHFYPXO5d`d2f?7v;<|-9TnkamsOx?{8}P6xiaMlDJ_5?=sq#8|uctEI~D6 z1Z-I8vUj0ZOpFrLqy}a^&$6k7S^&Z_Lr}Kesfb?$wg^hY3z=-a=#UgC&el`Y_RJX| zPdXN=t#L=A_K$^D7!k$R0Hwn zYEWFGPFWT#PH|Dt!;Ey&Thi2MK*n`0fMF0)paU31B6VPJS?^vU??nVqTUxB#^2Hup zm#gfNrYtaru30OOBBoT7$}S3>+ln30TEzqK2o?{b%P5nBx0c`s3e{pmqFoQ*sfyhD zYMGdBg-oBJ9zQXd|AcnnbdOJw+SUbnjwT7rhi4@xV1%u7S^t(h(-S)ywkzE1NOaGQ zviaDZLUG}GBevZ`mfAUC-EiZN^z-IY7cU5Fy4!RB$b8R3=^@&ozZTPb79!BNc5b-M z8X(+Eg*$AC8w$A=ol$@Ifc8=*-^K}HwD-+M`2si~-kW~qUO%k)Z_ZN0H!m28dcXco zH|6y0_l4}?2O}_4lxBLrFftu^bzT%OBfY&QOM4^*0)#F$b*wJb9fk(#3Pfy;_ZnPM zi#%s={(*gwpPd(4FRW-a?b>AzyMLlD97;2E%dU z7cRD-X=veybua*l`>El%Yv}0D3Axu?4Ux+#2I;h(3Ao-*cbI7Zx8ER0*RO|&nV-3iRp}A6YYaG+JG}qcGNbN1``B* zN&u5GFdriZ)SN-eGu{j{J+piEuh@b?oD5CofoDD%IkL^opDGl&!wgBf@+6R@+6)}w z`hIn@h;wbUR;eMLGAcTVCOcJ~21(&S!YfZcWiiLFhiA+h$fKVMQ@=9#J0{j2W|r<2 zB_w;&_0;-Cm}6coq>mSy_Y{@i1WUw>y_`)Ea{&*NBs$d)D`XEL6@=YhwP?5{9$AY8 zK-{5Bw#rH%|E{2~BBdvn!}xy#pWBn?Rhwde~k zzBBmQ$18zz^tXR9Yg+?OoSr;zkJ`9a93EnqAsNErpLTJeJ@^oqP$1D3r^_D<9TK}| zC3cx|Zj-d&6!&E_ArMsjW#sQEne)u_^Gz?ZPKNC{DSkNc;j>Ry#Sz9`8T{PajEZlh zPtBbISMFWFe+xFzI%scXw9&Ckd#0))`B@G>oFi-d>%snpG=;ghMU}Jqe$1{V{dCZ& z8&A|`lP{`Y{SS@IIP%&+!FgwP7MAyA43v9h4;AhS+I$N`c}Y39RDBuF+jzFOZ1|Ef z5hB^E1XQyB%+jSfubfC!DK3%K;P_>>YSEp3(Z=xDTEC<-hEDBH_YzLHgl^l63eQo~EVADu%m z5!apCmB{U4(Nk5A?$~Ykfg{vDj2-TkQNm&kM#m3foOiDUJ4t9Cs3D{Ak_B|gfb8e^ zaN@=dO{)NGZts?Jh+K=3BMH!cn5pf3#e9{Rolme=SLUByKfS_AwMsafQFyOT+Gz&S zF$+XdKn3^IHU|zw!*Odm6fgurJXM&3*i{c+;sktnS)ANUZT_T>Q!MxUB;+ql> z-_X_v0dT8h;j?8v5o``dAHOb85sJ6;;f}IY%J@D~LW;Ce+F9Swvw~8bRE{naM@wcD zm-{G-LuMZP;+YeSuikUy-bwQrWy$_c&T(qvtW(QuI3j)bKrdWNtJM$W>%DLZ?^UqL z!KY6sx3C{tdQn){of<+ZC@{S8D4cO?sgQ8YMjP>N&cWlh$6s0!>UNQL=GA0qDHyKO z%og$Pg#x#G$u+(etMKY*BFDM+FX&l*@5#v3FPG?BVQ|sj(CDbSLJMfn?^OYi4iO4? ztd(Q#%Mq>7HFK+kIORx!ou3E6c#d3aLO9~BvsZb;35xG|C+e$F8yaP|r;o{8$dngR+SbN3|p=EZ~-gJN+-utTFez(4*TU00+dOWM* zNAGp{a5!S2vTYfrOj@^xvR%3rkuJv{UgSIs?M+I5zukKsJV0%)k5OldL?ZCF-yH3n ztTaz1BtFyKLWdpgk11qkWnQG*Mlxv2nfKPJmWjGVty^7I9*W8IEG1p^N~~^pziiAt z!a`rIKh%q}Sbry$NQmkOzwQt1&65tk$!i!0(zV}0NA3(%A~+La&GwZmLlz$T$-P+V zYeEAz%Dh!a3&o^L{-s^*IO^tsoH`V5l^=6zXS$-NJ}^qs9Y zCUV^;g9vxig9NB+zk7KOQ=z?6;r+ks#Li7t#wxA62fwz=rJHsHU(2QU&Gm_*HXI(R zQmA$l76g}l-1=8Xi36WMq`PyI36Hbhf3$!OEf8@oQXg&Bp9c|SCl!~x35P;AKlb9B z33?4udc^Yv3rctG-AXE+(Y12vaLVz{H#&}s2J34K`((n)go=%NUCwAG@gl<&o;Aws z{pntn?M--&GF)ITI$5sPZ`*yf>b>9Z@GZvQX)^P?yaCbs-zSt4A2(_{L7ys9?*=25 z!s3omW?uiRcc;_u3qe-*&pnjykJandT|X_LpdEdGgD-e$Kz&Chi3z>U&6HNF+ho)^ zrLO;X&n+UT_a!eOC}}uno{|;3=|la#zU=H$|i;e@r z95!kgC$y6&)XYY*{>PBj>oW#(-Fv)ypG39{#w8M)*XozB2<0Si^z!zvFNmUBL^VZ` zPe#H6I8jI|TGUvexD{TR1g}kk>E%N#0f-);s7qB;pgubp@QE2$EWYqasg)Z)GXz$7%K1v1Bw+zASz%4{AW>s^dY?989%M8 zcXHEfmHOJl0s@ONvFF??^x;Y86%WUi-D!5^Y;v>C0A`TH z)2XNFJ<2RTA3r=}VsClR;JJ`tFkv-aURKhGztrc%HH~cvkM#Q~ftv{k0Ot1j%Zec} zD#`58(3xDQ#R<||DW}(Ot|{+;l$-737ft2M{tw~z|N4E4IQGT27LShaKiIopp#KrM zCXRo&9-uBZqD%w2r|*7i-uQIY!dtlvgcC}&^WkHE|MUCA_oFNBC8arXO;*4msqA~`JbKJ-GPZ_oWpZhhZ{zYoh~^K z^|sLIPq%SM=t($*O)^By_ic0D89(?gdwAegIHloWHt!xeFmUW^7ATQwI+pjv1G*7< zvMJ)E3QvUppZ|7LAXva*^!v#0S|(;|?ShlDD8}UJ_==OF;gK6I#s1Kv8SW}+w4sNN zVGxJ+cgP0({`$mIDc9=vFZ?2JGZVDUo?rSr=V)&Sin!^T z$JCDP%&V)=i5o(wpu6J6eh@W@l|l29;aT9fj^kBVr?yrTAGs#k(plI7(FXB<#x-iL zf2`@x+I#O9t5rX^604q?cIo(u!D$)G) z2!dqLFP*@?qBQwcaM;6O$o62e<|J zZaU-|!X-j`XDJSDx3l++ZC~n1Qt$+hdEsEbIC!P8Z?Uo1pB7Z{V;Mee$=wnh-`|E{ zYyR53rj|+^XlITg3IpiIH-{={yBCaZU0K(C9`2wFeY~avAc0oVM{E@9jPMRlbUaa5 zh9)L!hvLh9IGWI(OCO@T9zUH*9i~F`&Nv1V#Sm@Rv^Krp{<__(_prrHWc199TmN2Z zinkB(jN1ZLd(t~j{eILkesSz*YT0jI`Nk=Gw?~cB0!;zXkk^Ce|5;t2N5|!FfV@tT zn`zns1Rw&a9O~75{JuZ|K)RV<;%wTd{%9R@y5~a(zd3{nv3ql0@M?d5$ofY3o~L|H zCVA(TV4_Z-bsu@1(OUZB@i)h5e?r0|my=IB$&_ROfqS726qvFhMuQKF+v0`~{yg>R z!I8#Tr!5q&$Q6x)Z6!5To>q_e!IrSrdN!m?qD8gS+w`ctwg8O6F8%Mm$1OIJua3XQ zi9AVl{f2XefY7x&Vg#Bb2_zNRB_$iOz_h+F6aVzYle?#_Lw)T;(SLfZ0q^OYmt$uK ze|jHmeInV6ZHvMQk?mwsc{CZoOqM~DEe6?Mv$MI?CEpBE-mz2O1%3Fh>t2{s7Sz%7 zu&4Nk%t}xCxIq8T=dsm$PGV(ybp|-i8-n1UF;h33mqUBGBS@0nB(jY5!7HH-lO0MZKXvZB*JH;p#!#9|$stCttk|EnFYK8Dz

    q@X6>c&|zQRXte+I7%FR`!rfaLT1^ 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