[PATCH 3/5] nsiproxy: Implement IP unicast get_all_parameters.

Huw Davies huw at codeweavers.com
Tue Jul 20 02:43:25 CDT 2021


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/nsi/tests/nsi.c                 |  14 +++++++---
 dlls/nsiproxy.sys/ip.c               |  39 +++++++++++++++++++++++++++
 dlls/nsiproxy.sys/main.o             | Bin 0 -> 37448 bytes
 dlls/nsiproxy.sys/ndis.c             |  21 +++++++++++++++
 dlls/nsiproxy.sys/nsiproxy_private.h |   1 +
 5 files changed, 71 insertions(+), 4 deletions(-)
 create mode 100644 dlls/nsiproxy.sys/main.o

diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c
index 3408dfae58f..c07653c2ede 100644
--- a/dlls/nsi/tests/nsi.c
+++ b/dlls/nsi/tests/nsi.c
@@ -415,11 +415,11 @@ static void test_ip_unicast( int family )
 {
     DWORD rw_sizes[] = { FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[0]), FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[1]),
                          sizeof(struct nsi_ip_unicast_rw) };
-    struct nsi_ipv4_unicast_key *key_tbl, *key4;
+    struct nsi_ipv4_unicast_key *key_tbl, *key4, get_key;
     struct nsi_ipv6_unicast_key *key6;
-    struct nsi_ip_unicast_rw *rw_tbl, *rw;
-    struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn;
-    struct nsi_ip_unicast_static *stat_tbl, *stat;
+    struct nsi_ip_unicast_rw *rw_tbl, *rw, get_rw;
+    struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn, get_dyn;
+    struct nsi_ip_unicast_static *stat_tbl, *stat, get_stat;
     MIB_UNICASTIPADDRESS_TABLE *table;
     const NPI_MODULEID *mod = (family == AF_INET) ? &NPI_MS_IPV4_MODULEID : &NPI_MS_IPV6_MODULEID;
     DWORD err, count, i, rw_size, key_size = (family == AF_INET) ? sizeof(*key4) : sizeof(*key6);
@@ -475,6 +475,12 @@ todo_wine
         winetest_pop_context();
     }
 
+    get_key.luid.Value = ~0u;
+    get_key.addr.s_addr = 0;
+    err = NsiGetAllParameters( 1, &NPI_MS_IPV4_MODULEID, NSI_IP_UNICAST_TABLE, &get_key, sizeof(get_key),
+                                   &get_rw, rw_size, &get_dyn, sizeof(get_dyn), &get_stat, sizeof(get_stat) );
+    ok( err == ERROR_NOT_FOUND, "got %d\n", err );
+
     FreeMibTable( table );
     NsiFreeTable( key_tbl, rw_tbl, dyn_tbl, stat_tbl );
     winetest_pop_context();
diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c
index d5fcc689fc4..ab1b6294bea 100644
--- a/dlls/nsiproxy.sys/ip.c
+++ b/dlls/nsiproxy.sys/ip.c
@@ -180,6 +180,43 @@ static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void *
     return status;
 }
 
+static NTSTATUS ip_unicast_get_all_parameters( const void *key, DWORD key_size, void *rw_data, DWORD rw_size,
+                                               void *dynamic_data, DWORD dynamic_size,
+                                               void *static_data, DWORD static_size )
+{
+    int family = (key_size == sizeof(struct nsi_ipv4_unicast_key)) ? AF_INET : AF_INET6;
+    NTSTATUS status = STATUS_NOT_FOUND;
+    const struct nsi_ipv6_unicast_key *key6 = key;
+    const struct nsi_ipv4_unicast_key *key4 = key;
+    struct ifaddrs *addrs, *entry;
+    const char *unix_name;
+
+    TRACE( "%p %d %p %d %p %d %p %d\n", key, key_size, rw_data, rw_size, dynamic_data, dynamic_size,
+           static_data, static_size );
+
+    if (!convert_luid_to_unix_name( &key6->luid, &unix_name )) return STATUS_NOT_FOUND;
+
+    if (getifaddrs( &addrs )) return STATUS_NO_MORE_ENTRIES;
+
+    for (entry = addrs; entry; entry = entry->ifa_next)
+    {
+        if (!entry->ifa_addr || entry->ifa_addr->sa_family != family) continue;
+        if (strcmp( entry->ifa_name, unix_name )) continue;
+
+        if (family == AF_INET &&
+            memcmp( &key4->addr, &((struct sockaddr_in *)entry->ifa_addr)->sin_addr, sizeof(key4->addr) )) continue;
+        if (family == AF_INET6 &&
+            memcmp( &key6->addr, &((struct sockaddr_in6 *)entry->ifa_addr)->sin6_addr, sizeof(key6->addr) )) continue;
+
+        unicast_fill_entry( entry, NULL, rw_data, dynamic_data, static_data );
+        status = STATUS_SUCCESS;
+        break;
+    }
+
+    freeifaddrs( addrs );
+    return status;
+}
+
 static struct module_table ipv4_tables[] =
 {
     {
@@ -189,6 +226,7 @@ static struct module_table ipv4_tables[] =
             sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static)
         },
         ip_unicast_enumerate_all,
+        ip_unicast_get_all_parameters,
     },
     {
         ~0u
@@ -210,6 +248,7 @@ static struct module_table ipv6_tables[] =
             sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static)
         },
         ip_unicast_enumerate_all,
+        ip_unicast_get_all_parameters,
     },
     {
         ~0u
diff --git a/dlls/nsiproxy.sys/main.o b/dlls/nsiproxy.sys/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..6e44033ff5a72e170a1e300ace272de5ba9b0b3f
GIT binary patch
literal 37448
zcmbuo2Yggj{sn$#-g}dQB$G$-#2^6z1PCo8fCv(hkOBiC2`PY$aY!Z*2}ztn6GTA;
z%%UikwIjOfu2|RJ+kyqVuCBd{3#;zxVwe9p_uV%$3Aq2?|MP!v%Q^Sn at 4LOf$%{Yz
z>$emkga+k;GN3A{<=XgR9rnXKb2kdH1pa6;JXJ5{FA#`^Rz?$n0)hJS1@#F`+gTnv
zJjFl!2O*}D)Ww-J_yht?!D!I7+qkTxz9fMe-UR$IHNkba1p<wcXt<?qv2y4hj|(B=
zO1S;lO@=#35M;EsMG}eWE at KoDJ`w&ePP6kXDQMh^w1gJL76%X+$pr#s^Gj+g;_gk5
zan5id_CQ9rCmt0?Mr(Vc^wM3%mxV&ygv^{fp_>FD4v`UDv?v@}&OGiKkF7 at w@dJGS
zaP0rPjFz_McKYfrV-qstsBuDkGsTv%=X at dh+tx$k5e~L34n+=?v16$aH3-x5G&^9D
zeu#`^!A2RC?(z5!WUxM;@IPe)J33lJfwtf>M&ppQd<z*jL&%B$2N~^)PL&1IJswvs
z6Cw|?HNK$hla!XEcyt6CyUTb?$r$#3kP%(gaoDtc0vY2hA!h$i8IA4B at cw8Z*0!Rh
zttk+wEK81Z_IkTq&fI8Ms)sLNla)_WT0%<#&0*xI?a;lwEP;%R;q<bSVfzvSO>l{0
zkJt5<HYufhe*6L%4R~?WCOgEthzH9WPdpxD0kWYa at 9Rl7`JkD}e&bVw at xsmk^tT at v
z*(2WFDnu&+AwIGW!ie{8l*KTIHdFfg-%rEl&+6vS+wkc(XYD@)a`w{q!p^nc1LrP7
zFXYWQ`+2aP<!PM@^mE>cjy~(>g9n9JK5lbP-tMwI{UDyb4?x?n-+RvE(ZVg~Zbv8t
z|B`Xta_%;T76N75_ta(t+4~%NXZn~0uISn34aKv?7QZWYpcw)SD+g`((G}~pr7UmU
zuClzbgXl4nq5v`mpw#^t_f5{Y at 68Rnzt6bu;D&>JR`l<D_|Y4XTdwa9e$l*JoD}`?
zdL*GaW5C%m;TwKBDb|zxNndt?*s}UV87`2q{*QpW#7UdqeB$dgL at X!c-m|A>qsQx9
zlb5q;hHLZ7Pwe$>_%H*sCqcVO>xa<VhL7p7xAa(#@YD59h}`hFvEfJe+J5_vVGP>#
zrO^oQGiVIj at VFa}YjQR`<=%2}UM&(i>E(=bbC8+)yqnBv4EX6Tf&9>r32QQ%cTaN_
z6zrO&6>NB1-{+dPOJ+*pW<783#NQ4cL<+3UYx2x3=Wa%x1Ep;_cdc#n?$+}-jP5OD
zMxOfz*f-DU*m7<@63Y_Va#CI)%5(3(f0gC9<=knGLs?!f<-esI%JN3RfA;2+^1Pdi
zS^lh;0;b983^Og$#<KD4y-o(pIp^`%kqDxr2&J_1Y-y-2qwPxOisnHqVtybV^L>e!
z^A&qBD2SrRw}if17&!6dC%vM1>jPlw at YZ)=Qk{@wceww*W)L#jKIWaZ-$asR+c>^6
zW_6Z(&+A|G>X|>gqFQHzxnaM)W%FF*YVF*by*qzFCO&O$_~Br*U`vGyelp5;ZJCq3
zdCqrR?)eU_XKu|Bc24v5u9rUbd3#scLC$)bFIjlv$xk&mHy1edH{L!s>@SoN2z18M
zIv1XDVB^cE^xl}U;i<HJQ#(u3I%n&hb>1x}rft}tySWmjRF4Y5Y~6Sy3!D{VW4djN
zSBL>@xliYIYE!&srih+8MTe1b_DH0AilFtJW>`Dtozl75yW!xdjP+H76=|I_bGIBn
zYSIT8>!*-dt#7FrwPAnS!H)d-H3vKL=GGqU$blt$?=?v9hNlZRS7aAGd(Pt-WiM^6
z%K5TV3OQxNO7FysbACbDb)Er<dguJ{h;v@&jJ(c3KI4l at V{Xy4&cG<xa$Ik91`1)x
zb-k5w`;%w`lb*;}|0qHuvH4qO=m?RGHkSs+EoCW$R%d0NnQ{Abt|vMXKI8V+T+bnr
zsD_0#2cvm~wRLl8Kuv at i4^?(>Meh8AD{>C5$lm+uPmK9A#C(c at _(svasmPY)<!`RY
z!K?B%r+j%Pqp$L(Fg(`Do5D#Sgokw2>YXd|Iv3=lT{1B_TZ$)lE?{DET^}H+=A at q@
zC-1JvP8Z_weaG4b>WYqF`N?vdaJX{A`^4VGY(h`xBJ4v5i at x_%)TgmB#@^&+(pisE
zFE*L{E!F_mh%GgRFtSl)k={J0oVxkYb8DCv6P;rF;>WJVhI~Z9?Yne$MGoJ;Z%dc@
ziRSS-V at 0P0Tjr!~p7X<&GXnry?kPkCLxq0^VBX#frBqb-O|YEx^rs*fp8V9ownz(X
z at uw`@vOE+nZ;OUkiToiQqjHBthW8ZtZL!wY;bQQR!tpCbeoNc(U~5a$aDlLamiESI
ztB`u`kd?VD;8urnhs1K*V^L-8nQ(4vkLE^V9UblAXsD^D2sSlg61=>nF(jIUEv=!Z
z+-Q4lV>lFyhH`B_Hxv%HhatJAC at dN~Zv4>`j+r<qxTvuy)O?aC6Ctr&w1`HSCy6Q%
zfnC6M9R4M631 at S;m6h}6<RWR2miD&XqQV0F%gt|W#awfAQDI?WK~Yh`_ at fJs9xj?%
zTO(tTijHvm%2frCRgp2vf-P+Yjbcng1i{BN1(&ykB1^_#Dij($ZtUo22<w1AfH2Us
zsBuYv^OWXbtTn;PX at 299U|U<LRW!E-7e_=4Z&=)h1cMF>PBn$JG0Qkv>mm_;#gfoU
z=}j&d=9kVasZGd;EJ1#X)|R%V(lt<5UfNLWuRlKEpHov_TUT9GQtz*>3RITQE3XuF
zp~hIaCAzAlt-Wp4vi4Xc&iI=`ZPAwImd0QdnUtWHbs*jCZC%;2P-|$hO$93amE{3{
zRYi5}9Q#eBl_hm`q5>sa))EdiM%%-y{8$-;m)Qa6P=OltyN=V_qf36 at F&JrS>@Kb@
z8f<F{hMT(c{<df++!k!@&X)(fGbN3Up-7}VTZNM8&eeukUftPBWPf*#p$`#R))MJx
zkF+q4yZf*C9iEwWXpHByHysj-l2%l!Whlq)qDxv2$pcXBc3F4#T;A4H-ON(z?oiSy
zvojhxT)xyr(Q=n{4^q?8afldlm3a3dQKCa_XjyyokRWr=KSWyFqjO`SLo1WxSQk1Z
z-KAK&gi)}E$?fVzr=o8952-T@(i%Ek`OIlw9x82(MUV;IlQ}om9zCQ^)rLBP;Yg^a
zz2(pXsR~6`w1<~gcZ3e91|?DKPb`W>L-oPM-QQCm4mK{u=0$hj-}FBljlb!CHn at 50
z(95v3QW<Jn99_~~cpW>K!xg!|J&{>e?TOB#y8wSX8fY{YnT{H_w3Z9}Lw(eQTiV$%
z%{)wI)it-Y*M`vlE<Yq7o#wT-#tv<fGtnO$u2t5A+htR4iZn!!lZUJ4RqU%;(HA!z
zF4d~&YL=`*PZVrDoELx7jMnx=!PfefzuS-bBX&(MlLKJ){D{|q(qQ9~LlRvTTNbQ3
zO!IfT!NVonej5 at WZEtKpq~#sbsZC$i5sXCaUa at pZsBx+6&$|geyeGRj4xcUE)9G(2
zUm0!s-AqCYY7I7q61A**c&CtAy$@~5w)FqmGUfzVwk(Tv>9ztDbsWtSqgX}c at HMO=
zQW;znIwUVEB6X-b-D6r2IebZ1MB-(AXpqu&OvMf at t%?ZKd-%8fUbj{eIb2f9%IEn@
z%LBFLmG;nGe|$~3m>xsjY?Xs`M3l3aME99sYT8$X!U at QVg&ARjs1Jr0hoW|B9ahw#
zskMf>NDio%*Hq6huMO1Im(-UFDccU(&=%<kHDW>%YD%Wd3cH}9E@*5QG%gvb)Qdpf
z at pbj(a{`CFwQdzU_GO2>)u!j8ujZbyjGs-_wT40+;8YB{k}4uyNfjTPoY}I7Q<G?@
zi_9glXjA)&wq!0Iaeq~Pd2K}ric6M~oZB>`b<|_R*wBVqC+46{!kO|2e<Uc%TcFKp
zX$-fQs`+PqEW9WVYD)bm5ixI0IgP3q^_tQ-rT!AyN~z7MkzVH1)JaZtp6wU_?U_~l
zeKKdHfT|k5@?2FTML10iA)NS%!1RW?z}$xNT1->R>;%ED9NtwsDPuj91RME^U^wJ2
zi^Ms038<lqFiA;b{n(Wcwl#u_d$gt1g~Bc9s$<KL>2W8vE==w*nwJTuGV)Nuj*cC$
z9)}iXp-5x6r9)1O6D(&i-De4ol!m&J8Rdbh>Uw{Lzci_3*`XUE!NuK5t(!wla4~CJ
zH`b{#oSt`cDvK at a;7BHt>$RN at ySmvG7o%`U1x+GUn37Vi6YQ#2BHMgbJN8<oM;og#
zShYu+lg%L6lM~A>A?vzSY!y;*lp0Nz;CQZXZce7>2gA!`Zxml0*(<A73{;@z`>V<W
zWz$P5u^?G6r at RYOUR&D*<D{jk3sGN-cGZRPSNZEj0ChPqr at E}6vfQbqbNuyz84aj0
zwD>Cmm9$sYv- at hO6P49fGX!QZqJg$RO?|CsZEstg8(;9zZGLranJA+!Jvgh)0D8>;
zW{kmQVp)4r427Be_O5Xe_DoGQ)Xl7}trzS9y7;z>J|<?wTAGB6t{rJk@`@5mN5+QK
zSgDVb`gq}Qu4FKoGCO^h?JH`6SY*mbi<vEpmq^&$5{^Uz=<Y={h?XdphE at f*gcULs
z0lAXpiCv(*xtV1QcQO5Vbo22fhuSc63!_#Bf~~D062iG!lN2a}QC37Ww#N|7co60i
zJli=H5o+bV80TmKbeud+YZHrN&CO`&O<0>Z3VF^Zov}rbwCB(yH#<aGt$!ZIpX%we
z%1cq=U16!6zxEQF1FmX4_9!cA)DRXAY!9aj)`k#?5W1sMnF4!rMTM-A{fgZC!1&Ke
zUX$IVMQJRIKv93VLj?S_HDXRvYe`cR7cn9*r>s&iB*_Z7lb||e5h$;ztu8Icx_b`J
zjY3U!tDhGXHS?-bK`}E7M}elVimKSi3Mw(084JgjR}zV|H at 2WanizpOLAlt04aiP~
zEqJ<}!Sze9=EE#I61De?D*bi!f%2;Q+T%qa$zIWl)v=f^b!ROg{MB;I$1pIxvbuCO
z65EZi*9_<ZP)kvm$+M%{&}lJjytIe82o|$d(yMFPR?9`H+#jh4wKbs=tqnzEVGfMb
ztE(%^ORAU^jZ5vcNPjB7o$g$easX*nhCh5-tC;Ptom(jyr0<fB#`3o1E#Y>#%od47
zw4Ht2B=WaM7Kxhfsi8~xaulqnnT?&8DpWOP&O{a>eP#Z-nv(j`nW&31%S+12(PJG-
zl`M*2v4c(=BVCBQXqZ?n#s&xTDkSCyTcRusN)*-D?rIIL5+#vUZH-G1VQluG)nZQq
zxfv0R4-!+0jXDg0GQK4>rGeV&hI(|Qjx&cy*0)4DWh1C8sm1ul3CRq`vn!k%3pUB_
zfnA{N5M>uAHFh|52FG8l8eC~fRVntT7%iuAVa+dMMXJSNCJ+nRwQRO(b(lUhlsnb!
zaHQR$64kQ~>)6 at ogY1^*q|L6xqNcolW-T%vO-WfwVk=u(TY}+LDnd1~1|-DA#yX8v
z)~R?6QZ>1Bb^sMyj{ay!r?!VHVr_C*#f+>i2{9g+<cp-jDV3X`@jW;vrm|8wyL+Y8
z$bQ_QkZ<cwI@^46+cBeyZwSt9D5>PeV08sH32Qm?$8^{UdKgE4^4?!%XgQii-234+
z7gao+O$ymK;{jBB0~~5+`!P7mwpxyk8kw>@RNdB!x+-_!?8;nIQp)~JEerx(5VlP)
zXmC>pU7Om`EXN`w#*RzO2w_eKTS=^`B^pQ7ZKbX45!7^a`<N-=l7Xt!2!S;WCW7cK
zFxA7BWs at Bbq24*Cq;58XVWEyD)VgX0t|;I&%1?E;1#`7vYuAu<F}b_s#LX$dcxKc!
z$l)dsFT~$<DQ#^*r%~U&G=x=wico#^>~c)h!Y#{CIhB*Wt09x at N3WnV#hJRchm)#7
zS$SP)t-q$ex>lfybNo-r6!a|EoD8<cvkALuf|DVCNoAl0V<mQb(e~@gS at RA{$3xnk
zY#ho7MWCdrEKpKkU+bUVP+wk$z60~8?xdW4#FxdW!A_AeF5TkL70UF-y+?#S+Hx;K
zG*tOZF*=|=)uQ%^KsT(GS!!P8wD|e(t%PunB?WaYX|BZW=2|UR2zaM5IUi3-L>;#J
zL#oo0tDQDfJoMD;lICOYD<tG{N6zEBZA+EPN$&6Lv?EvIVVsGH^y*AYlEJ(V3{LZE
zri%bIdt*axW2lrPMyShjVp5m9XiD-aDk4sWj@!nv%CSY-5pV`=_C50S!Hx=68gdnj
za{oOCR>v-)gv_`mxe<oBjqoqS>Zz*_7C72_+)D);BzqAoVC4=(sEHY*@&^4h_g(D{
z1fvT!dqZlnAj?CQkt`8qw>>Ff$48c&ZMDnJw%b1CW|^!kYIebSmzrmBkmdl4)$J-#
zi3t|tBc!G#1oku`vFYVxHoO1Q>Nz!)<uXg-eaGSH8lDQN4K#mq`AW<SBBG>eIj1+W
zvsGK!YH}*GVJ41IFpr;!Mp{{J*G9YCQRGSUFI5}s4s+^bR~>E)+k;wlEZPx^+RaJT
zFn`-2jN`qO(>XS at aY>%+csM;;ylYE}kBIl4Nykv|7>x&-!x^|r$~;u-=2Z&RHR5!w
zF1!d8vb4^RjWA3qFo(6Lq_R2MDRMTlBI2-HX40ph^HlC|pbu3xxiG^Ec>s}MG23$X
za at dKgZ5`p1b3Al>0g)5{QLHGhEyrXjA+HR}47Joq_K7*<p?>S^O|?eZ?b~T94R!<<
zVWtzs$tGrJNx)g(l$O+#O!s5%;AfYua-a)oODc0_Yh`0)jjnSJd+lw+1hh8|xn?Xw
z?Y9GqhPIZ|V%)o_Lu2KUNhFGeo~RA3usu}I7Im?3N4O;-Pl+(zgP9*(8mb7lFT=iI
z+**{dj!js{31=e-XK-AvHVJHSl&xwDE^BFoH?_Nvh-6he59=_8_O~_o(UdSXU5-G`
zYOKMp_LJ<`*|QdvH_5w;_KJy-6NlM*v;#}mvZ6}#Vr`9>ppK2(#yK|hV5n4xMSCpV
zhzvL_hM5Y_`Xa*5(~<5p=c#g9Ut3;R-B2rcdFM9xYs=?g at lhw2XL9cNKb$E-&iCVW
zG`>@(l3s^1Ic0SY2QimpxQLJuK;IO90at`wUn!Ydj5e};I6aZQ+t!XgGC6e8tc6qF
zxYQ)x9(nBnBk7z~)O7^Ip(5KDi?xh8B;`DuoBvLM*33M<4%>B=fs(Q^i04vT9u7F}
zbFkBmixIMUhGQLAh1=ohVdTREOZir)Y#Dc6rF>`aRe5lroTj4Y*)>3oVR8$G0WmzN
zj76{nKp)ZEve=ok$rH19%`A%B#=;hClH-ycK+Ip#(zpcqfX+#cL+BpmpksGk*f?&I
zoz<cHvPr!lcSBWtX_Wy~jZbWxLTV7(ve-Z>MO&7eoymuT$iJFkbcxfC{@zw8he_Eg
zk~S)BE7$%Q!$gg0WbCrp9XeZ|4z5!k(J95PoTk{p%hYbXu$!mT_a-%5wS6jA)=6~y
zJ at UZ94sEx6XWvq0iycDkslq+1PDGrgbg0Q`vvSWpQJ?KrQaYy_1EQj#vNFLY)%(Ez
za^zAR^LgiOvQ@%=O-Zes(#P9T{Jn>FQDPDc3Jev8k<u+zhsa8Dmzjc%OfD-`qbX^|
zAqEbCh0{h<*V<*w;slX9aq;Dwle7pHo^25vT%nVmKgW+{L;La;Y^|Uwvcbq&XU{}r
z`0D5q&cjN=i?IjU7A=a~&_yV2T--JuqqB1_Aij0cb>ii0oz!4|DP*?|XK|P``^27$
zn2ntlZ2wS~T~i@|v**y!$Py~Y>}eGi2H3f3jlXX8?DE>Ga#R7eM^iJqig#`jL~X2%
zr$>nZwGCBe)$^<3A?$-~$K6Iw&9`f^lXA2fc^>9q<Vi=Ptmb|kHLWC)%lkyGa1~SE
zg56v>=+yh?aAycPWZO`nxVnG=42f%L#4JiKG0InBypw&ujb+QhTN;<j5<<@t!>(52
zA~C-NyY0>ng4!=U498AG2D0<d7V0F|+1jO;+UiOb1t<A-XItHjB}Q#%F=A=Y(YcR|
zxT98La{xtGGrLTd9d*?|W0wR|ZBDBNd?ZS*jB_$<COGd$P)^5c%gf^B;dpT(QIj|}
zh>uc9BfW~Uoh at B9yikEuKP)%Jlt;!z?gh at S!;F)=QL`CEA=AJ^nB^gR^UE1|x$KjJ
z0 at qjVVOa=vCfaMKM0s%%h&5dRJ5c3Sbv!q+H`VM$t?Y8YT<)@~^_udO5L2Ue{}N)H
zQc5rwe(gA5yWQTa$M~!!q3F)Tj5I2ry*8I`lh*iT4^4kjkQ+bUR{RxMd->%QFBoma
zcqD`R(f!2VqxLuaCzL0r&fgyQfKwmzqSeZ^p{=zY%Xuf34ONxZ*iLkyvzaSz>fumA
zF0oaisfBvPUb5l};iAS?oJR3Np_65 at LvRi|0<G<fMGLp(aX<hw0-M}DPu_EEX$xQ)
zjngQBJzgpan~)tzS2yDlBbZmWMVoPSgR$AZtS6eC4a>$>9K)y+<S_PNf?-@@TpkRx
zqJlA=!7$_m62zhyCaXydKc*N0<r4FqyQU*yITOk)daa|m3CbnrLYEJntDsz>?o=3O
z*jDKBIlSwgaC;I8VcvxCwQW5IH;6BV0t-Suw?MZ&)+9XE^n at oWw}|HOi-41ro#rV}
zE>W`<#(LXIk(b-n+hP3GwmtykaoeiiCGLjhL8zp(r{MN at CKTRO*bH-(vO7U?fk)b0
z?x_j)T*rM3xJ9=6D2F3%gF-ARZmVr|Tyt at qIRxbvF^lFIQ1F at TTxvU;H0z~vZL+gX
z#mk2<AbrJ!ECICT#(mub>Ivy<o+Io3M%|A<Ps at OHyI{O(TOAogaaZ3D<r48I4hO7|
zRJ?{A4Y){B at hBdKVxSdW1Fi<VxNE at k0C!1hE{%Ufq44sZ2+_F|pVpv^N8{^>2~bJJ
z{l8teAnbl9B<8;`4nRS4UNOYkBIB`t7EW(L=^~oFO{eWMs1%86w&?^^Jso1M&3y$f
zRdP{ln+}ph4#fMC$=YpT?WY263uS8J+3N=kN-Cbca{<qkRLy%Z`p7iL<NAMd)db?r
z(4Rs{K+8TT4_)SO(`o+^s;9zCf)h{1aSar5js_!xoHHqpL1=fp)**K7GKTTGIW11b
zBkk(t8sf_`G at t3|>-%V3S}zwre{zo(n$MqgZ0h7xL~^L`XQ2o(q+w*aG+%0}?c_<1
z`<sYw%Tn?Hr>3SNkk{p6pdJGeXi(}gV0zLqHFYYisR{9J1WPNxE7RkgLC)730W}|9
zgJfms&N~6je8|bcM-08<EJS9;{R3ph;|Tv&JdOtAc*Kz|C-%JyAeL_!mgdhw+H(=~
zNCVQzG4|PvlLPvsB9=#~^gwQ36*@I3G^&^kkjl{gRA>qMtJfmnfGj%(u;!*Cm3#qX
zHZTi;i}6w2pbV7Z;3Hha(k38Ad4|mQAx9?V!O%pSHn}nwcvyl-O-)ZtOC_0q1PZ~H
zGQ0pKo#~p^(~ciWf7WqnNVO0n4B=Kh<2^D}dKF^Sc#)HyNYChguA(doS&(`>;#Gi9
zo+9`klf)xUh2tTOd=V_t!`M_;18Uwlilf8$?s1X1FT~N5n0Vg=3QE9ZC at ujfa)6zb
zC<9e~$99*^bjnmtW;7c-cH~9xacnJobQCMUWgJ5T&rB#u at zZK|6VO;Fcb;|(480hd
zu^O7`8t=ikk|GG at n&2KRJlDgvgy<OeV3$a_1Xi!h8-vkf4K$G<Qf`LfarL|vhBqbk
zUKo_;&NDQ=EG>N(5dFAPU53U_s)hF+Xm)s0XcU%~`W*E4q1 at XItr(tC_X22$v->(j
ztCyknfw4oS3GEvI-!IT!qrZ1tDgS_(;`Syyc}2#*!RcCAFEfLQHwQv at nG-40<X2dl
z$l&K`x?ZZAtEAgS(v1 at V&D=vL^CRen`6G0X*$bJQVh)DxH77yuVa|cx(`<yEYOa8u
zX8r+sx_J|HpZOT{4D$`>ruilGUZxuZV5WHl^el4>bjzFx{Rop|d2jP{=tr6tK+iUB
zhTg|~68cf*2hjVPKS9qik3hHC&m0ZCzc~Z?0Fz^5uF0`)pvg{kka-*Q!RB+&^URN-
z4>4V+!$Zwn=)=t8py!(lpbt0M*N!lEKp$y74t<pQ4)oFHf1wwc=_tQ3W+C)KvkH2V
zc^dSw=Ecy*nRh`SZ at vuuXmc<038s!>I>sCXeWK}yKFMr at eyq6(`egG8=*8v((5IMh
zL!WB?0R1?#uNQMIWYk!gy8e`59tVrdoDbb?wn5j-v*~1B1>G?3gYGe3hMr>n6S~*b
zd!Q&pMn4$3vB+(XgGHFrpu5ak=x#FzT{FYbb#o(hLu6b*pzX>sZ-Ygce}nEaUxV&8
zKZ35AUqjc;U!lXdiH=9t9?UZHU=ikI=q|Ggy4!4ou9+*L>*f~dhPeZ}$GjJMipY4D
z4#o#=^B=IRGrxf@%pak<%wM6qO*gt7&CGzVn>o-8b1-y|IRbi$SqR;09t*vPc^vef
zW(D+AvkH2ec?$G&^EBu_^K|GL=6dL+$hZuKZcNq8zrZ5QhoHO6m!P}N&!B7O572cp
z3mqj=Hw=buG->7}ScF*(-6b-XNw!5Zw at CIzvgX6k-R7In(RjXwp&QFJ(}j@>-#S7^
zxWO=V?Yb<pNU|kl%?9Xhvl+T(o(^3%FMw{CH$(TBk3mlny<Vq-YlQg)Ok@&tm)XO|
zfJZ^s%u&$cZ3+zC)7z|p=`xRp?iQII)YuRmhWavLZG%;N)s+%~Y3P|4Z^Q~%Q`V=P
zMMKYI*Rc&&@6VZi;P^+f8+1;YvUb2;*fZd=?t$e2Fg=4V^o7<*7{Z=JMen%?FxzT&
zU?X6T)#|_|z+5Zlzz|@bb*2NG0rRat0KQ03ivdT8%%|~|hw(Pg5aU at G*`6HFo6-c;
zpZ)M>K!Xv$Gr&Dq_xu8M06{!??!n$8Oi!-oH!uZsA4K2dApU%!!9eJ7nArE>!~1pS
z=jadq39IL*%t`Q}!Do-*h8Kp}V}Qp8b2aE55G*_cff%&MP`-4SgNC^Wdpx6o*uVG4
zM-)Vg1(>3HgY>-y8os6XT><A~!E4`}S;xWjYTubwIV{XX?Y|~oVbuY$=(GcXy72Mk
zbLiJ_dEcRUDa<7 at DS0a$e$x42bJiuWPwcrosgPD8E0YRo6=1ft6W(N*tp?0Vl-cQk
zxrs7c1DI#s2hR)9C-qzlm~TDlggparyzo+v9Uo2TjGRtJUyTr1&%p2ao=cOWvkZZf
zqSFSLRA<@&lj=+dU~c05rvc_ADoGfyQ1t!~?{M{SxkjPabGeTE+J;3yM}BMDS at X01
zOM9AY0{HA-Y<n5(eX{x62(D}wM@~eWW3avtnjFoKlKDK!C3FtQz1{RG+|H}gZOB)N
zz8L`SYg~Mn%awDKL{Gt`-}P{H at 33-Uy(m9!y^PlD8w$Ygr1gfMQ3Lz*`z!6YHj{o(
zS~(#>jGpnLGkYD{KnONobY+c!d9(4T%VHCFjNS2L$PQu61~1{`fNrY>@D;i~0jOKU
zdkOI!0vJyMdaagWLVQ8^6kwVa1C*{$1De*Ej_cn5E$e*1`J>@^7htya6(AF3>;}xS
zegu4(uFnAGSw|uAQu4Ea`POj259#_G;3#Vbpc`p4o(C+nLV)RndjQ8<=i=M{p at c60
zP86BXA^ua54t-=wISj+?dk at UXwBGL0KZZT472tm3!lc}|2x0Bq$VP26wgI}W)8UQH
z%D5O%x6T7RA3eTt382 at y43LtIO99iY9S*z<(6sIZ+(yrT1hlMWLxfm167X`s>_o<1
z0hnWLgsaTSD*<yYvkzt at _(>S!D!@GJGPugjxf(Fvx(Sd?#<&J>lyw*2Rj8oGwSa}z
z!+?7*BpTNPj_;puY<F36kwXVrZr6bm)|2qEfpOVED6IR3s<+<&e3JD7;Jc&X{3pOu
zEE6SF!m_v#FlzMylu^COr47E=WgX~^CfgUzHv|9CWsQV;?*YJn2ENK=O#qfz`WN7x
zE=$i<_!i*XTviF(D=B^_ at EtD8k95n#-U at s-S`urq{zv3w*2Bos4lD!`b=c+ZQfh8M
zxAg?PH88arU{W2{0ln53RO$UJmmYv={dL1|TT{Tvvhsiv)(k*d>?sn~0LmD7359hs
zu*}V#z^1hoa3b?R6)@X+1CTwekp`G+{Rnt7VLISIt5>EFcN6*m2U!Chm;pH0Dgu<A
zO~5>BBH-in+zW7sRShT$IumfHwGeO*U9$j(S#5xC5?X-y)+WHcghv35vVH{o81oDx
z2e7ce*XZrGTv%@%Aa at ivF~Dma>9(@Ltw8=6+2pKa0A<qq0P4c30KSsWed#Q$i-0E}
zg+ at Q%iPr6o_x^yz)`Nia)8RTEa9aODV}M&mWGT5KN*IuD<hrfL;BOtdq2&6T#z43A
zB)A4j9z-tp8afY_K}?vIg&Mt$&UxezlR+T1lNbiVv?c at IOPCL6<-W(@!(q)HkOni+
zAVx5_bs~IY|3?@FfL_#zk#1`txF;!Ll=KqLQ`LSnAzru^#OdtM3PI!vYb)@<;lN|1
z{{Y&U%(-#4fBgi=&)S2$%Q0fQ^@>wRm+Oo`ycb>ps9S%BtL&6l0(z_u0N-WwRsnjg
ze*;R<s{zw24<aey>42u?1C;G^4WMQ9ci>vUY at vSyIRn3d1efnySowow+H<Z!nVd0X
z19-pnrJ~v_BR^ZqT1iTqsaa>k!ugQq*BIgR95 at S57dpfE%Aj2i2YpXU)}I+r|67X1
zNfxJk`m-qr*k9LorC1Nbk>i)Xo1FCoAXA_}Lny3gfjOJhp9jWlhL!#kaK>vcAIH^i
zVb`X*eR5`limmOj`5f9`aQWCON?|u%b;${jA9n9ozE41}fECfx8P!Y<_ZQJ$mHq>)
z#uc!eMx|#5Ob*Y+97ZRTWAmTsZI<zn^ieA3k+SWT!H4HXuo9JHb?;$WN>qW)$n&P-
zHp4ww^Lz*-dzP6<m}ftb>`445R^i)#fWuJj^%qn0O|TDk-I>R1$z!w5W0?xyP2d~g
zNBg at uq!Ff9d)$;+{1_axXE_-h;MJZ;njr4#IzikmCy2RU(fjkt`}0ZOU+(Jt73qCw
z7_S=4Tz|v#GEaQ$MNelu_PJ8dhG}?x(?M;g^<9_F9+c7N at R-M*Rb-w5>NPsI8ehOL
zjU}F6V9NBjFc;I%;AF);6}chvO?HJ#QOAXs`Cv~Pb&+`sL=A^;<752}SO<=U-R0x#
zY&LAD0s3yxSrLFd<2g-E5M+rwFYE5b;3eDx=#oRRgf9TPtsRc*i-4N-7r?$KC!+ at K
zM at QfEl4jilZVb7<!wa?!jF&a*VQ_C?-^qA|oE3&uCgxQ at -C7MO2f^0>z1C(2z7E*a
zy2SDP24I at 7t^vM)^4|fb{5Lg=>li8UEppcNPLO{9>avx~e)(-cudr@{^DC6_p_1@!
zl7#oVN_fAkgb!>9w?aY|i|bP<!E1b!B;jKz;XZh2WDocWB?#*iU=9$*zhw~9_$(>N
z=Usz*!64Q?glMOPy?|a>k2g}lH-H?PztnOsBmO4?4{*b at emhDHk^9J5KFmC1HQ5j7
z64p_`GMm1V&cgst;AG@$LUb*YLHv^<|4Ra6-hYzf_^k{x174aL<~u+ns~xx>O4s;V
z1~H8Tnzas`e9iYV$VCqPfkCVr9QY%k*SZT(cF;coqIjPIZll1142(GZqFJwi3-hJF
zl1r5KZ-9uyPjJ4DK{V7t1`!xSoFFc8iFuft6;)Us<m>AUlA?m>dSYH_$RP2_zQ+!d
zi6ALQAV{hT;!O(Dqic|!c8~!Gax8=RWDwm*)2%#kXD}`4<b+iWypVo+DL)yyoWX6T
zAJg{J3_t7XCtLb4jZEE&fxCo$vdGCXQnn!rP`5U~Rl*|xJys{+we;K@&}*giQ+a+Q
zAo9E)@W+(j7g!9?jXt_n2ySF9xTDBn*ul)xgW0UnU-`+=txv(t9|W$S?dN;=A3;BP
z(vN8j(5;k#sxst~vnHTY%i<mgs9Twi>mWdHqGSgHB4T~ud^!aVW8eWUV~B3u<kaz@
z<b*X4ey*jT5z>!t<YQI~&V`A(G2Heu9r!8wDUg1=#z at _&1(!}gqsUodz&?bd0Z~KF
z1m^7B7^i}a(XETX$@WwzgK#oFgh7e`?bXs)!m+l5`{8 at yk-!tA1l<^~TTg(S%^W+L
zoUrx)pF}^Cl%HdC$xWr4iMF4<@P8)#94Gyl#<99J5S(mclgY^nb1s7v1M1c^xL!m!
z1<-3P1>8kA6%e_44)7}!Sjxa?FVl4ELU6CrPYF5eZA4DO>43<M?}2p`o#B^3OruP<
zeg?;hh*2(screA2C0oHDRtBJq;S4};qTFW!A`VBvxq$+!85q6zEF{X2Fq at n;(t(wL
zx^=Vz=Ky-G;~ZE8h<SQqaXuG>mFPWd0kbVXyuZl_XdPgVbqgAVjBGt%uJC<?sO({X
zaF1L69QLe_08HZ!w{-xPQCM*rcgmUTt!O4!65a)fN(8^pp+Xve1 at u~{0Lnz)4VWf;
z6XDa15Zdv*^eM1s4FE{f>U+tW&Sk3B(2Hp;2EPFww0VHK)e3k4;e0@^buA$4owfk5
z2lioILR5p({JnhS&!oMom+vM7c>s3fHn+Z$uiFg}H7<8sZ@|LMI^znNijM$gMZQu-
z`&$QI1=z!Kq1sE=s{wmjy&QNAU}|D<el1{{H3Y6Q2et#6)=URp2WVNRIB*AGwzVAa
z at 64|20do?)@(qBatp2EzvQYj6SZECeTuIM=1{~jilyRfmDgrkRUAu7;IAJ{v_%z|o
zgu?m?SjPMo;8U#M0OhXAPQWIs6s05Kt$?k<$NVowjI=X-zK`*uEwCGxxwCGBX&M)~
zt;b=>r}%9YA1@^1VnE$`+i|@F&})4GC}V#qAj+QhJ>ay#K56fP$Y^;!UnK;V!)|PK
zXPpRhl<^0*6^2DtoGtQAoMuUQzI at YJaNWRoT);O8?^f8IO+w#Q0G;rl{c2`i3o}jo
z$+Yf<h2^dNEN83_0Lt3-3m_)bFCz?l0L|Mg>jRjUruUL at ke;xjMrs)c2|cn(G7c$d
zHChU*WO5v^ams<N2Xa?0H?m=P^^*A3vOXQcJo#Wb9_gi=_Hz)ZMG(CV`6zq~VVwd>
zOL6PpU>@Qdi~79>gnqW}<0|q1?8YXyekSZ$8Y*^&u{3F)qgCcve3iHiFln!@4KQh>
zZU^*Q^$;Qps{=62TIj&j08Og}@I`d)Mi|htK6P9pfZ5h}fLxy$QNSEapytS>ZVWKj
z$^?{Ea5-R}mFvJ2fJ3YT2d)GhYE5$BD!^e at xdT@N=3BK6JRNYjb+QB30FJO)9Jm&6
zWTIJ~0XWK94p&*%*8vt<>j32x_)Nfw)`ftwew_t4&AQxy>jBHGYXD{DYyg}o2VA*l
zbv9t7^;ft`cn;u6)&qb8Ikh+!5RGai^36gH8EG!P5caG-01FIv(r%*0jkUz8UI%o`
z_{$lK0f;#}LP_WW^vKR#?k1)HdaXjZO6UblvnB(|<n#bE<;J9hJpnCiCS0FjX{G{Z
z3oomf-FndRzYT{o;K4Z2t$)DiUIvh6%y(ONz#?;D0TPC7K?fcWi20=hPXP3aOfHdk
zA}fq4-)Q8<^R%Ag*2lu0#lFRBoQ&-qSft2>QY4ot5(X$z$SntM7HWRC?-4iV=CJE8
z7_y)GjQpYueFFpz%tt$L`F at 3$xv&{6Zv6_-8qa2Yx4?D@*#@_M2j9LOz%;7ei78@@
ze0zL~I2X{J7!hk38SAeU!RcQepx1f_Z~$RFAUd~Ru<xQ5zgzDOyR#a%UB019rQ3H5
zT&7?iX}saqi(${I1(;^smlT)#Ax|Wxs}BIWhb at LTS%43^br%n#hIKg1Ltt=Nr4L)>
zFb{+2M`okLJOU<%%%u+VD44!vwmZyYV2&bli^Dt)rVp9B9p(uz*<_w{m?yy;N#;d|
zc?wK#G9Nn3(_oGuv(I7v2F4<Dz+rZQ$s*%Im6Ivm4JMOJn!`K;hCT1Feh%|2816U>
z%XgUPz+{k_>@d%R at sZ)=R7&3C)_nquRqHS>$Ra(#fiJR1twzAHgHTp40h-o&Ksix;
z8E}-f9q>51z5-Zi-Qt9O6>z+Dj{{!=oM=7fz}Eqbg_i;C2A6{VLBpyR9<&#-e8<DS
zh4!bie2wt*8|+50rZ0g#s~;-wOk=!e6~iJ^a<p9iapCh0qcVZ3KdatxJqFNgEp*^S
zz%+ZmoSr8EqGNYlj|I%JRuj^7G9WsGZHP}fIO9KVFW=~lv0m3;2e^bU9bg at Ojn%TY
z!pt{DYl#|M08tn`!OQMz3?Ld8piDv`pl;m>SO+Oa5g^9WQ<BBE0z3i_#z-yeb(p!v
zPi|{JEOHy>XJn~8-<R+gK$rEc<N7P0TOJ}v*WUoOM9+E<P`6Ui5M|T^Uha|G3hy&6
zBN&(d*@jD#{nUTRrGOIyvJH3AK7dBf%7he|A{|h-asdB}O<e=W3MhqQ2YLWa^!31{
zn1LJV3=DzZB!NB1B?R^aOcIz1m?SU_5CUr<@L~$=#lTp?_%!Pza5736<g8O2XaZsh
zvl4hWgB+oPWNOwL$4{0F(&<3U4sr$XPYlvm2FW&hCq?^686=($*$k4%hdzKw(LM?g
z(cS at pvzbl(85q0mIhu6`xGz`<`;il}LbuaTp7eu7bka+6$yxU}@f--KTTeQ05TIAq
zd6^G`0kPD23C at pG;BW at UONVII+fI<7<g8B|I1Es?{^h`YKx`ZeALkBoH{d(BuZNDS
z3s|=r<(lsp*n_k$*5ojCI_%nUZZBs*PV4c_fv3yqsZI0E8Y;xwv`00)8uqMz0;Cxo
zn)MSbGTNufC>h8S3Bxi<rUN4~O1^f;9K&2&rTMOboC?~{(1z5))Q!_MD*%h^z}84{
z?A~Mtww6%%&O!K<@S^=C%lAIQ- at xz>Y5FIO)4c$N#{F8N-98|Nu)j#fiJb8uAlhv<
z>~<>AE#v__Ln-%aS)anpH}2BpE{*K0{wf8;JFB|^b&K7~iIjJbl;>Lv`w`%bJG86<
zn7PI+Nj=L>DI(sp+zOb~v)m>n&P1qNDe-nG(fc6m at fhv`IFaK2tYxi+nQfe@$*lv~
zS)3)s$GejCfcEyU>?}3_x at BjPnhyy#Q#|&2&(<t9k^$s4Q2<u*=YWHB*&UoqF0rk%
zk->!QUuqfT4=Tv!q#);Y4bo``VS_)1K`xX*(u^&dwH<GfRpfjb<VFWx0H|BHI&iBk
zfql?!O1MNyzydGnrQ4*0_%`yzb`W+MKQYJ^GDw<nsb<~lh`me(;gn9s;g5iNq9I*w
zOV|Mk#oTtdT1mJvsli`G&TjCh(9aI#=Nda=QtY+l5*fH1P*1e*>j06Tk3!52O1Mc$
zxE_0^PCRdr5<Wphq`*H(3Go(wqm+OK at d?78m<Jh;X!>5*^SQ)HKBSPREy9;NLiN1A
zxw0;Y|3c&Iq^bQkm|`bQ?f(tvwyuRY`R at M!>hdu13rI1(1 at v0C!&RPhd<U3jJq-9C
zy8ai?vi1YkjRZUZm~Ew_9~(jVJz$R27f{Zie*nz2hCA>_z&vY`1AhX{xBP(eg!pH`
zQPzAwc at +H%;Ao3SQF7h(D`0`p_ahDiZ^YYOzTaSd4mRU6m#*REob2Yp%o{?js*8rh
zKKRxdN8bc!?=aklE`2iW&Lr7Bw_?17PTd!P<InWC-=#Mxk9>j1TnRmbh#DX2YhfL@
z7Iv5K0$6vE9qP*Z2h4n<zsvd;Eb>fv01_aqUjW^s;3pT*w2nf*CUa^apk?I)$|4yA
zm at SuA(seLkj=Y^AVIE+vH3gp2DQXB{p3qZZAJ`M5D>EBbcH>4s??)dEu;&^L@(56#
z(au9$JST#ceaw7R2hSo0EpX$|ZyAs*{^L<MJgb3jpr8{_7d%%3$#|TIBzWSbdlFLM
zi5Kq4NPvf%!h0BQA>uDGZ- at 0f1jbhB-LNv_8Pi0@+m$)<O^~<3U&?x&xA!u?0R9KV
z#f&dtSVnsyB^^vje3RicrsM$p$he0YcgA7DXatTh?p#yL`V{5JFYo^u?3hPqGNUY7
z1NvNeA2=U&m#-1lYsfzA(wD%Vbq9cD+~-PMthpcAkA*1s+xVIX0QJNW^&p_v`hcOh
z{CWs5O=La*pL-~_M1K at kr&aT!jy!)9neTw^iB3*0*SU?8xes_eJH09TH{C<<PLjyv
zS!M%$9G970fRh<or|JD*Wkyr9 at Qwqr2Obp1RDiSSYpPxfs}qUD`KNvYXdf>hT|;lT
zxwOZ0oMJ+dxYv!`X?Oy(`)=2rvQu)6a9`+^cf#&|%8UNMePLQ5{JQUcYb<6d at F~7=
zVP8#?*T3#<hG_fx*S&BSqx}ei_9LEwANRcl<Q9M$^L|Q#$F;PA8aVt5TtOBrKf+Sz
zjusm5S#$x2Ua&BzDEb9je;_`iL$L53_g at fe_k(ydnlFR!Zul9rjDck{E!D7GOiLpy
z*TORLT!dk`apD$0JmYgU_<?dYypRulw|yUusV_%*UAvh{M?Z$}e!^#tL71br19HT1
zJ<BV6N1p|VKUJXM1nt7_R>- at 1&%cM*AM+|)=hF2B-n2XBGr$JIJ^SD~QB2}3RrgRA
zuHe0m2)Kt%Dnwp>Ol$ruS~)nnM{t+0p9|sK!%HBhpHAyYUZCjbrF9fN2z at F-_;^+6
zeS|WOcI(w7co at BxM1www_buI%;;);Oc->_AIw|eA#OsPb=bPp0rpnjxHl=%-^kDMM
zC6C5qIYmaoyA%a!*GpYYdWPN?#^1Lv at xD_M$y=0oUoeKy_WK&;`{YYPgNvM$Hg$iA
zCXU^X0+b(lH5|bxtyPtnr6{j0u5CayVI7uPyq0k|rU=zQX7f76V<bOo(^1x{N}rXe
z(r3v!IC}pWv^{v>1%3DCf*(+h2S627Lyij)iulD}8Z9wcj-+K1EQ4sd5|+`hh{-2H
z&xOUkr63h#h_1K6(m~4;u$)fIhp?PW%Wtq;NJ|c)cNHxau-pWTnEX8Si4=8VL4SCA
zgRZy1^+Q_tmES&EUWerXE&qYVg<LG+U)D*ZWgaX?!Xidqgevtg)F>g_^CgMIUm_DP
z#!o{n;5A`a!vN&4>sI?l>CyZwPgea~*%DCo?>IwN{oB*VA&bv~tE}sH*mWIiH*{Mu
zywSd<DsYwJ0A6qcM5g6tx)5d&tf`AKd6go<qTG}8jmk4Z+=;NKAm<lDt%h>G`UEW>
z77oACbH4g>cyeb#@mn;y#h;mVB{Lz1cdw*MQ!eCO!uE;G75LjN2a$o&gbe9|iYhVP
z`1Al~$4nW|t=^QHoB7c(lWY3VZ`tzC!JWs>FAe?S&iwaZYAM{jAmj4qcdvT#lY^ff
zH}H{lv(BHow*Rk>ZtBrK;+6wQqj(EyFVqiEUPL4tDj#Yh6eGI;Y6;Xzs7+9RgxUqa
zFvKNLeAufHU(E8wV_yWuA{7mRk1R!)7un at 2*i7kvh{Ccn1YU|N&gVHOx<5pKhwY5G
zP|0U}iT6P9;b20%RJ~8$c?Nz<VRl1we_Ms;Z71S>>V5aZPP_q%k5f+M_;fEP=Kuc}
zKMNp(l?ewh@?qJsyfu7Bq03UV-;eqP2D29^mTx)~qAoI_7#4?50;e`Spb&kbuzHn$
zN|5mx3Olkvj)WZ4nRF(PSv&!XV+kAZWGMQd0&^PFbf_6nGofZd(Tz_P>~o=Nq3WRO
zq2@!K47Cs{07ZYNz+42?1Qmj6fm#MdH$LsKcR;Zru7Fw%wFZiAYhkW~Itz+<e-6|}
zs7@%l{{iM!sBKWJYnMS?2}QT7VP323*TK9V>ISHrpl*ix3)HPpw?pOjA3FDe^vP9!
z-ckJUX~Uk_KkK$Zmu{H<p>OHV18cq;JnE-W`<MSV`fqoh^ry+QuNX3{@1u{bIr`_%
zdum&Kn>Ky7yKeIG-MO>=lJVrY`}dZ;Hqm_L==WWpY+Mr at aQ>RR0*l5!|HG_4eZ5zd
zH|AclCVI}VXI$O-lRMOLdEfUw+x1jKTK=mQO&|Jt2Oi1s+<$)Fym!-X{q51GckLeW
zX8Ms&{oHHd%8S-as=EEc)u#?HMvNHcJE3y6uQa94&|B`kb<}t7ynnLs<;U-Se#t#~
z&7GSsdH?w<_GS#I%R6#V&5{cmrtI3NJ at xI&g)jDB^?KutnG-+q)oQC|FFN+upI&?N
z#mOTtJht*r&%T*HrTM%y4Q6Z`+k8dcx|6=R`HaCEUmm&q+8!$&eC+ct-~Qs}9edet
zxQf2W9o{y+r8e-<t<%$Pe)NhdSH1D}-5-5Ze$j7fqgTK0d*kM{Cp`M6 at mcGvTV7ny
zcbM<G(NhQfBQk3EY1;OgnU77``C#PxJHt<;-}m-G{jIys|LUzB;==bD&-`k}FOg%f
zy{Gr4HTQk at a{9G5E<EnTpQrWPe$(?meiVK2x$|bcmvPan|IDp@%y<5v=z+hzwtY|f
z^DWbJZwX#-R_f1pzm~S6q*$-sxaQ5J!4vYYj-~&xI{!~*+VZ<^_J8<PNAbF^Uzu$j
zH$0fNddFRVxoYeOA3ro})~MI($_lc+y<*Fk`l{P*saW(;TJM65pYA?!<C^)dQ4hW~
zwPj6V)>U6m+O>YoomXCZ_j8TntYdFT|10~-hs?)HKS|lJM!Tu?%kMru_L=5_m&Tnx
z?Xi|K`b65k+WXLr- at m@c44nQ!#RVPvmKL75Db;&p-S~lL&ARErtKYq~cH;YEW<A+4
zagpzX8^+$e=B909Hm$kkdhPYKe-Bn)y*=gXdG{7iIPiJ%hMMm-rvA`2<}Y`S?Yz+a
z-_2wG<5{wB#A)jvj`aBCk!WCU_Wo-xTJy#?Cz$<iyQ}eqZN+!pcG@{>ZhWoi=WAEL
zJnHKu7p*bTDGY|10L9PbPJ(KOS`T#z)Xh*2LA?m|5!823DPHsyP@|!yLDfMuL#=}P
z0~BYecR~FP>Mf{!P`^R-Lg$kQbqv%jsFR^Opf*5V3iW5GhoN4A;vE0KP~M*Clb{Nq
zN}%eY7DKIu;umh)q5cZB3yNR0?T0!Dm5D)Y2-HNV*-#6i_-)$RQ2Zc`-=aMN^)l2a
zPzRuTphM1q8Ur;QssU;V)ag*?LtO`TH`H#Zx1s(8#m+Pf3LgxMNl=wg0jMz4IZ%Iu
zx&`V{s8^sqh58<<rw`)<R3TI;)I6vbs5MX*KymEjCtuG%y#w_Xlnb3Uzir~jPyCjN
z-zJ>`6 at fYz>T;-^P>(^q3iTNj&l^)QF7<~hf+~ZW4|OWkTBxm1*F)V4^(@r8P+vp2
zdtrQp%7>Z^RRtA<ib8FKx&rD}sK=pRgZdnbxAgfJBL_f at g(`<y0JRkA45$mCZh*QE
z>N%+QpuU09vM>fg4Tma*s)kww6@%IYbtTkoP)|U;4#k_VKS8Bq at XCeaEeVdPyzs%X
z3=fY|Ny&3n$q3%1CdEt32+W7y_>toJh=U{^9>|j7QMHoA-78Yuuu%ayts}+Rp7O=J
z&7?R9P!w0 at q~tOkCLZq5km5%y%2y8+kedLC;-)KoaU)i}kzWdu;`RgL!)FZMM2eqw
zC|~^Ckra2WRf2f6gcR?mDDm71BE{_?6_DRolHwM;3dk!+q~v`hn0R>cg%q#mC|TUd
zC)EcN1x0OBQ5}h>I&Xvz`r;Zm4+;<W5J~Z}mGZ at _N~CzfNl`ZglHxG00`fSSl#v_v
z#k<_3c>16M@>(@1-nUj1Pn$^%NCf1WHz|1l4igV|rbu!3MP&|eN0E|OrRc}rG$O at 4
zC?%fvV at UDNj0*U$$_akAseB1l3%OmTD4rxTAou?j#V;I4$<G~N;^Fl$QoLiPe63J5
zhd0|5#g7l at i+gs8dJT}&H&BY=P7Eo2{-r41IwHk;1&ZRw0;IV4sVH8oC&iCj6vcxA
zQanLW6t5MK;!RRT at zZuvys@Lh#KYTDq}WtdesK*&iYqM at kh^ZAxM`=Tfhu$Ob)KRw
zAE?A9Y9SY449K;a^2P5yN%31y^+tX*Op3=uDqg&wM2hP?6_6h+km6pF3doyOq<F<j
z`Qp_iQoOOGC|+<O#m~?b#oPO&xCN^yXB{EGC501RRSEHXJ>_d;t{sr)C5qx5KFZ=n
zLq+jA6sg8UBzOi*%7v0rzIcj7idQ!k<t(-;P*+tNd9qGl@|Yba9-hLHl1Flq!JS*1
z;+Ce8#mjQ^#ruAW`ZpjcUP)9L9UN#=yj-h%aYUmpZjUI+t0;aTtm4HF;OUFk0+cMC
zuan}LyYj_5bEJ5WPEq`Xg%tOgm3Ur5BgHLE<%?gSlj51B63=g1NO3e(zPR;CiXT`i
zS-f#ZN?t#MiKkx=o8lcDC5xw;^u?>YDj+|@AhkVFCwRSxl)P&M6AyQqNpbU8MS>r%
zkm3g|NG>0KY)*<F$SCnFEK=N?R}{ZLC&hcYisFwDkmAJ)71c`sNd=+upz!df0V&=-
zP?6xrN~9(xa+Mb}Nb%CQ63?w;QrsF=6u%lGwKoxvpPrE7S7*u>cX~;2>sL|yww at Gs
zc@@R0f28;!gra!JN{XkiisDrOQvAeBQM?mNiq~ir#jl=7 at vA{aaci6uH`Eoy4|YiL
zBOaAGyctZ2pRg!joNJQeVL1Nt;n6cG9!IM}<3~26<QF&eV_)qc#XBEL7VnLb;;lMG
z at k4r2JbP6XPrFI+p0}cS`->F66;KpUFG%qdRYmcGFj74GQWP)Ukm3QkqIe=fiXXEo
zig%z%$qUgi@$gC-DSiT?d~su+6nFd;#gT;+KS5Iz#~)Js-b7KntV)U(SXGtdFC>tf
zkf^@S=8yaW9!_}pu`+$Vf|{*l@#8j9{CZSTJV+<S19nAmf=TKW<cNAB&-F<0$Wi&?
zksT?X;VFv020 at BHY@kY;_u5FY`&Pbqqm~qJBr9sH*QR)#PX*+y1N!2PeB~>m#B&oK
zFXzMKJ^JF8$jTRQO_Aa?21W521}RrU7S9n$@z7NH;`TZz?zbz7*9l4Ss~Sb|1_dd8
zIG`vlMo68XC`aCGAjR7bDhv5z5~TS15{lwIKT^fHaf-iDLW*~+R8H`k1*uQ)Mir1p
z1EhFXpd!JK)k*O<QBnNvk`%wIQ~`Nif)uY%D2iWclHv)S3fQV-$<N&3gol?u>5KP$
zm9N!+q>7=GEM8(IC2zFC#KW)WN%4bvRcJiFBgGH<l`O97Nbw6&<%>UuL8>5;tK0D!
zQv6z21?2B%km3(=D2iWrlail%!;C*XBMS+QZt}@R9!FtI7w$N>9o(he{7r-G68JNO
zEA9_%UOukXwZgT=>oU^}og2C6YNT4Z_TWLjPn7t)XS=7T>y_sk8}$tu-I-x4&pddL
z?~c3AJQuEZ*pooN1$V|H?(Vn4qidBLeG4`mJjgi3-DjMu%|(TA%k;TiKl{=VTNz)(
z%GJ`=*cxjJ$-l9E=pW?94_ZoR#~jntv{a0VMZ#m8a4q8|PUy-+ at OQlBpCgN4my&-q
zu3!msoqzNNf7%-{$In-`ML{A_u;RC0+gcTBS_TW^+QvT#j6bqy)BHivXrw6~BJQvl
ze>p7<oWEHHZ+M#>0oc)|oZrd>LU{?@jUR1b25EP at T!zup8}mf9=gw%>?sXOGE~BSM
zdrK4>Jv;@*QJyg{n>~dd?=0=>wFO3*N4vo7-DwQ>6l?!p>&-MWJ=!*RficXpz{o5%
z(%|1*ZWta0*LoL#n1!9GXN+`@cBy--ku}KZH3d$^+81kg8ht(5)$W}}5AO)0??R)`
zb|d?9W8f6LbgPlQ-WceKNwG&2ABu9}b`)L$Z%6DjOpn%HZ1i0fTkg?5Ub}$!Qg<<9
zq5X4hfwcGWXjzDDZ=?yX%W`ED(_|D88_#0HEL?&}&eC35Tg(jjE5fJ6bT at 7zu3xtv
z-<;=Lu(oaWZt!UTIK#W%usqtIU9*sU_qa@>M*%FzDeo9h0rDzZ0P$LeJI{sO6q?Vy
z+-3CW>0N5{^2{=N6l-^$A!G5ntJs+0 at gl2=jSSC7qt~%AXYM?MQP=+ND!$N2d(NZX
zbjE{-hwx~>3GV_Ux2JcuVN5l~T;kDwvVETADlo>lryhw=1xBt%+p*63pfO>pVNNrq
zBMWMqSx94wk?>}`V6=zKNgi!{vC$t{n1j-s=s5w|U0 at 6-M)-|}Sq6Wzv`5x8BgWb@
zqS;7=$9zwvF%D+YPGd%~Q64o;EHI9b8f^u}z+$5pQc<AYix4Q(m&7cOcIUccW2i at a
zS<Ety^hAx3p4l*WYPYW|fL(i4(u_f&N87osSbH5rj(bF=G1fEH82q`>CkF4c5S`Oy
zQc8>&NXq31jI``U?TjaeT$V at s3fwTnZpcn!a<MTfYV<;43$%;Y6?n8uTw7TtxgPh3
zEW=p&rg5Zp!h;^Ib6wP<9l(2oQxT7-{rY%TEHLssT5y3Z!PkTrMcQ-9f2SB}-m{U<
zTireE4lj!Kgw8m9DNOXh=?gsKhTGW2uqRjz^9U&P$m!3a6=EPyzXv87r|~C4-0-OK
zcPF}mD}ldA!kxf8kfa>CXCoZ??(~J|8!%Bx{}mkN{7dU9=M&&(lEOU*oGgd^D29df
z)i4>~8kp($kKcET`zr)@Bl-u*M?ZVRK_!p<I(|3qhMp;QyolEUJMxLc2!~-h{Y01;
z)zb4|V$qat!JqtjJo`Ia!P8;#KfA;Y{2e_!{Qg$_2bklGgZCp6jK{m+FHDLDt{vQP
zbrOCWo>&g}y}TRbkM}8g#oh3bZrIlihw);*Zy`2tZc3701AKQ9E`>kL-_tSg?vnn?
z#>(*eHf7?Ewo#sbnli60vhn50T&c{cGLKefkup2R*#29UxloxWD08SX2PyNT0^9$4
z%6wLte^ch4lzE*pJCxa~%zq$VsABpv%Di5gTVbNe^uaKh9!&bA$?=*PlP+np42fY#
zGZTRLegx*g_C0tX?5s2R87G1K7o0=*$RiZX&Z~INL7pNH%sLTMepp{lQFhiTI1Ap6
z;d3;UvI;*ej{Tz~{`e%mcaoh4e2)J?N%lLE>@OzSXC~RtOR`T*l8HZGBY)`I{)PB}
z^ZVEKpARiqf}gez1mbJ}znYCdR)pWNcmC47{KG5w(~}~A!Cn5vR{V(?`)`rje^)UO
zY-$SFzwTYYKX at 77UnET?@#khjHt9&fUnjBuDr1*dFTr2%z>n!C#|EOBV)(P54A|1%
z7{zad)7tfqs4}kM5dH{4-Ku4a+FM)ji}d*8n+Y+EOBhHb(#YQu57b6m`P1k46FiNW
s<<v#-W8h$&+zB|p4jxz at X;VKG9)FMearS^eGCkO2hpdT)=Oh3BAINrxp8x;=

literal 0
HcmV?d00001

diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c
index c40dba7a01a..885915e5b1d 100644
--- a/dlls/nsiproxy.sys/ndis.c
+++ b/dlls/nsiproxy.sys/ndis.c
@@ -634,6 +634,27 @@ BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid )
     return ret;
 }
 
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name )
+{
+    struct if_entry *entry;
+    BOOL ret = FALSE;;
+
+    EnterCriticalSection( &if_list_cs );
+
+    update_if_table();
+
+    LIST_FOR_EACH_ENTRY( entry, &if_list, struct if_entry, entry )
+        if (entry->if_luid.Value == luid->Value)
+        {
+            *unix_name = entry->if_unix_name;
+            ret = TRUE;
+
+        }
+    LeaveCriticalSection( &if_list_cs );
+
+    return ret;
+}
+
 static const struct module_table tables[] =
 {
     {
diff --git a/dlls/nsiproxy.sys/nsiproxy_private.h b/dlls/nsiproxy.sys/nsiproxy_private.h
index 1c62a3df038..0f6e7b05c59 100644
--- a/dlls/nsiproxy.sys/nsiproxy_private.h
+++ b/dlls/nsiproxy.sys/nsiproxy_private.h
@@ -22,6 +22,7 @@ NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HI
 NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params ) DECLSPEC_HIDDEN;
 NTSTATUS nsi_get_parameter_ex( struct nsi_get_parameter_ex *params ) DECLSPEC_HIDDEN;
 
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name ) DECLSPEC_HIDDEN;
 BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) DECLSPEC_HIDDEN;
 
 struct module_table
-- 
2.23.0




More information about the wine-devel mailing list