From 175ef091fc69b457a8b5e5e37281865838d88e12 Mon Sep 17 00:00:00 2001 From: Ofer Dagan Date: Thu, 19 Feb 2026 11:59:04 +0100 Subject: [PATCH] tests: verify pcap_filename on alert and flow events Add three suricata-verify tests that together cover all code paths in the pcap_filename output for pcap-file mode: pcap-filename-alert-and-flow: single pcap, verifies pcap_filename is present in alert events (p != NULL path in OutputJsonBuilderBuffer) and flow events (p == NULL, falls back to FlowGetPcapFileVars). pcap-filename-pseudo-pkts: verifies pcap_filename is present in fileinfo events generated by stream pseudo-packets (PKT_SRC_STREAM_TCP_DETECTLOG_FLUSH), which carry pcap_v.pfv propagated from the flow. pcap-filename-recursive: two pcap files fed with --pcap-file-recursive. alert.pcap is processed first; http.pcap is processed last. Verifies that the flow event for the alert.pcap connection still reports alert.pcap (via the per-flow pfv), not the stale global that has advanced to http.pcap. This is the primary race-condition regression test for #5255. Ticket: #5255 --- tests/pcap-filename-alert-and-flow/README.md | 4 ++ .../pcap-filename-alert-and-flow/alert.rules | 1 + .../suricata.yaml | 13 ++++++ tests/pcap-filename-alert-and-flow/test.yaml | 20 +++++++++ tests/pcap-filename-pseudo-pkts/README.md | 9 ++++ tests/pcap-filename-pseudo-pkts/suricata.yaml | 41 ++++++++++++++++++ tests/pcap-filename-pseudo-pkts/test.yaml | 16 +++++++ tests/pcap-filename-recursive/README.md | 17 ++++++++ tests/pcap-filename-recursive/alert.pcap | Bin 0 -> 310 bytes tests/pcap-filename-recursive/http.pcap | Bin 0 -> 45910 bytes tests/pcap-filename-recursive/suricata.yaml | 14 ++++++ tests/pcap-filename-recursive/test.yaml | 36 +++++++++++++++ 12 files changed, 171 insertions(+) create mode 100644 tests/pcap-filename-alert-and-flow/README.md create mode 100644 tests/pcap-filename-alert-and-flow/alert.rules create mode 100644 tests/pcap-filename-alert-and-flow/suricata.yaml create mode 100644 tests/pcap-filename-alert-and-flow/test.yaml create mode 100644 tests/pcap-filename-pseudo-pkts/README.md create mode 100644 tests/pcap-filename-pseudo-pkts/suricata.yaml create mode 100644 tests/pcap-filename-pseudo-pkts/test.yaml create mode 100644 tests/pcap-filename-recursive/README.md create mode 100644 tests/pcap-filename-recursive/alert.pcap create mode 100644 tests/pcap-filename-recursive/http.pcap create mode 100644 tests/pcap-filename-recursive/suricata.yaml create mode 100644 tests/pcap-filename-recursive/test.yaml diff --git a/tests/pcap-filename-alert-and-flow/README.md b/tests/pcap-filename-alert-and-flow/README.md new file mode 100644 index 000000000..5ea77fe52 --- /dev/null +++ b/tests/pcap-filename-alert-and-flow/README.md @@ -0,0 +1,4 @@ +Verify that pcap_filename is present in EVE JSON output for both +alert events (packet-based path) and flow events (p == NULL fallback). + +Related to https://redmine.openinfosecfoundation.org/issues/5255 diff --git a/tests/pcap-filename-alert-and-flow/alert.rules b/tests/pcap-filename-alert-and-flow/alert.rules new file mode 100644 index 000000000..4fa05c62e --- /dev/null +++ b/tests/pcap-filename-alert-and-flow/alert.rules @@ -0,0 +1 @@ +alert pkthdr any any -> any any (msg:"SURICATA IPv4 invalid option length"; decode-event:ipv4.opt_invalid_len; classtype:protocol-command-decode; sid:2200005; rev:2;) diff --git a/tests/pcap-filename-alert-and-flow/suricata.yaml b/tests/pcap-filename-alert-and-flow/suricata.yaml new file mode 100644 index 000000000..e9c29b8e1 --- /dev/null +++ b/tests/pcap-filename-alert-and-flow/suricata.yaml @@ -0,0 +1,13 @@ +%YAML 1.1 +--- + +outputs: + - eve-log: + enabled: yes + filetype: regular + filename: eve.json + pcap-file: true + + types: + - alert + - flow diff --git a/tests/pcap-filename-alert-and-flow/test.yaml b/tests/pcap-filename-alert-and-flow/test.yaml new file mode 100644 index 000000000..4d5429535 --- /dev/null +++ b/tests/pcap-filename-alert-and-flow/test.yaml @@ -0,0 +1,20 @@ +requires: + min-version: 8 + +pcap: ../bug-7414-decoder-event-01/ip_secopt.pcap + +checks: + # Alert event - exercises the p != NULL path in OutputJsonBuilderBuffer + - filter: + count: 1 + match: + event_type: alert + alert.signature_id: 2200005 + pcap_filename.__endswith: "ip_secopt.pcap" + + # Flow event - exercises the p == NULL path in OutputJsonBuilderBuffer + - filter: + count: 1 + match: + event_type: flow + pcap_filename.__endswith: "ip_secopt.pcap" diff --git a/tests/pcap-filename-pseudo-pkts/README.md b/tests/pcap-filename-pseudo-pkts/README.md new file mode 100644 index 000000000..6282e5015 --- /dev/null +++ b/tests/pcap-filename-pseudo-pkts/README.md @@ -0,0 +1,9 @@ +Verify that pcap_filename is present in EVE JSON output for +pseudo-packets (e.g. fileinfo events from truncated files). + +This reuses the pcap from bug-5392 which triggers a file truncation event. +The generated stream pseudo-packet carries pcap_v.pfv propagated from the +flow (set in StreamTcpDetectLogFlush), so this exercises the per-packet +pfv->filename path in OutputJsonBuilderBuffer. + +Related to https://redmine.openinfosecfoundation.org/issues/5255 diff --git a/tests/pcap-filename-pseudo-pkts/suricata.yaml b/tests/pcap-filename-pseudo-pkts/suricata.yaml new file mode 100644 index 000000000..bcf3c1025 --- /dev/null +++ b/tests/pcap-filename-pseudo-pkts/suricata.yaml @@ -0,0 +1,41 @@ +%YAML 1.1 +--- + +outputs: + - eve-log: + enabled: yes + filetype: regular + pcap-file: true + types: + - http: + enabled: yes + - files: + force-magic: no + force-hash: [md5] + + - file-store: + version: 2 + enabled: yes + dir: filestore + write-fileinfo: yes + force-filestore: yes + +logging: + default-log-level: notice + outputs: + - console: + enabled: yes + - file: + enabled: yes + level: info + filename: suricata.json + +app-layer: + protocols: + http: + enabled: yes + libhtp: + default-config: + personality: IDS + request-body-limit: 100kb + response-body-limit: 100kb diff --git a/tests/pcap-filename-pseudo-pkts/test.yaml b/tests/pcap-filename-pseudo-pkts/test.yaml new file mode 100644 index 000000000..e34367076 --- /dev/null +++ b/tests/pcap-filename-pseudo-pkts/test.yaml @@ -0,0 +1,16 @@ +requires: + min-version: 7 + +pcap: ../bug-5392/TPWhite-carved-out-7787-s1.pcap + +args: +- -k none +- --no-random + +checks: + - filter: + count: 1 + match: + event_type: fileinfo + pcap_filename.__endswith: "TPWhite-carved-out-7787-s1.pcap" + fileinfo.state: "TRUNCATED" diff --git a/tests/pcap-filename-recursive/README.md b/tests/pcap-filename-recursive/README.md new file mode 100644 index 000000000..c07684f42 --- /dev/null +++ b/tests/pcap-filename-recursive/README.md @@ -0,0 +1,17 @@ +Verify that pcap_filename in EVE JSON output reflects the file each +connection's packets came from, not the last file the RX thread processed. + +Two pcap files are fed with --pcap-file-recursive. alert.pcap is processed +first; http.pcap is processed last, so the global pcap_filename points to +http.pcap at shutdown. The flow event for the alert.pcap connection must +report alert.pcap (read from the per-flow pfv), demonstrating that the race +between the RX thread advancing to the next file and workers/flow-manager +logging events is resolved correctly. + +The pcap files are copies of existing test captures: + alert.pcap - copy of tests/bug-7414-decoder-event-01/ip_secopt.pcap + http.pcap - copy of tests/bug-5392/TPWhite-carved-out-7787-s1.pcap +Local copies are required because --pcap-file-recursive reads an entire +directory; relative paths to other test directories cannot be used. + +Related to https://redmine.openinfosecfoundation.org/issues/5255 diff --git a/tests/pcap-filename-recursive/alert.pcap b/tests/pcap-filename-recursive/alert.pcap new file mode 100644 index 0000000000000000000000000000000000000000..61be1670facbea1ae0687882bbb9bba40e014a77 GIT binary patch literal 310 zcmca|c+)~A1{MYcU}0bcayHL!O?QuHW3U0TLHM8U`L!A$->g_P)XF&+Tp1Yj)P)@w z90b>U$N_-}5C|U;KEfcimOa=r01a&cnx(V=VHU&`h=~xhj_e1SB{&CU4#+&*W^DtS zC9K28PzH1p2&1~ogMlFflswd!2w6pOps K2WxMczXAX@`dyp= literal 0 HcmV?d00001 diff --git a/tests/pcap-filename-recursive/http.pcap b/tests/pcap-filename-recursive/http.pcap new file mode 100644 index 0000000000000000000000000000000000000000..f9bad0e6c3cb2f55cd63a650df54c32e454aac88 GIT binary patch literal 45910 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Μ@b<+ zvg3_Ou3PvTggMKy!4*w*cij_UuN<;|C$S0k$dP$IM3~P)q;XjCl!y?p2RB6%NK`Hc zsK6lEUAp7;s>m6F*xavs$yT1rM!gJKZhdy#la<&$&0+EN5fTCWsQIeW z!o-Wh%bf;L&nhDFns3~_T*7)|#^gSR1l1)E&Ri?SS+`RlvAgk5g{UJwuLLz&plaH~ zBd{w!xC5VSIy&I~@Su3jTS?!pkNUg^nho?-rGjT0HzRu#V@XEeHOO*6;p4rbG`}kk zNF2wUjqKO{$d-iawSJum*76fz{Ll%<8THw^$%I`aJmCZsdGKLz~W{acaVey7@o|og?8vD^kq68*B{V zYGS}537q_X1&t!VVtvElomhB(;_Trj0rmy>H!cr_?%kqgG|bp+y=r1bgt91hSN>ew zS_?~FfEutXg;h>e zj?E^Ul*ym86zelumf|zwkaS=$=5*Mx#%||x5*Ix!cRxfeFgfpN&dwuZB1?T=>a@Fu zr2PhX#0kV-6IFG0Q=uD~j&&^|Q*8{po-dT1d)q)tffK3?rJyN1(hWQv1%XoD>NB;7 z%=cGE;DCw4YRvVXPm^*d=?GR{ew_&@ywebI5`XKGu5aFEssgRj7;D@rAnS7rtV7^2 z>7kJl;56Sja#gtT zkoVECuzy?T zH&w|P^@MYF>v73>zEf4ZT!qs@K!gMvYTY?Sg>8uqfo^E^p|bFD9HbSL=?6dg*03a& zl&G&+ob}$b)c&C^>BD&P&sSSMfQ-B^<-)k@E*boYQ`93K-<4f#fe;85wKs*eI*lap z$V3yVc#ifti^oVneHA|)4VMA(g!1rqK6H?I#vLvien+f*<@}#Ab9{XmR%q58XMqENNwlsezfnD%A-vbf%k@K=3 z`ub4ahEHg@n&yka%OV@nLAE1Vzb2flhwKg%YTCA15nxc30N*|jFjX#v8-@0*Nv~2% z-$p8**eBaEn0Pf=Pdn0%k7@gH_-8Uv_IqaozXI6Pbsbqm_bphk0jullB`9h#+8;w> z&)9qYcJS>5Z{oFG4>5#Qq8Qi6Tl|ZDa7UwsW#q37$ z{46SO4oprQ>qES?<2lZNYvkSis^XoCvv0e1EMkcA9JrL%yilLh&(l{WjytTp$wCNp zhsIW5n@WVWK#p@gkWB3Qg2}wZe9;x)I3eEW26qiI_%+*rIo+!`?UYj_K8F2}^9Gh4 z3q?T9Q?wbr&PuJVUM)qPHIZ#2@G4@Kqyt1=+p6EPJ^m;#rBAi%jg{ZP%M%c$g4^AS z=6sWZA=M7?YLQ4?@lD3*uI&wIWZgTFackGohxp2;hmR)q2L%w<$g8jCM5qxHB%p2_ z{a7{D4vrb@kP~v>u$CKB3C7TaEmY?INj@$l_XaU330U(@C;~UUx+?4(NmMa^Jp6e8 zbqu!qeh}x-(47@{vYvNf9mkwB4%vpWzznrz3y#x=7e0V56*$cz-P|mN zLFu~6!8#z;9wM4|q?j^X;-+1n8B>9Y`|cuQy{t#rs@UsTeJQO4#riREcUApZ4;Nh=%xZ8M>-s1%*C6$k$w z3@uw|!>mIFly&KTK7~H%$(A@&bqiHsTRpLO%ZkJt`n8kRgsU;k zeggh-gKrL&2VCei;5PgRWaj@nfAnkS z|CjS0&;0+)PmlE{zm4@Lelpg7``>?!^%s8Y$7B8aPmlG>-^Ti-pN#cC{M%n+{RjW> z$7Asz*8c*1`S$UL87b($`?J6BwIca<|H?mJk^Igd{ey}G|C?XFq@3{J`iIh%OxJtI4>+KL^-@J3ZmT(kCPQETb*#{pap29tw zv&>i7(Beq)lj`t;$S@;l6qkZ&_DgT-69*=Sxw{k-*qdL!2#r#kXsB>pi5Tu9L6DxY zwTG-LF4@RZlG!cqME|^98uiLdPD0Ne>j1u|HFny+77uvc$*f(>YaJ0q<-52my zUgo=8T2n1WLAnxfr#~HDq;G>WA%IKdOqa8&;yvj8@NfitgFvxV6ci zz3leKZ(p*=mHTZ8usps~AAn0OD?WnihbYW}Kgw1&RfsPY{BCB!ykZYYiZ=g1YZTTZ ziZ%(|i0S>=2WbbfY*6*ur&VI9wD9N9h_j3o4I|qA>PV5oR;UjvZFQI$>)iDyL7D%=qS? z3~WA+xzULy0A!AUR8OPJn%Ek1bu%Jx#5(d!VDi2iYA)muEd{V2R}jDlnSr!?2PfsM z4ly?(N@DR!dxGTFm`;|}GZvwb+z=Tk~@&;Tv;INYnJevXW#i*O6K* z&MkG>q)Cn}(_Z-58hlv4+OT?yx2vC~qV?EiO8mP!19bWWG*36e?b8t}J!0em1xaAY z))TZBR$vRd^htr^M5+ZyTEjcgJB8^18Ihk662}zXQ)e(VB{~QOOx`&=G~hPN00Y@E zJG-y?`TTg~!HEY*0ngGAm}a&;U?w;RCYoLmkB=Lj`9~eT!{;WVy%V5R74b1|Yj5ar z1-E{RkOM%hnuzb~rRRbi*8|m3!T6His3M&^AT*%LkEI3}Xf(-Q2ua_W%QCcK2_(Sf zj^lyrnoG+o*b}&}@9&fo$`DN#2D@bd8%{FV4xT_MsKFqx_RqZ1%J9;c@UEHuKel||D zKQ_4)pk;GkK^L-g7TExf;0j7q5*BicS=~XJK{OGX0`fkZlQ)7Vyp`O2hED#S}PoBrD2NdS%nRtzL=cLU?kNyOm-V?zO;jc^*2 zvhXWw)VvV1sTv^>*~IaUulRF7bwgTfQF(*6zWwQMIU<2%GCs zIy(fcnC~%4D`}T0hO|M)<*N^-|L7h;fE!aX0k0QL-NptP6oUqbqTwg^LMLev+NH0| zLspIf=~Xk<%{u(7{jLUAB+=cs-e7{(;Vic*Dy%c8N%bnn8gKu&!GnPZet((- zzToXZ)x<+a@Vmli$dXI#%9QR1xl(T=RoyN#_73@Oq|sW3Mi1aqxQT2B4+~+&cS;FN z0ICG0XM}(*s22o{*_@Y{uFMH8=|rSftTm;6*BvLE#>z`8v0b!g$njwwSUQQGIKURN z0dHbLBUFO!0kndv{FRB>7MPe#6wxN;ELhqAY2psCYkZK)A}&7S6wE~~>Y3bo29We_ zQlWa7m~n;G3TU`6(i=>_iYkqddXD+34Py)k8%2CCfGD)Wo=)WlHEoWBA~}4~FbWU= zHTKYcym=VrymX>0G}#e)j;o2OMiLAY#;b@?#bvOYP*Ia zS4iJBJLxj-1=Ocw8;$2P91WU{GxU*zO)?C<$8&sAVox*kZgBkwyb#*v<}aYkTk$KdG1BXD4jrQ9^=_;Ej^`13R(;l=A+EOp=>4InrwD*L z>P*xi#J$qIOM+l*=au;1xX}3~8Kpp&F>!te2AW*AuU5I)=-v4ANk{W~mt6 zJGeh@lG7$6@+3pQ`UEb3V4ABV+$C?xH}&beP>URcJ@6dtH(J16)Fp|<^8!oGhb88h zy@9qwq3~>;H&94&F3fPsy-1EH$#dIuL^hvZ0BGSBR(Lcp3lCjOE)1+EFq)d=SOad7Z3I5<+$9gIuXs~ zZb#SK0$LBA5kudAY3oLT>867HG)9_JT=R}rIgv=cdsBJ;?OwLr&5yWbV%8Mhj{vhd zdb|5#!jnSrS9Aa&d`GPHU9-ogU&T8G{O$@5ez5VIU@ z-;MwyQ?StL0y_nZjx)qU^Y;6(b8OxYJcLQe_ z;8mrEQcDv?_qH3q508IA!3Y%bfCT4Ag+5TDko9z8c=~jpqq8(C#XwI7STh-$n;GGQ z&^bbJr}D;o63z6t!>54Sx%V|tylw_OJne>hdx*w$Ybw8e7|6-*&I2b1UkC$+cueUY zw215anr(nDbD5fr@y`&8?sIjVDl*Y`_cV5-08$m#foThjTytJvIR@a#_SV>zyF=6` zBCSn~WCxXpG*2|t8Z-dyH0wL%u2lDoM^*G~XTe&z9s;!0UIK~xhEoB`4|BCO~2jU%|^2Wv}EL#E?jI`S9Kx+Q9)p< z-Q6^Q$pY_{A)e9q6sDNaEk|S(qAW}DgGG++{X4Zts&jam0|_ypXK}BYSN1j0JMu2+ zkVTzl>WJO9Oa4r4_(ly+&{EsfyDZEtvCrZHkTi~}N$kL-w+wDIoPQEOy2Q#f=syZ7Yb7-Q+0q@C%};xjW< zKQHrX4Yn~q3pet)l@-X9%dZ_ghbFKKC-%|IT)(B>I3G>OJ@)H%O83wjm&cGvbZOy> zZO))l5&hevwj~aUF#uEI$9ZK_C6&Ye(%;YUlh9pR2?|O)?QYrcH0YWh5{I0$n>D*; zaXy;qG|9&pKL7?NmVTh^;@N^0^@>FdQe86Q+I-@feG^*l}hqMY8m2O;&OO1Xr|iHc~7cDc#1(! zc6^IHe%Am zJAD{%NHYg)9UEBu?jHDX{Wf90gxOs=S>ncih&;<)x%r`%8|e0r0!G~<>Bbp%RsFzp z2v!i|R4zs_@`N0h9?usmCnaUH-*w5wdPB0g_%d~XgPjz4Yku6(GZP7i&N1%iy1RVhRzq z)`2F(`{PdQ93z{seFJSK=~Ew&dkh#D%_OGRy@XSc_Bq6RA|*i00-`U%ms?FIp&S+X zn?j&$zuO}uLs4z21%B_L;dmXq3sOgwE8Dd4R^I3P>SI4TdqB2{zh=*w$#WQAxJZSW zFo>WF?Ovd8aloX@hTQ;%Z(k%i@!7spCA4yyU5?;mP?l4CZh#xPV298dsWYQmZ1SD_PivyVJxQ2x3#BU9zPFjP9ri_aa_TVztz(x5)nb%1u_&2*JM z>>uTQ`@EroNg%T&ErX`m$=cP`st0cdz8aFVZ*wghgl%8aI!OE;cP2KzwfnQi;qJr@ zh{&reFGpPl)n-N~`Bi%Z8Y>@BgvD5{vrAnoSU9mNJN%{4oa%0SYlMXwBgGB)uMgl) zb59UJv`0XO=JX=X&;T|`+>#1hcfJ+155>?{0We4|mL{`#KRAkn z1S&(dtpbhC9N?jJUS`MhI6RgItJUo>iPAme^Afb#hzXmw{KudXunl{S*n}5WxH2FB4}q{eKyZhkBeO-dOTOs|C4GSD zNIzXOTk|@Y;OqziBn8?-lv{#sP)LgX0ffTm{DKMF2N-t|M{Y1D=2;h2J*a*IIJWVDp4ANO*=>p z1<=`6`NE>#IIz_K2-|60&%s62yyZ>7Xb;xA52>UmWhpok&CwkRoPXMiF?p?l!a;Ms)S*XRGo*T3{kudVNX&|eXuK?g{*5fUOm z5`_d}C?Be9BSneN=kuX#H!ybjSg!KfF540UDQVF{i9~~Dz5u;6(?Lofkai>5tt}A{ z(*6$I?~1mxc9yiJG-qpSyl*{E*<+0Rx~|_P?d&-*LAV!M`P}7c1ydz^@WYE%R6w;9 zR9~Pr_L8138fSOiwh!N!TP!L?|>%!}K3Y=yeV&k`=hNIgLynA6=(Y(tQb}dfQ*cG+#^Ywnoa&m7MxN>K0 zDVUI#V(NY{Zn3nvhdadlw7rmKUoSk!&3Z}p;(I>%aLSu}L56yR2S}Tr-RqZG13*2p zWA;6LeGx*cCIf>J;lQ(xWp7&AH+%y_-e7XQ_#$!aON_jvJ`at~JbLs_cKp%yIvH~U z0~+AkBqNgaR*@)4x#ulMQu>GfQB#=ppxVn62>f3LZX7{v2;c7u`RIf2QM~t-+y~%a zP>ZHHv}(PxcCBNv{GOt&_k<0JhOEczE-u)1R>>c$vMr&eAq{C8+{ilI6>>w{`(;)5 zsQB=hi=wAy93uuhnR7lwGfb9@8FQy%;8r_WW2E5Oy%;y)rfWAUfwN=zLEc+~R8Q$d ztF(?f58`eU8V={&vh({}&Tw{pq<~_P#At!>0?FQloa)&011h*K*2^g+Cg#leS8gqE z<33jVx$gDL@zo+5n7xkSjSG9dmQ4EdGl-}X2;rv~OrIN~cB?TVgy4`^|FDOqERRQD z>qHoIQSYk8x2-i2zG2VbWgQXLK)UohQ#rnlj0`WusD>DY_I#bPcm<_s%W#lu)*$YH zF(b{vGu@g!40;+xJYZwsEL_DQbN#InNS(39B7pI=yQ&i;a--yj2Dh-q8LIh%E)?@4 z_wWA0-gf?p9eZ1puc0vRQQ8a)HiQs?Gac|f5F^<(+~FWL{=VIJ&R2P#d}hitL^zKY z4kdt*;De|%^~|5Z;z(*w=%$vve8P}h@z;v%7INERmm$@G@|ZoyH>-k_ui^dk9yz9Q zH*F)eC@@3Pnzy4dKbViF5kB=BQ8|CCFqF}wvG9IXF0arBL{N@{W4hC#LYgYDZx}ZN zibz%JqRvnJjfrkPs-Mu)a>N%}a{tvPua@^8AH#bwGoJb9s)R)3H3wl`&ur`sxi6SJ zyc6SBQ%}6SDIPABHm>;iZKL&e(cOJb$!}!(yS!O6(yX7-qIKUpRm;cjd?m`6bF&Zx z!{{P@yebi_+z$v1N0n25DXUD5M$)n$+Bi~W`Yc}fcXi|=>Z5~9(@N}qy9a8o_TnGM zCI|a!dcMFziXo>#x#n?ww^DC0UWIAFe!mSwnI<025&obG;aU|Xzn3jK=kuNp~5Dag?H&JlDCfor4ErBeD+m43^= z{cYwi$q&lvDQKs)K~CalC|9CH&LLh^E`DD?N9jO)em-tVcN55BRcT`W#=4rI3_a6I zp5bJeTu$wH>f=)7LqR{t$yfpGjmD@m)!}XIs|-K=HLruEgd=!tBKZSzELvNKeF6_% zXd3=EiDoBr_%L|BJESH86aFvZbYhhaRm!tL*hY65d%*s=Kj6;Q+ zE#_dK!iMoLoNCX{dj0CuFCXOKge0g}1YBlAQ(c~dAImM)4g0Vo@O{|)(!c5v}FDA#f5|@%+tX7%3Yr5 zqUJMvXTb`lU)uvt)fd!=kK~A3xLrq~-gDS5Z*~k{Zv@L&FF8_h-!sqm19E3)`;pc5 zaNZtG^UD4hwL30g$`3$8lYGgv!{tRPpM$P)Dcz|@c{=T+-#|#u*rgwf?~`Yr*rh2% zsY5)fR=nsHoe)p_@OM7@1mC92B;y2@j8>*)DHjNB5`pgtT;FMf6!CO+JDO&}F4ElD zl^pBqXzC5;&{a{+Bg@UtKq1(DE(Sy?VaRo0mW+Nl^tVVhSnD4zso90Cfol;`Y_Il; z1j@HgU$?d!wRCEZfjscVKbZ=)Fj3{+loqV&Z##>=Hh=iJAvK@;V0M&Z5Z`8r5QW#V zQ!Sq$Nm5+&8cIVru2I()DZx?X@%lp6PMaCR4qh(NYAp|=f|1tzEo^(Kp~0cWJW=Xn zn;2^7?t8va_negMm0Atg>Q*Tt2a!N&Bd$lgWtJbDpMHozdra&ECLX0%P4J zXAt{;SoiB#rAKDGVlsqHen6QK`!ycmEci9dKZM5}KkY@5REkWNkvA!O(IdeZq{KRR z5}Y&{=%sM~B(*W|zs+-HgZjNIk?jAyuU9E5{*9yzGJ}yUUGWJzTy|_{CX3L ze-%Q0OKDG4B!O_vI8Jv$=EUg%K(u@Tg#$9nH@oxIs`&cl9H?wIJ=w7HU$j; zxVdbPbgn0a7yp8*Cw*V$&`@G-1&v+kzdc8J%U zbza8IeO>AW)PuX?!ZEZ8->YV9&eOU9HS9{?!(RwFWf|^5 zn3z5}i8V!dD2e;@5pOCf;T5Br702k(=-?@!e7Br#zx+X}UY?qofMZSK~(Kci;2?KdkEDvbO$3!*}=1?zxKTRhSBL163ae}4r8;){3I~) zA>OX}H&fGN%8Gs5>LmWn#tC-jC**nb?oNq2igv~P^979+Oo^MVX!uB~Nt|g7O1^Ti z!rguQ``f64WP-7~mj*xK_d`uO#T~7Q`|J~b_Wac?;=5QnJj5(^-O$nzU9S4xCK4b> zPfjDPGv7Q4zf)gLfS~Cyo8t;3tz7_6g?9zb>EVLM#`9>T&zlfqtL}psNc0{9h7aeR zA*G)1kT1or<#}%^&tx(7GLmHJCQo1j;*DZiA~n-#Mh;8{H1qeGLN$@!g(+QyGzQhs z@Nk2gnw%=d7#DP6B-Yy3mF72xGmOLgoqniai<=|PdcCsceut2sM5<4N<6r(|V?spR z^8}N+gc)ylgGT!st93A6*$X#;k3^Z66)35r8Gxm=eCedDA3=Bj+-w#;j`*^i7-XOe^>dp>+wLppL z0mhP%tT~uV^wk`Vh3ma|=Tsh-0vLS{-_s|Z8*F&d%W?=~4{MkftR@Dq1kHg*E@RSV zyoDUcwXf$Ro@87|W&bLe<^_Pg9N1S7^gEs3r8Kc*CuzQ*AF33Pgu0z8a<+5ZbQ>>z zZZ!$~rh2}PW7G(X z;60s{MvSLq09H(X%X`xdQe)F;I|CSVR1?Mm;?xGC^}UdSS)cZY^eku3Vjhi}#4Te) zPlITQe9x=%<8coQ&#ULt6X*6YMaan2OE@DBbK!7%FAg6u-YxjIKkeNhkSL;hjrZ5v z=c9wq;kE0{YAu^gH%}q4vGoDaoSp_1$yfVkhvT~<@xNFJs%`a*beFyP?0)aiGr#4p zkt{f}m7k&2&GnS9Z#8_bL>fRxdW!3j;^w@8lXv;1#EEH3A^2fsL+lXOiXFInAkH$=JCO7-CgHd_hXwK}k z#9-0B7rO)Ly`(Fue!3Ip#gd9na#d2oCa*J!gnAL{2vh_Ub5nVnj}HR#0V3=9p6rJVh`zSCd<* znT9$0ifBH;rUs69=NCWNwkJtJ%Vq+j-d?;K$`M-M7Z-M^qY&t!D^VNPbXqn6QlxJ@ z^1v5Gq;Fa4Z?qW?k)o7Oy7fVFP$lHD@2y7OU<|l3(f+Dy6n&@g6~ZH^{hPM*H{ixbCp4mN z>g}zN5%Nx3?+$pB@ismA5oj1{;%c1;P^SBgM>6j3_D}T$s>xegcSgf~j&v?~>oQr+ zia2)8UDS#n9FOW*$QSg!c-!2H$>el!fR&%gZ#13rUCdPQ#3gM4Bo;)RvHaWlx3gv2 zg4fp99Xv#l|64FgNNK5Z5ANWn*5&GF(`aMe=-@yiGcs72bBajK>D;*6N7s_l(n^Y% z-NV+r4eo1XvQ}dXQP`ryWcSSWnFB4iMCs%Pnu3{JW_1 zcKeyi1;1vPr$jOX7`IGIJmh*%46Wb9;rsOG`x$_fQG!em2NQ$zR#UnI#1@lT;nwrX zJmP*}VC@jW$E`k}fhf?2NJ=slchbEXGjkxFbpP3`wjLLvOM`L`3Ai0y`sLA_1>Mnn1K6Bu9Px2o+QqwkpF`Ou`JLX_DG??j_VUbZBpRX*KP(GUjt0J) z^dr_%SBt{9LauHfz?1bJcHRO=$!C8p*;wMDO0ytnP{6eD^qU_Vq z7N3ztmW3(#vj?E>5SCR>_QCef_U60lhr_;w^jE_l@J*He)$RQ$pWf|{oT5pb>cI_k znI0me>l^a&WifzEAp&_9G(ypPhV}8!M8LlA(p2a1TjyS?*5u2) z$Wij4Xx}}_2eW8=hc6t#t%_IGF5j~E)t~coV2k0nla0Ka5(FFbm^ax!)?WXk+L6DR z7F7QCQ+|)Ztt$B4itQgK`#=8sj`9EbUmWBA`rkUn{~y>N$N2wQ{cFegKl%G>{o8+8 z>wosQYyIQ@>d#vLr~k`euk}y={#yUeU)K7c{_R@-0j%f^~L}O)$K@q zURn%JHk>a&3U~}Qu9g~<;UTwnEd*j>G(|-+f2%iAs&MQ#c}7*60P6h4t>{Tl(sVgM zd?~#u^uDg)T7@fVvUc}RR(v1rEj!VEj`?aEodJlo-@0ZsNf`<4_QVGMZvC-os5Gsib)mA?I?`e%0Z`K+M{MeC^aGBR z{E}X;Eib`%nAr1ea6bs@5ud0iGFxfmH5QiZh`5q-#YYQHe09IY-udApEta2TsLpAk zWcT@MrdDfoe}f^MiMiFiLIkt2Z%m2jyDIQ)Boz-yjov$RH|lkMj!u|ZCs~S*I1Igq zXZ5~l6+OPY8kS?4g;)YWAFQIZ$V^{SwCLy z5Zfk0MQR>XYKQxm`?T_#kJQR|#xhK4XV%}OSIH(iA?5);cb;+jQw1_7ngBv+X%2Sf zz-Nb|n*h_T&s|YAha5UDpUH8_M-qJZHY6Pt?(vN@J+?(3(t~o$b6~d;P8Pf)W!ccE z1^mV&86jCLyn>T?8^K~PZx&T%Ck-gtXFZ7nG|xSV(!fZBGY}z=9fkfoBX9jj@_FZ` zXoiV-&!1iIMTEPby2_2$ZS_f)&|e0!9(cFZ&hKYZgqCfRt=9gn_Tswv<@kA@=i>sK zR+1**DFs|&{I>n9?(CybEEE0I!snYs-UVDvp1#dbL%WHu7T&s$R^|b8T%yf=InxZz zh;GROYyacUKV@l@M#C3b<4ls;nXU)8;*X$xn2)XA{044@8Wa`lMQAt z4*)`{uEBQbu3Ikx6jxoA{G?^fwZksaZ1dUk0(JJj%=2}#-kruT2HYtDMn1nk*C*`P z;p2&nYktsTx74RY$($>3RkgfxbDJgPh&n`k-NoN~G*e8%9$GZX1x+jDE@XHHnoRC?L)qL7rdi@KWUdC1yflPRVk-bogBiq=h5^ zKXtXj?(bhH7x>N{-5cEW^RCHo`RxR^V$8AcP5j)gKJZ(W9=m#Kr)5#Wh-QRV0>qvC zivcIqI_KLb@MMAz7vOedWq#de`My3E)R0LQ(>Ux4f1G=bIPsnq(p{APwm!JtKH>*? z+rV?aOz-=UaGE`i?`>$kK2u7hJTi={vg3AqHlnzNX-0{97eBB!aY6)9IV;{;V+}&O zJ!D|d7@c4euG(Ua?-AV`Fjdcze3aldM|?J%qyf@{1EFqzaU!jhQ0&-E5u0U+*7NNit9td6S-WYp+L0(wxEz3?0vPlfNvlho$ z*bin%44dt=65IDylzI4nYz$7ofQ>ctP;)Dp`0%&ojrPi5iOIr@VWDR4?6+-$z0CX3 zY*>>4AT<|mPHV&2bK!x?Qjc`8`gMRvGLfg=@AKfAxiYQhMt}2~ zc)x9!ZA0Gx6R{7eipK7OD;yAU+wc0kV#Iw>R01y>&ikR+rx2Mqtv`%E2EIE?kYGRY zyljUnKT6n1F;7I>k8lqF&uWPHKtRC7AmYBxKQH5_vbVb6v+G8R_+r_kLN>tUDTDfh z#`;(%Nk0PR_D9TTq>^L=2VdSEZx^BH6|$1k*gE3AS|>dJ{j7a z!L+ssLUT`PC&mX4HF(>21AFwHcSWiMi;czjAmn?LW8Il_?WjxxV7r%J(K~h&0juoU zbQAM)Blw8xpsz{A(bt1{Nmy%f_u*llKoQw`5^jtDddZh}oDft(3_JBqbX>KrN1h$yk#lTXA!Z*tgH-s9VTJ&BkD+&b{e0tvgFaT?d3~?8+U1*igm(n1S0n<3sh&c{C z8+ke!U`~poC(bm_36~F$EAUUJx{q33chg*7#ZNny=k-fwUu?Mp*Nw^?>M%aGDkq;k zOtaU7s=t8CUD|h5bx;%%3MXZy02hE}pFAW)DDIdA4BrrIQdqxqjU71rveYI4Oh*i? zlp(9}GGV@bA(*68)w2VB^J=$Sk7zP*yK0Q1{B(djQ$X`k1S(&qVf@JHrZ#_8g1b=# zOo{oX#BXW#EBptMdC(SKKZ~tb&w1Km6o1yQ!4N%pPaX zrW%2O3?PTfBcg(<=<+Sl%$sZ?jcI=^^}Br~MuovEz&N)VJbR7}$KiJ)fT5YbeW0@D z&qZ{DXrWg1NSxnnnA{j2kX&cm01~v>3OkD*Z%9R2xm4#D^tF_)O>>ywOKz6TEhWR% z4Hh(VN}WA}7ATiJy|C{E0(tQ_)J$V1ejtd9$M85S!h>@j{Dw9oR6FVLm+6F$1zh11 z!l22zx~6oOQ+UFGS`F73x83+QPns4SSxJze?>WUojoqC4<)W z@X~yM`28H>25+?OEzk3Uy)~9!gTzkmqWic#vkw@!Q8rVJ_Xy0Dm5xJzVNF?RDzrm| z#yx6|iSlH)E&!4&2yK8ij~CD$&R(ftj0;J)SDQD?(;@A?(7jfmZ5Ww%a;aYj;ApZA?gN zF;yzsS-)r3)}gB9w{j8%DT=6D^1c||5riXuduh{c>%jF=;LvGcdj=$N0eKhHnX_LV zZ*-I}GVJ|1s_(I2>j1p=jZ=2|?M*i^A6q{C2^Jr|h}s*`A7^yn9uO?Sq!NWjFl;e* zyhtuQnK%kJw3~UkxHI^EC%Bv#;j7lhvi4AfrmLCt5(-^qAK^t7UoT}9{Ui(cN%0Xw z9J~lEHC5oOU7jDRwoR?A1m!M>-xy$Z;gZ#8XE(tXtKx-gm(10kVJ>vT6QJ*u{H=oD zaxn(ZHou-Ns_p}kakN*)*Nco^2y9D=B&C{mht{=wtdbNu^`ovzfb-K*#R_RQ+TDq; z34IirYaDKr2O^dvWt#Osp{LY*do&dAK##2_EgSRjYkS$mLvOO+=$Nf=B|2g>GxSsS_! z$a$vlFd6vz55x$iP~>Gu_@f8)17U+w4kBv5GAO$W+F`go)SWyxkjj5Ha7vSQn+aT6 zEaWktNt4=(bJeuEe?A@%O)ZF1Q=QvSkEAR_`t8CSQiTe-Tk*Y%s5Ny6uxd&+)x?t# zhT~L5uw=Nl5jbvHi`B~(*bp4gdrO7jDDRvu}cD_&Htk z3uPgiLvCn>JLqsiR)bL?wm)YhfcPCJ$rkc#5d5u+Cro0k)S+L2&&!o!rx^4Fc4yi@ z-s(Vw@u|Wd84XVYLWn{N!4Qxvb^jzL8}wNEZ{0inAMYG1%@S8I?9^4Icq++I3n0%$Z1WI;-lp zv=f4`l{P`I5xM>}u_DBNa3T`FN_)Q&U^ee(jWxl5otYlcBoTc?Y7)ks0)I0+*Xlhz zF#Hq}_YuD{9AY{ZJu0ts5YX6wI*4{aK;rOem|Q96HyVHG+^g*VO!F@ugI#OoEXz=I zJk4Y+?cm{8z|m5E+!Z}W5lOB@oQkFW;}268G&5Us`mo;;zYoM&L;K!Kj`Ndyt6j`Gx>5*4J3gYddO(#j zM}Zqw+#L|S)mmH+N0>b zK3Dt!+KUt|Feei6^c_Hd?&y&k&3ltRd zQy%TG#H2#&C47R^J=60>K<}MVSKs&qGK~vP{)~TC7zT}Qk;w?Z_*;jjSYpO(x%FlcbPV+`{g;#5Sf=-=Rq=5q)bo(@8h4*=|>dI!4BKE0H3$X9o-qPn!Sf=o=Ui{RM6unEm5g_BklX z6hBnuP1!4yJCf%uMgUB0l1qc)&p9|>?&H)t3Gy^2VLt6aYqNni;0IIcLBX3U4{yry zeZ}~87}MEzFUBHa0DRWp1)2}R%t~sn)QxVT#Z^F~9vOs|rF{ikP!)dwEiz}@xH854 z0bz$|o+k=Cb~$WUKUs3uX(%9`dn&J3;tkE3M#3|fjwV{<2_{h`7ZE6Xs$ggd&z%D` zQ9(bczSF)_jS+jb{XpOiuA_i0wMdE-svnzj1jGQQ`O_oFB+SlvmjEA>D{lPZAV$1! z&yDNiK(c zDl_!FgaovPsSZ@)v3I-Qb@ z!gB_9ZN8vOMl-reM*PCoqrFf8I^-r3e$49jOl6bVS`*%XN6>h<6%6&-B{7mSnr6YI z^gzV5@*Ff@Z3}hv&3;||P1irrRwLv}K|mh?ST+$1cP3|t*q(Y%jPD@qdIdPj z>8I|17-`g=RfA_+Lm^bGLYL}^*D4Kksl0DVBwh}b+M97bZiE88 zbuNT*Ax^0I$`ddS4{wTE@LIl^7CbDXt1oeNXL0a*P1dsdGwu8iKzeIaD?Vop+ zd$lTJs6bC5+A!zWt(XEv=fD;r{3PSUin^`Be%HaIYN%%S+wjnDHE|AF#j#<=+|{de z48hCZQkdh9Fd0!>sAH0wGg{Btlc)3X66y&$q@sZPozeM{2CxoYgN3`E_q_vo4S1^K zycYL*T&TWAq89?;PX&`}$W z0Qv7!W%f<06+R?fZ1Fg z81kvf6m%Yc{3_{yO)Y)snYyb>R6@lGa)R*=px+t9B`1#zvMYt5Q|Cm#EkEb2u}Vp(7ROvJy`)BJ*}4DbcBkI*c8=Z2&yHWvBj5LV(xn|CP4`m z3?$LHA~+NI&LJFm?iXJgJ>C!T=;CE>u}mBkX;inLc? z*dd1!!nD1-b%k1r&Kc0`8IE9i$saZ8Z}3QbzBnMM-ZfZV>jzd9&R}fT92SUFbN7bK z_8)!2$2;CH@s!?5H7RKLqt9>l7}tilQUe7Q?cHmm1WM{+d^u!49n!Gjd@4t$` z9V)GjxVz-93A0Xzx67L|1EKjI-vGNQf@txB(;%OGt~EpH3`1DrQ8kYO!E`GgZ_m~C z>IQ-oGJgleGDjkb+`ow~|5Ac`D=vI**}#8?yx3~I9Kwz1F!~ntAlRRasEV!09srtf zGGxL}G3Tc5p?ZMIQ*#l$nehox=>%E|>?!D~@Cu>VvCJhOkTu~3=L35611rYO99o_H z+@A(L(Kg{bpayuFK>^f2%ZYI`+6@nTeXQj}FjrOcmRkQ9`wmT!NZ>jUM7#~Ud;sZ9 z7ugGV1?F<=zOo25zg$!(LC@hUC|%d%4Fs;&{QUw9)*6M;gv-(kSsa&#xz$(BA|j`S z4B8~AgzdARyQibHGsKopzPUiOe*DbTSL&|$J@Cc^bqy*Z>&Js{3R|OOpDzE*Lq*xi zYij@L_Z5h|U*oEu)%jMsyu^_-#$-@x^Trwo4mLvT3-|uEfqLA80od>(Hg}5mU-l_m zUG~-<8Xa|yB78iktaXkl`U%`vT_O@76V_A5teIALGqD3^6sJm#_#`5$j*aj%-4Km zi&xB#IXLF#+ROTNnh&=$&_e3VGK=*cTR+Sy8cbrzhW~-*!poi@P{m}X^Q}qx~v?UU?kkEK8 zc}j>@FT2M;s-ccl9RUhL?lzpBMJx1X|L!yM1AJ1v9|f3R@%Uiz^Kp+WTs5G?)x3v( zc<5&Q#-a0y?bbcgmVT(9%|IFgF2=%WcsxNOIeLUt_W1h-@6sFWXSn^ze}qopHM|D` z#R3ywEZd|GO^|OhENYaUa00i4mKj@N% zP5JTQ2{#d9pV>+nfaBj}*?(sD=hQa>)Juj`J4?B4^vC&w{6GIL!}8z#i<9Ml{I^b) zfA*jKak4D`#a}yF{_lT(E&MNQ{SW?Tt$+NF{?k8eY5(P4uk~O2{k4d{to4uncCG(W z_-8E<7?=O`KYu>sKl*?D-OmUu1OLbW_J8%S{_R@-)_?wIt^dt`{?}{$5C8sJRe4|z}@1nPhsyj%bY0`s^-)!hY&n9GvNnqYt#VZ_XOKy-~WtX6NrR)Fn{5+@w2b>+U1LO&G&WI(D$J# z8nAd~s40}S^#aQNnq%Rc(-(s#p^53hcBwAMC0Uo(Kt{RssQAt{~@F(4)o*qk?c9G6vLax=%JF> z@=LT9tx9fs8w>k{8%1f>k9>p^)HW_J>2>ax%0mn@rafR1merlzYG! zImP4yr3m+JQuS#95{abj&@>HH#Lqi`ZW5@znV+jA0r_PWphC;}M3c%I5N!if%n%b* zEOM-ShG2VfdaHF^vyynbx?_mPx2!Mmjr{Gw&b`5G#7Bm!h;NTCG&|lW_Xs$QNzt{d zE(g2K>lF*TAc5l?q~+#w&P&O@sva;L0w}-r<9)a$jwApJ9#CPI>$<#NdCw{nrQ66p{76ZlBcgDv_@8oj*h8zH46&I#~a1(Sgmw>d0qci|1>QTc zo!NAbAsb*yMGSNDX6~w>K$ZJbd^sD0sLjfK^sl*m!l5)Kwo3}U52;G@e#1W;%vBC;~pP+w}+;aCY}M+&`5===6vd0E|x zS3CDJopIGr>kBg%(`~qWN2~v!UJS%(7{{p%Z_+>Pq;tBmH}S ze;1+tvWxup|8^I_{;fZ|$p1S0>s^HT`)kpES?j;|w`-CA<)5|wo&WT&*HU4vzvD&y zH~;KN|M5Tj7k8xOU-{=d67nDZ!#{i;*TDm1;w~87H`Kgv)}Ui7rgq-isfq+)4SZ<% zMDpNaN=~u#qPe+(`gnov=NK>i1(!t)ruJ`+f8IDq`8R+q!_`BMi??ugAE5gSa7$4Rm4W2&;a$(_ zF3nGd7u458cMhg`6!|f4-Z?^ECps6iwIJ#k_70NPh}2SzD{C?YQw$F(vL0aJ-8*($rnp$ZK|IKLMt;uYQY*c&mvT+p9jP|Mm4I7FU968%?yNVBN$=oI?fGw@|vPP#Y3 zA@+ugLDT_bRSD2$fLn~+dbi7g+gCy{*!1}91_JJ+*y~Sl?wBoCs>BO}vV*#jIzTV> zNeg*neou$aB5XB)24vtr%PFt`jHEuOGypkLKo$iDK-xg7T?S_#y?);=zn(6we_m@S zT^MANEkZ(G-_{ubmdkNzhDP=-M!OP|`-R%p2-~2T^Uu zmRi8t8On+Uf>Ja;=KK98n^DHO-;5OA8e?6yA^ozw_nu-e+ha;t>Si72>gTtQD$5`90pF}0ctoS`8*Y4?06{-|~SZ4U8IOgkpXriWTb{7q^? zB|G7>{uqL-Do=)9fae5sK>Q`9FaDXE$yq;6xGXC7-0ushOtrQLP=^r6O{O6Nd)n(l zTxn~ECbk(E_uMGs=y*Voet}I6u$tFnk+Vs=snCXV65pHAzi$T$E?nowB?p`8@B5=} zr}mo8`5b=J5rdRph^U{yQ5=n0=@9#`2BL$*wr4Ct-Iuw8l?Qv=zU&UinK^sK8B`5^ zp#QwSpBh!(uMATouGpRX#2qHI)^J4-z$EZ0k|}u2%{(+- zC!xC{y1ciHi?>6I)UbDskQT0hf)nNaF~_3wp`aXe{Xtks2!3Xbq$pm6RB3%7NxIyZ zSCZt=RJ{x^57OT|pk3=$la6Rz(m2#_I`;l@+LJ@j_O6Kw95@NyK(R1{0umCJaO-}% zsUebtz5iPUhKfKrDWKQNaJaF&*UzKLJue9qeyV*SFID>kYE7XAJmE*xFJ`gZptAi1 zST<*h*4fLqSs>y{G=6A52`h<%RP}mlg$8v5+YadYu63;Nf+AL!V?6v3M)Bv>(e-vc zG2g$gn+oY7e-hI#@Eex+X3JI;NUl{{>UZX%(RgN;SeFlUDzKKJgZiOA6bky7iuX7A zLN~_`3g%h9^(VDwh8L-`)!E7&SbyWd)`5Mueuv;8vDKI^m5f?Vs|7cUV64jzIRcVd z-oo|EbMAIhJg+CTrub-@++Hydhn9gFi6p{!?k7U^@-gpJ3AYc}81vR9fjJp#rUL8| zh`n;ZcLM=gntZxJ4jlym0lW%&MAF6MZ{UoAI6m~J0a=pSc%l3w8h-qbIH(r$Q)&SY zq|?V^Pqf4fPuAEtQRHp&6l|+!=?3?@_HwJ9FMo;uC~^T!!VNG#z)yuYs1M)gjemwA zG|syI-R122L_hamOM}bH>T2I&fcBbwHtc6f&C*!(7vQms!g(L|w7x$#|M*G{wZbTK z?yrH;qGs0F^@O4KvgvKfLpm8MMaN?F0^--a0FQiFC$1*V(5h+jL6HF`@oox+gvJ`h zP2G3Dv)itVX{s{}%eBXa@dl!h> zi6wt-j3&a>NeT8J_!LhX1p)_Au)r(h0^gRF7mGtCE#b2@(R(A-g@oBq4~0>?h26|w z@ey!9`U58%3bmgoO}~}Tjkk*S|KHcS!_1DSb^3q=LXBEWun7{u5fDs(w|#fH=^3!A ze5rC(`BE;s?0{0)<2N|Nh?R$weX0r~(ZboZd4kg|;Q3meOpte+VZDn11DY z*Nm%PSeC5CtYE<1_F{c6r##$aNu_y)4)Dy(ulvs^a%w|A#zR|O$~+%>oo zWnpu+hbKL;A%E_k_3U(}2sm@B8QPTgerwk^Tx>mjo!j^axR^aw-t)|M*0hV+T)6Pj zez!WNH=I6Fd#whWyA;Gk9U21a=9?cDb6FqiAy#{1VOHU0XwD2zr6o5tgL|B@{%K)D zjxi^8@s@u^$9}avt=SFoOr2z>x1F^t_QO5EF~<%vj^0vrT&dJn*|drVU9whOabn0? zdNL3@<9JL3Zh}qVcv)YjlgBaiWsjUJCX$D1J#*YVs)k6QR#6S@)o#bf-HqXzWo35O z(wbT!x+3?h8Yh-9NIn^w=jy`9j(NQ}=gXyVef8}wr}~Z&d)6~9>or|YPkGgl6!UVa zhhuGdN#a`9Z>o|$B9Jw1wLDJ=%jqNp&uVznZX+tk_2 ztNFm6=gq#AfF~-} z;E=-Oi7<{{9uv>oD81Y>BPf_wos#_wj>~5%?ezU(hd&LST%M=tUW+P`_;9!av}+pd&od*z?XhJR4dE56%K_#p-Gz$FcRnm%uWQ=Yxe-)vFW*s_b*t1vk zc%dCHXKYV@SjO5cN0}?rr3dIsTJF`*Chqe3agGZtc@>iU0%RI6w(McQa6*qI zhm(aV-1=bU@&kJyVK9-QLTsi$cDa8BcX8XgyZ%o5G-I?Dau4w{@waZ@yy5<<3)EP) zoviCC^CTKLbX<=rX*L4s&su9Cw`8LYHrXd;9b7lG?Fe(V3k2R?PGDVk+PF6kE@tUC zLEmrODx8|Fy*cwyR#d$<4F?tT`CA+&S(&U~Alsc6z`N>EI`6G6Ffkbw3`q5u!FeVE zf5P|}Zzy{P0cJrl2aGOf!Al1s-w}Y@v}Qdy4)i@q^-37S%o@!(d+_c`2Qb2@&=e*Y zYbumimwVjcdgIx%Q%;UTQ1nz*L5S5qo3;S?aF)M^ePv6R0-ru}T!qU$E6MZ5b_4`b}{y zz+Lmoc=Bw+F^)M~$Kr#qxoBOVy-^gBiy{_>T-E%0Ybdn(rt}er+B(q~j+0m#Y5xP9 ze2YF-gXKy&;-pko(KB8Vv%AHm@rFh~T}P+s>cnOqZH`<`>n>?#0n?h4wWUnYuY&P@ zStr~=I^bILQLG$lzk-YUCFT`_gcG>wdXU&54BLAht{MBEtMsZ(VvHA~wqnMQEDx zfv}iHUog! zghW^pStyFD7t@=rvh&>S*-(;FP{PDRMu-Bqhwfl$vzMFw{=7-0`n6PS^2BLRInObm zbfPIOx*g~Cjq-Zo86L^g>4g662#Ehuj-rs7yllHiX7DZuIgsCvE4cpdL!$kgT7>)8 zakt%EXH}@Q!*o6-5f$Z;_Clh>qPY`BMy>z?gA_YqpTDm}cTLCYldm2z9H8g1N=q$jP24kvH(k zg9`Ol=o(H(V9V(-aNxmJn&xpM_}EQT4Q(RIi-hbkeMLNmkn_c@dxqhpcMDquW9Uvk zxIqTxFKlrvlK|Viw`xH!?kan@IUGOyIiQWhQ)}d2437C#)tr}kxEw5e{+|6TJRoOR z$n(%H2PSnibT4l_Lvh~BuO#_dZPsGUkZ2A>9K?&+#(dO*(FII24z?+F3s^blmRH(H z`OZ>m4scdT=r>*3GKckUc?%Ubd20H-aSU&lc(LZGJl4#uP%ak{pwAke*4k{3^}oH% zfx5C`RyuJEcL`(<1k>{jcFWCi8|Np|(2ht#ifpO|yD(s97KyW1yy(Z1 zqAHQglIJ}^-W?T5&%-u(XocwjEB>Ui+54~{-95|Rw-^XoP?ls+*7LC>73v4T*4 z24*JCjB>7wDU*1s<0VUHLh6j58Z{$=FT21nRARjuXVzkemlE+DxzdI%bnf)?rAy2+ z)QEgI7Y?VL>cV2B%gRmz)7$pZO1Ty>)o#fbV@exsH3+Yqx8fKEMLNm!RVbv}W=n#0 zq1mme+smZ4V#|#e_KDWh;dE(rp);FXwVAuSn+wwJo$DA-&X+tWQqG*yijv)rTM{T| zgI@J1@e&4OxomtLlGXfCy7dV&dihB|Cj3fDP605kGoNe6Yn*7^wYVrl99!FQCUKQj zCpa_b5Ue2}yra8JI*-}X1y7nOLP^<>&()QlY-lGpeRbK?VwQ?oKc}qo4AzW?*yMKk zoV1lpHR%{2C+L?o@?HZQc2$mIOE(ht}?(ce`HXHEAX!c2r6#r=V@LYHEr*EjG`eLWL z(6BR$;LzboDaGlVq0BdkX>prZ{LDC+TW_u>@mB0x7g-b*ym{!3pf7==7?AaiEUJjq z(0X8&KAciou3k(a8s`CkK2rky=s`?y7YxX#k&h_Ia(bm;Ii^{^9}w1>TjMHmuV56+ zhiF)t0jp?&A!weET)6GfS8cxPs_Fpw&N!~h-LbBrwYfidtl!$xEM6$jOy0<`u54d+LCE=* z)#ycYB#+1SSmzkZ-eQYm?|n)VSh|CP8%&%iD4oM|bry^nZ)zpG;&ti{K*pMQ)fm+@ zE3#hX>5Eh@hb?%rH8qHSc@1tC3Gxl+hV!Ip-jNJ6!w%)_N16>5LU@dgiC)x8BQ1Pw zUiT4S`mes1U^Z)#zFA5u1M>}8zC{da+8wMH`pLq+K*fIQ5b&BSZZTZ8F%aoB*r0tm7TV0LI$#AV&pf!S>}&@+>ZA^IvZY)rnJd%Ih^nhqqh z*q{2Sqk1&Je8S^aqH^(ezyvIZOHAq6`DKA{)bW@}y>pUj%}FZq%Rq+44W_VLe!9Gx zyWqx{cRVr(vYp4)Ph1k7};Iu1kZh&k+$o z;#-_Gou%D=;6dlEFgO*yCdG@XZ1pHdC%SsRqHkOgVEnNnUcS)V4t97uzY@r0soptJ zw*p@;l+*rp^tkxhp0kUeJ4>u4?-oE%_(y{}PD(FYCUG|azT;}Kc+$1oTZ=?3@68_T zS4sllZO@%~ntff53EWa=Bf4i^5x5KjUAYU&l#6gVi5$gltrL-^rj59MZoTas641vk zVAtYKTqH&3Ko~jzBWJREG-0N_O`NEtIT6|1dmys+JUtc>+s9X|PgyIQTQ3otF5KSm zH(J5NgjudS8pl@$wrZV6C+Vim9BW@|YxcA`U62b4mxNV6usqLWC7afo zeRE0E#a1Hbd#r0WYVTF2NH?SnS8y&aQW|#6Ur7rIUZl7~MGQq&wbb4c}Qrc{{ zW<^uj*d>ULRlI+l3eCCp_9hvrvI45dALO*0Znge`hj$>`r>9Pv`H5anR4V)0od_BM zNj~3n!F4ls)!A;j)xAl}%Mi&^j^Jqzjs?11bui4>=T!~@(uL~dBA;cKjLmW6Xq&OJ zViHO@ly)5_6Xa^6Ek`#=#5ff_n8(wK*U1PgWUJS)Wv*%ld-QCZ>88`n$M|v7k~KA& zrS-&CyqMK4+-5$<~G z>+6j1AD1)MyUsNT(UA?y%V@pGu)lBU*Kt%T5i&O&Gc4fx#4g-&`fQ_E$|!B-XGv=A zwtVOsZy1Oe^wY>cU$dR6iXPA9BX#rU@QbpCt`?8l!7nrT3rBqR4wc}n_y?zGsx@rg=%TMj&W4PBCz>k7ijtg z_{rzVZzFKWI~mGStD8DW#BAlOF#UR_a#j_K;-F~$cuZ-*B!eeI6TSx7&elqj(JkUv{!y&DN zK+8Uo2O>6OO@GdKL%^r~v84-tX|57_Ssv74d!MIt0sQD*os*mm&vELo`x!{h&6(`w zCmlWRTTDuqOV|&H@MiIk*j3+BF~_e?vV8g>$?_k*m}L3-|9nfb{M0{uZ<6H~{_-m` zpO3d%fBUCjsPz}Wj)cv3{`(*O_V?EM?XRx&{7~y#U##`Nkg)l?Kl^;G-}&lVAj9Et z{mB<={RW=nx8Hxh*6)6Gt^fR?)*pYd);DGA$Nswde68R6>RSKhL#;phl3IUb{n%gq z@xRylX}piz|NWtNpWy|3`+D~yKll^cZ~jZV^+(<*@7{fF`->lH{o$9_`aAx2-S58k zZ?(SltsniWTEFz6)*pO%t$+Nr-}?LSt@SH^{*|@<>xWwZ|I2Ir(|5l4tKY5lH9W3A z{QVz(cl&{NAHKf-IsQPl{cmrzzWqPGwAPRR(|7*QFTZ=IyRP*K^`EHsEXls#UdQ+9 zb!yHZf3!>bThf2}zDe`u@$pA!=Ov%Mccv;{lz!`=KXK|+K*fR@!h-M(7yYQ{xgQK BEA;>X literal 0 HcmV?d00001 diff --git a/tests/pcap-filename-recursive/suricata.yaml b/tests/pcap-filename-recursive/suricata.yaml new file mode 100644 index 000000000..5fd105c0e --- /dev/null +++ b/tests/pcap-filename-recursive/suricata.yaml @@ -0,0 +1,14 @@ +%YAML 1.1 +--- + +outputs: + - eve-log: + enabled: yes + filetype: regular + pcap-file: true + types: + - http: + enabled: yes + - files: + force-magic: no + - flow diff --git a/tests/pcap-filename-recursive/test.yaml b/tests/pcap-filename-recursive/test.yaml new file mode 100644 index 000000000..4accf7704 --- /dev/null +++ b/tests/pcap-filename-recursive/test.yaml @@ -0,0 +1,36 @@ +requires: + min-version: 9 + +pcap: . + +args: +- --pcap-file-recursive + +checks: + # Race-condition regression: alert.pcap is processed FIRST; http.pcap is + # processed LAST, so the global pcap_filename ends up pointing to http.pcap + # at shutdown. The flow event for the alert.pcap connection must still + # report alert.pcap (via the per-flow pfv), not the stale global. + - filter: + count: 1 + match: + event_type: flow + pcap_filename.__endswith: "alert.pcap" + + - filter: + count: 1 + match: + event_type: http + pcap_filename.__endswith: "http.pcap" + + - filter: + count: 1 + match: + event_type: fileinfo + pcap_filename.__endswith: "http.pcap" + + - filter: + count: 1 + match: + event_type: flow + pcap_filename.__endswith: "http.pcap"