From 04529dd7f7be3f875167fd7a69a4e2a43da5aee3 Mon Sep 17 00:00:00 2001 From: "th.l" <thl-cmk@outlook.com> Date: Thu, 21 Dec 2023 20:00:51 +0100 Subject: [PATCH] update project --- README.md | 1 + agent_based/ospfv3_area.py | 40 ++++++++++---------- agent_based/ospfv3_general.py | 32 ++++++++-------- agent_based/ospfv3_interface.py | 54 +++++++++++++-------------- agent_based/ospfv3_neighbor.py | 54 +++++++++++++-------------- agent_based/ospfv3_virtuallink.py | 59 +++++++++++++++--------------- mkp/ospfv3-0.4.0-20231221.mkp | Bin 0 -> 13220 bytes packages/ospfv3 | 6 +-- 8 files changed, 123 insertions(+), 123 deletions(-) create mode 100644 mkp/ospfv3-0.4.0-20231221.mkp diff --git a/README.md b/README.md index ab18330..d9336c2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[PACKAGE]: ../../raw/master/mkp/ospfv3-0.4.0-20231221.mkp "ospfv3-0.4.0-20231221.mkp" # OSPFv3 Monitors status of OSPFv3 enabled devices diff --git a/agent_based/ospfv3_area.py b/agent_based/ospfv3_area.py index 2117ba0..5a42acd 100644 --- a/agent_based/ospfv3_area.py +++ b/agent_based/ospfv3_area.py @@ -102,26 +102,26 @@ class OspfV3Area: def parse_ospfv3_area(string_table: StringTable) -> Dict[str, OspfV3Area]: areas = {} for area in string_table: - AreaId, AreaImportAsExtern, AreaSpfRuns, AreaBdrRtrCount, AreaAsBdrRtrCount, AreaScopeLsaCount, \ - AreaScopeLsaCksumSum, AreaSummary, AreaStubMetric, AreaNssaTranslatorRole, AreaNssaTranslatorState, \ - AreaNssaTranslatorStabInterval, AreaNssaTranslatorEvents, AreaStubMetricType, AreaTEEnabled, = area - - areas[AreaId] = OspfV3Area( - AreaImportAsExtern=ospf_area_impotasextern(AreaImportAsExtern), - AreaSummary=ospf_area_summary(AreaSummary), - AreaSpfRuns=int(AreaSpfRuns), - AreaBdrRtrCount=int(AreaBdrRtrCount), - AreaAsBdrRtrCount=int(AreaAsBdrRtrCount), - AreaScopeLsaCount=int(AreaScopeLsaCount), - AreaScopeLsaCksumSum=int(AreaScopeLsaCksumSum), - AreaStubMetric=int(AreaStubMetric), - AreaNssaTranslatorRole=ospf_area_translatorrole(AreaNssaTranslatorRole), - AreaNssaTranslatorState=ospf_area_translatorrolestate(AreaNssaTranslatorState), - AreaNssaTranslatorStabInterval=int(AreaNssaTranslatorStabInterval), - AreaNssaTranslatorEvents=int(AreaNssaTranslatorEvents), - AreaStubMetricType=ospf_area_submetrictype(AreaStubMetricType), - AreaTEEnabled=ospf_area_teeenabled(AreaTEEnabled), - AreaType=get_area_type(AreaImportAsExtern, AreaSummary) + area_id, import_as_extern, spf_runs, bdr_rtr_count, as_bdr_rtr_count, scope_lsa_count, scope_lsa_cksum_sum, \ + summary, stub_metric, nssa_translator_role, nssa_translator_state, nssa_translator_stab_interval, \ + nssa_translator_events, stub_metric_type, te_enabled, = area + + areas[area_id] = OspfV3Area( + AreaImportAsExtern=ospf_area_impotasextern(import_as_extern), + AreaSummary=ospf_area_summary(summary), + AreaSpfRuns=int(spf_runs), + AreaBdrRtrCount=int(bdr_rtr_count), + AreaAsBdrRtrCount=int(as_bdr_rtr_count), + AreaScopeLsaCount=int(scope_lsa_count), + AreaScopeLsaCksumSum=int(scope_lsa_cksum_sum), + AreaStubMetric=int(stub_metric), + AreaNssaTranslatorRole=ospf_area_translatorrole(nssa_translator_role), + AreaNssaTranslatorState=ospf_area_translatorrolestate(nssa_translator_state), + AreaNssaTranslatorStabInterval=int(nssa_translator_stab_interval), + AreaNssaTranslatorEvents=int(nssa_translator_events), + AreaStubMetricType=ospf_area_submetrictype(stub_metric_type), + AreaTEEnabled=ospf_area_teeenabled(te_enabled), + AreaType=get_area_type(import_as_extern, summary) ) return areas diff --git a/agent_based/ospfv3_general.py b/agent_based/ospfv3_general.py index 7e790d8..c329191 100644 --- a/agent_based/ospfv3_general.py +++ b/agent_based/ospfv3_general.py @@ -89,26 +89,26 @@ class OspfV3General: def parse_ospfv3_general(string_table: StringTable) -> Optional[OspfV3General]: try: - OID_END, RouterId, AdminStatus, VersionNumber, AreaBdrRtrStatus, ASBdrRtrStatus, AsScopeLsaCount, \ - AsScopeLsaCksumSum, OriginateNewLsas, RxNewLsas, ExtLsaCount, ExtAreaLsdbLimit, \ - ReferenceBandwidth, StubRouterSupport, StubRouterAdvertisement = string_table[0] + oid_end, router_id, admin_status, version_number, area_bdr_rtr_status, as_bdr_rtr_status, as_scope_lsa_count, \ + as_scope_lsa_cksum_sum, originate_new_lsas, rx_new_lsas, ext_lsa_count, ext_area_lsdb_limit, \ + reference_bandwidth, stub_router_support, stub_router_advertisement = string_table[0] except (ValueError, IndexError): return return OspfV3General( - RouterId=render_ipv4_neighbor_id(RouterId), - AdminStatus=ospf_admin_status(AdminStatus), - VersionNumber=int(VersionNumber), - AreaBdrRtrStatus=ospf_abr_asbr_status(AreaBdrRtrStatus), - ASBdrRtrStatus=ospf_abr_asbr_status(ASBdrRtrStatus), - AsScopeLsaCount=int(AsScopeLsaCount), - AsScopeLsaCksumSum=int(AsScopeLsaCksumSum), - RxNewLsas=int(RxNewLsas), - ExtLsaCount=int(ExtLsaCount), - ExtAreaLsdbLimit=int(ExtAreaLsdbLimit), - ReferenceBandwidth=int(ReferenceBandwidth), - StubRouterSupport=ospf_stub_router_support(StubRouterSupport), - StubRouterAdvertisement=ospf_stub_router_advertisement(StubRouterAdvertisement), + RouterId=render_ipv4_neighbor_id(router_id), + AdminStatus=ospf_admin_status(admin_status), + VersionNumber=int(version_number), + AreaBdrRtrStatus=ospf_abr_asbr_status(area_bdr_rtr_status), + ASBdrRtrStatus=ospf_abr_asbr_status(as_bdr_rtr_status), + AsScopeLsaCount=int(as_scope_lsa_count), + AsScopeLsaCksumSum=int(as_scope_lsa_cksum_sum), + RxNewLsas=int(rx_new_lsas), + ExtLsaCount=int(ext_lsa_count), + ExtAreaLsdbLimit=int(ext_area_lsdb_limit), + ReferenceBandwidth=int(reference_bandwidth), + StubRouterSupport=ospf_stub_router_support(stub_router_support), + StubRouterAdvertisement=ospf_stub_router_advertisement(stub_router_advertisement), ) diff --git a/agent_based/ospfv3_interface.py b/agent_based/ospfv3_interface.py index 79b5d38..101ddc6 100644 --- a/agent_based/ospfv3_interface.py +++ b/agent_based/ospfv3_interface.py @@ -11,6 +11,8 @@ # # 2021-09-17: rewritten for CMK 2.0 # 2021-10-02: added WATO options +# 2023-12-21: replaced ifDescr by ifName +# fixed handling if non-matching ifIndex # # sample snmpwalk # @@ -140,34 +142,32 @@ def parse_ospfv3_interface(string_table: List[StringTable]) -> Optional[Dict[str ospf_interfaces = {} interfaceinfo, interfaces = string_table + interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces} + for ospf_interface in interfaceinfo: - OID_END, IfAreaId, IfType, IfAdminStatus, IfRtrPriority, IfHelloInterval, IfRtrDeadInterval, IfPollInterval, \ - IfState, IfDesignatedRouter, IfBackupDesignatedRouter, IfEvents, IfMetricValue, IfLinkScopeLsaCount, \ - IfLinkLsaCksumSum = ospf_interface + oid_end, area_id, if_type, admin_state, rtr_priority, hello_interval, rtr_dead_interval, poll_interval, \ + if_state, designated_router, backup_designated_router, if_events, metric_value, link_scope_lsa_count, \ + link_lsa_cksum_sum = ospf_interface - ospfIfIndex, ospfIfInstId = OID_END.split('.') + ospf_if_index, ospf_if_inst_id = oid_end.split('.') - LocalInterface = '' - for interface in interfaces: - ifIndex, ifName = interface - if ifIndex == ospfIfIndex: - LocalInterface = get_short_if_name(ifName) + local_interface = get_short_if_name(interfaces_by_index.get(ospf_if_index, ospf_if_index)) - ospf_interfaces[LocalInterface] = OspfV3Interface( - IfAreaId=int(IfAreaId), - IfType=ospf_if_type(IfType), - IfAdminStatus=ospf_if_admin_status(IfAdminStatus), - IfRtrPriority=int(IfRtrPriority), - IfHelloInterval=int(IfHelloInterval), - IfRtrDeadInterval=int(IfRtrDeadInterval), - IfPollInterval=int(IfPollInterval), - IfState=ospf_if_state(IfState), - IfDesignatedRouter=render_ipv4_neighbor_id(IfDesignatedRouter), - IfBackupDesignatedRouter=render_ipv4_neighbor_id(IfBackupDesignatedRouter), - IfEvents=int(IfEvents), - IfMetricValue=int(IfMetricValue), - IfLinkScopeLsaCount=int(IfLinkScopeLsaCount), - IfLinkLsaCksumSum=int(IfLinkLsaCksumSum), + ospf_interfaces[local_interface] = OspfV3Interface( + IfAreaId=int(area_id), + IfType=ospf_if_type(if_type), + IfAdminStatus=ospf_if_admin_status(admin_state), + IfRtrPriority=int(rtr_priority), + IfHelloInterval=int(hello_interval), + IfRtrDeadInterval=int(rtr_dead_interval), + IfPollInterval=int(poll_interval), + IfState=ospf_if_state(if_state), + IfDesignatedRouter=render_ipv4_neighbor_id(designated_router), + IfBackupDesignatedRouter=render_ipv4_neighbor_id(backup_designated_router), + IfEvents=int(if_events), + IfMetricValue=int(metric_value), + IfLinkScopeLsaCount=int(link_scope_lsa_count), + IfLinkLsaCksumSum=int(link_lsa_cksum_sum), ) return ospf_interfaces @@ -235,10 +235,10 @@ register.snmp_section( ] ), SNMPTree( - base='.1.3.6.1.2.1.2.2.1', # + base='.1.3.6.1.2.1.31.1.1.1', # oids=[ - '1', # ifIndex - '2', # ifDescr + OIDEnd(), # ifIndex + '1', # ifName ] ), ], diff --git a/agent_based/ospfv3_neighbor.py b/agent_based/ospfv3_neighbor.py index 2f7c9b7..5aec8d9 100644 --- a/agent_based/ospfv3_neighbor.py +++ b/agent_based/ospfv3_neighbor.py @@ -11,6 +11,8 @@ # # 2021-09-17: rewritten for CMK 2.0 # 2021-10-02: added WATO options +# 2023-12-21: replaced ifDescr by ifName +# fixed handling if non-matching ifIndex # # .1.3.6.1.2.1.191.1.9.1.4.1.0.50529054 = INTEGER: 2 # .1.3.6.1.2.1.191.1.9.1.5.1.0.50529054 = Hex-STRING: FE 80 00 00 00 00 00 00 01 92 01 68 00 00 00 03 @@ -118,31 +120,29 @@ def parse_ospfv3_neighbor(string_table: List[StringTable]) -> Dict[str, OspfV3Ne neighbors = {} neighborinfo, interfaces = string_table + interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces} + for neighbor in neighborinfo: - OID_END, nbrAddressType, nbrAddress, nbrOptions, nbrPriority, nbrState, nbrEvents, nbrLsRetransQLen, \ - nbrHelloSuppressed, nbrRestartHelperStatus, nbrRestartHelperAge, nbrRestartHelperExitReason = neighbor - - if nbrAddressType == '2': # IPv6 address - nbrAddress = render_ipv6_address(nbrAddress) - nbrIfIndex, nbrIfInstId, nbrRtrId = OID_END.split('.') - - nbrLocalInterface = '' - for interface in interfaces: - ifIndex, ifName = interface - if ifIndex == nbrIfIndex: - nbrLocalInterface = get_short_if_name(ifName) - - neighbors[f'{nbrAddress} on {nbrLocalInterface}'] = OspfV3Neighbor( - nbrRtrId=render_ipv4_neighbor_id(nbrRtrId), - nbrOptions=nbrOptions, - nbrPriority=int(nbrPriority), - nbrState=int(nbrState), - nbrEvents=int(nbrEvents), - nbrLsRetransQLen=int(nbrLsRetransQLen), - nbrHelloSuppressed=ospf_nbr_hellosuppressed(nbrHelloSuppressed), - nbrRestartHelperStatus=ospf_nbr_helperstatus(nbrRestartHelperStatus), - nbrRestartHelperAge=int(nbrRestartHelperAge), - nbrRestartHelperExitReason=ospf_nbr_helperexitreason(nbrRestartHelperExitReason), + oid_end, address_type, address, options, priority, state, events, ls_retrans_q_len, hello_suppressed, \ + restart_helper_status, restart_helper_age, restart_helper_exit_reason = neighbor + + if address_type == '2': # IPv6 address + address = render_ipv6_address(address) + nbr_if_index, nbr_if_inst_id, nbr_rtr_id = oid_end.split('.') + + nbr_local_interface = get_short_if_name(interfaces_by_index.get(nbr_if_index, nbr_if_index)) + + neighbors[f'{address} on {nbr_local_interface}'] = OspfV3Neighbor( + nbrRtrId=render_ipv4_neighbor_id(nbr_rtr_id), + nbrOptions=options, + nbrPriority=int(priority), + nbrState=int(state), + nbrEvents=int(events), + nbrLsRetransQLen=int(ls_retrans_q_len), + nbrHelloSuppressed=ospf_nbr_hellosuppressed(hello_suppressed), + nbrRestartHelperStatus=ospf_nbr_helperstatus(restart_helper_status), + nbrRestartHelperAge=int(restart_helper_age), + nbrRestartHelperExitReason=ospf_nbr_helperexitreason(restart_helper_exit_reason), ) if neighbors: return neighbors @@ -224,10 +224,10 @@ register.snmp_section( ] ), SNMPTree( - base='.1.3.6.1.2.1.2.2.1', # + base='.1.3.6.1.2.1.31.1.1.1', # oids=[ - '1', # ifIndex - '2', # ifDescr + OIDEnd(), # ifIndex + '1', # ifName ] ), ], diff --git a/agent_based/ospfv3_virtuallink.py b/agent_based/ospfv3_virtuallink.py index ae87d87..f4335a7 100644 --- a/agent_based/ospfv3_virtuallink.py +++ b/agent_based/ospfv3_virtuallink.py @@ -11,6 +11,8 @@ # # 2021-09-17: rewritten for CMK 2.0 # 2021-10-02: added WATO options +# 2023-12-21: replaced ifDescr by ifName +# fixed handling if non-matching ifIndex # # .1.3.6.1.2.1.191.1.11.1.3.3.50529054 = INTEGER: 0 # .1.3.6.1.2.1.191.1.11.1.4.3.50529054 = Gauge32: 0 @@ -117,35 +119,32 @@ def parse_ospfv3_virtuallink(string_table: List[StringTable]) -> Dict[str, OspfV virtual_links = {} virtual_links_info, interfaces = string_table + interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces} + for virtual_link in virtual_links_info: - OID_END, VirtNbrIfIndex, VirtNbrIfInstId, VirtNbrAddressType, VirtNbrAddress, VirtNbrOptions, VirtNbrState, \ - VirtNbrEvents, VirtNbrLsRetransQLen, VirtNbrHelloSuppressed, VirtNbrIfId, VirtNbrRestartHelperStatus, \ - VirtNbrRestartHelperAge, VirtNbrRestartHelperExitReason, = virtual_link - - if VirtNbrAddressType == '2': # IPv6 address - VirtNbrAddress = render_ipv6_address(VirtNbrAddress) - VirtNbrArea, VirtNbrId = OID_END.split('.') - - nbrLocalInterface = '' - for interface in interfaces: - ifIndex, ifName = interface - if ifIndex == VirtNbrIfIndex: - nbrLocalInterface = get_short_if_name(ifName) - - # virtual_links[f'{VirtNbrAddress} on {nbrLocalInterface}']= OspfV3VirtualLink( - virtual_links[VirtNbrAddress] = OspfV3VirtualLink( - VirtNbrId=render_ipv4_neighbor_id(VirtNbrId), - VirtNbrArea=int(VirtNbrArea), - VirtNbrOptions=VirtNbrOptions, - VirtNbrState=int(VirtNbrState), - VirtNbrEvents=int(VirtNbrEvents), - VirtNbrLsRetransQLen=int(VirtNbrLsRetransQLen), - VirtNbrHelloSuppressed=ospf_nbr_hellosuppressed(VirtNbrHelloSuppressed), - VirtNbrRestartHelperStatus=ospf_nbr_helperstatus(VirtNbrRestartHelperStatus), - VirtNbrRestartHelperAge=int(VirtNbrRestartHelperAge), - VirtNbrRestartHelperExitReason=ospf_nbr_helperexitreason(VirtNbrRestartHelperExitReason), - VitrNbrLocalInterface=nbrLocalInterface, + oid_end, if_index, if_inst_id, address_type, address, options, state, events, ls_retrans_q_len, \ + hello_suppressed, if_id, restart_helper_status, restart_helper_age, \ + restart_helper_exit_reason, = virtual_link + + if address_type == '2': # IPv6 address + address = render_ipv6_address(address) + area, nbr_id = oid_end.split('.') + + nbr_local_interface = get_short_if_name(interfaces_by_index.get(if_index, if_index)) + + virtual_links[address] = OspfV3VirtualLink( + VirtNbrId=render_ipv4_neighbor_id(nbr_id), + VirtNbrArea=int(area), + VirtNbrOptions=options, + VirtNbrState=int(state), + VirtNbrEvents=int(events), + VirtNbrLsRetransQLen=int(ls_retrans_q_len), + VirtNbrHelloSuppressed=ospf_nbr_hellosuppressed(hello_suppressed), + VirtNbrRestartHelperStatus=ospf_nbr_helperstatus(restart_helper_status), + VirtNbrRestartHelperAge=int(restart_helper_age), + VirtNbrRestartHelperExitReason=ospf_nbr_helperexitreason(restart_helper_exit_reason), + VitrNbrLocalInterface=nbr_local_interface, ) if virtual_links: return virtual_links @@ -229,10 +228,10 @@ register.snmp_section( ] ), SNMPTree( - base='.1.3.6.1.2.1.2.2.1', # + base='.1.3.6.1.2.1.31.1.1.1', # oids=[ - '1', # ifIndex - '2', # ifDescr + OIDEnd(), # ifIndex + '1', # ifName ] ), ], diff --git a/mkp/ospfv3-0.4.0-20231221.mkp b/mkp/ospfv3-0.4.0-20231221.mkp new file mode 100644 index 0000000000000000000000000000000000000000..1367d5db1f99f564f170a7d0de7d422980dc1b08 GIT binary patch literal 13220 zcmbW7({d#YfP`b)c1~<Nnb@{Hu{}v9wr$(Cjft%@F(<ap{x|yoyH#EN2w!z|H)#wU zm|0AyB?Rc7zmMCtOtUqpPC3YW0%lS-8Zao1!Nc3+x_zzM%Jd<df4!k%hffAChZh0{ z3+5ph@zUaCMJ%dW1O~BU`eJ8N&IF&9=3!}RrTMLL3_WvOK@;G68w&$@k4f@W;eZS) zq8qY5*z7y9KN$W}viS2gW%1)2KVLDI7ai+u+4$kjmOtl+KX$gsG@$>w|AwIMXbV`- z&~LyyW!WkF$@=Nq1eY@7)5$L27vAN3=yOzu$%4eXJYRIv<MufNmoYx^pnT)_KK{9t z7Z?SCn-voGQTR9GPZ_&Dlk@#Jjl45?H!)6+)Jqj>M%m@bw|)z={0mZwadY%IHh0nk zia8dte>Zs%5rapM-;JkW8#y=YhB-FX0<mWBslMLYl#|=F)?3ZKRY`a^HkS4FX8U-@ zv6psJ^r7#se7`N@;-JQy`baFU_&8fH^5=rC0#8x`q)#5zrT6CrHsSZRN2k)TBc5Sj z_dNzMtB)e2`~Ci692v*7^#&Tz3wfYh>^@p6snO84pAb?6jS+9wg5S-|3p~&`b9mBy z{YA#$GqYJxqg*+n+!aL_BaH*@uu*6paQB(%fvRRKcXYBkPHEWUnlhOa6G}YN>yfN7 z`;Oeh<E+ITpT2MikCf13NssX(Q<yEMt?#;Ud%MHW6WHt^ukf$F*My)8wC9bE&$E23 zx4WlMt}F1s!rIHYd;Pq&CQ7j}%BxwP1Ga@KQDOQwVEd!WC!liz@&ov#O#}m+|JE0; zY1jaTs15)(K-NtlmdJN+Hg2QT$^=~ELugwPs*-G2AYA@n`ez_iAXLxht1XPb_T?9t zdS8#B6;dN?R`=*$3RiPtCcS>?!L*hFE;e@=If6bF`YKx@6d^D|<KoRUy)K^=-*L!v zPyy8oFOlI6_xJ8PZtwtDpmA^F7j)?#KImcj#e2jC=m+NBGzVS)ZTR~bbuZ+l0)2AJ zT&7t291HV+|A+cqV9|0<C0v0aNFVmdOBSTx7cwMP0xCF6qS;K@4n%}a|0E(|<!h9B z4oZs;1c4n5Hz$4KPXJj1vK<5iRey9aeJQ{9ekN$=@cME+1Zz7wo7dh9Q9*t6WsH9V zpW}QwZ-Z-^nq<>IB3`X-s7rfaP8`uf!oH3l3&vSAa0v^zIe<A2oQLCp(uvXG*f_Hh z2nmp&AF5qZlj=|9-zRY?oigSxwIyHq&>)&m5f!(YUg)8JWC7sh;4uhC(jRL>8<9KP zlkylmtm%p8r>Fx2CW`QySG8;XcB4bK{+F-Df06MP1H7O>#e8k?jL(D?tbp;U^V5!j zULit4Equ!X3d@4qPrjW(_{(i`b5>f)>zPqcwtv4_zsEKWx<VcBEsaYVtFBZ|HW^B; zv`dMm1nX4st41FSGw(&M_^(iFzfJMGMmt4X6Hw%<f6>ka8A@$7$oOdJw#U=Yq_5V@ zV#zSLwbApC%G9(2)d1Q9sjbFot;V`$bpe)1Z7>(5Of=WpG$dN2O{P!igqoyHs*a;j z$nf>f&RmMlLf}p;e?<<5ul57dB)|Cv17TlL{e2=q@h~O(zk6HN<?i)GsITDRGl-|x z<bY4hKsaK$Qq;N7)tWgh@8Lkd8CnB;L>iZqe#{9+d+!<#JnBsbxul(jq9Vb&I3DHa zpAgxA$BZ7kK(}LP7j5^VFkr>p*5#f~u6T_7r{r}SZV1wX!=M{aH+YCFh}Z2fuAmXB z(faD??L0!cfHLFjcu(v(^ZPr9QU2_PRC%u#8RyZf`6~PUI_?tE(yv0#tLW|8eV^I9 z>)WZ<J6`_Luc=+cJjnG)RYtfZ)&!b<<u~I%_X>WR{HWKcP~O2MROL+}C^$YD&q<4c zrd!*XCJA#?m~pk3_Hp-qh4<1u=_ZyL)F|%yW|;Ahej$~C#}r;P78&>f%+g2-j7vy- z>-c7Kv`S=r-G;ZharsPdwU2dUR1~QAr)E^2VVy%pa%d#=e*Z+lFHccyeiVAx$$I{a zq<;6MNj?1$x*Nx~s1%TcpC<D5WkV!Tuxun0Vw7gbT!G03{J|<9mgf`lAvp%!*9Wc| z9aH^^FD1@={IK2OzLUC6x4%a++27<@ype|>Uz%R|JzkvK5%)EK$>ah~MQobMa?Xnx zfz^7k?sTO5C~}9rqN7%I$SEi)8L(*DVtO&E4tRr^HikL`vRTFaB%oe&k3U>z`z_^z zc}T1DwXxVc7&PXy%=VpVhWCqJY>c~wF6}!WT{Hp_(@O3{{hBFHynCIaTO1OyD!l@u z$AY!&U@G(iFG}F}0l6E)@2B!b!)x%<7B!W%_(F2@%zUS8P`pi*A@KT$x9N><%BC3S zqiROH;s%PpbZkOR95Ac*gC4mq+$j5$DuN!hyE~HL_nHh&R<oc2SLJ4>$$4{mO0v~- zxQ=+PHXwy!cXui3R4ZKqq#*ZCOrBw1leZ!|rnS{w%HC4?DJLC0kEzTs&elQAWJ&LW zaoJg}?O4M4U2n5?<#?=_x@TjFmXlj^X~*G&kvfOg#LlNW33msS*v5`55c`CXS!Ffl zf`8h^dc62`us2cXSsrmCv~KLITz5=;Z5yn+Rr_OQ6N4dyikOpl4k2yhxf=c&lZhML zkL8?e!76qh+I7I9{_l<<&3ME0mp<CMOdXr$2E_qCdGOxX>3Ks1X`l%76A@q`Gs*{I z_7?RlQt@{Z`hf$1Q@jXi&ZfzN>4v;ttUeUl4l=DJFsn=Wq)*1JRpBRvE!S=D)Le1l z(;%)0=y8s$D!5k^M}w?TByuf@J(?b&c|b%&t2sD1CfPt(jPOVO;kvaPGY#Oa*g#4) z$!yInJ;S13!!O&nBY2r<n{Y`Hb4ynZ;=B|7O<T#N1s&2cr3@}7GoVZsh_xaXs+#t* zdk4zxZ$~y0(V>++<DUkeLr15#KN=^RMZbT2a;3$UMF|DfklniVmm7vGzvbxWAmi&p z!o-h3F6Mn^lbTp5d(!@9!XF%S&BDxU%82`7ZaWq3RIz-w#kDGQ+JuuwQg`TsoL_c3 z+nfd9q2KjzocM^p!-b8m_^{B2HTsCMwY1`$v9K6Ireb9f>=?>phXZI{o4Iz2peiq1 z;bV8fa0cpQm<Py}7#+=%+6HsdHz~SB)u7K{ElR}tz*6XrWyNSzc_0*Vfe~j1@h_?P zxYZr5l5CdZxZ;)OiJr;&gsRnLIkOEkzm_SMLpx^+GT(`5D%<apuXaFdK#=pjuVA@- z6Sxy(V>n&Lg8pa<qU_6JUV>K6?c{wPBNcr!8x^LEo*3Y|W^~qbN&_-Yu91NKSfwnL zF;+ofI*ln?B<r~_G2KQj>yuSlsV!4MvVFy(S>qX7PQGlGfq*)~Fh4|rgjzn(F5Ufr zfe-eW@7!MH9w~+}0n@l>4q1yoPW{J4E!%|oK7e%<;Evm1i6a&NZPgxA5lYeJV9Kq| z66)BPHh+@I-?}oz8djNgCt@a*{I+#oy50>us5h6(dWeyvcg`hV$W%X|63>vhJ7SRi z2B=9A>VynUi>-%xLIQrRyavKl`Fy{EOcn_5{&V*QP?h!5#|YpXI12Jg0CD(O!D|MA zrH)_xd%0@bXT-T4e*JoVkfx-<o9N_M0|U`W7x;;PRPqpEC25CXJ68_2H_{}0I-T;= zVqwopp7}|-!(yMKte)8b>FsBd<OJxcEEli;9oK+geGQYCiJc=beqev>sF~p7sD^~C zj8xleVucybJ`^4_>PKiIid1jNdp1x=Z&&L`_gw5W)u1FQ!d7-7i{~2=;hwVHE$$Zr zFG+17Hrt8H+9S>svPT#v6^|)mYI8C&{CXrCL@>UfzwZjjg1>+iMvC04l&l_(oE|tT z0S9B(2+c9*N6-)*RY4fW^JMaZG52&7%ib;H|3%v2=Yo!Y{8DdgB;s_*!mQnLzbxy} z^C&#zvFW@N0t=SFlArg>e{4^ry8pIh@4xo`^*6xsj*l6cv-YaEW-5g<HPQh;_8F9~ zUHtH7^Sh}NBtM=t>|W4zduhXDbnKIK%`4kyPw*V!`?powuDjI4n;I5mcH(Crh5f+i zLmoF#27o~GjiHNmo-i>_5HpqaMuK@LfU&SRQ}QHuJCyjrs^Xo7h&I!tn?(_W7m)<( z22sunx5EU0=r~h)9qE&osDGuYN<$rCe{wNcDW(wSXC2$PZNzJ&c#zt^8s?2!IL8&D zQ(JmRei@f(EH%#^Ozol^Kx`smTN(;hUOKbb*8MfEfN)~OK+HgXM5a(Js|4LTDiW%& zR7#01>eDLuJuQ)Yh9xIYNkozGfIxJR{OKZGoQuoh55tyQiz`TOT#W+PMdk+)S4aw% zMwQB*SIVwtCTTHt;MN_wM#(bzqdYe`3ybbK{Uk3vsWcgIJYJ!hIjqwWQ(S9Mc3hmj z^hk@+>N~^PPp<%RC;|wFw@gCjXrVol^V%{5>Ngi&gvnOOWj{3Y)&OMmOPIPQ?au>5 z5HS_g0mKA{M}Ib6r?>xbNtG>#jbFSzWerN??R#Y9&Fsu+8gT^^D6rszKftKfCl6QS z)AFrLBP=6Kpdw<|=L+o984l-|6gd0{9^bBD6Q2N1EHta+SL0r!rB}n5r@s+q2_9ih z@*J+O7tGmV2l@W)f|i>7N^gzK?S5<LaFc%i#VIKhO`BF093?`R^ZMr7_Bu*)Q-1O2 zWE}~k7MTQaKrUmmWW{!d<qR%I=QHD^zmK^dBr4*XW>fg5rKv@h8`g%2WRO=$Vs1#@ zI6><b`%g&TLK)$Q3zI(1=gd(f)dh`BlbnkPu{>Y4yO9DdZ1TZ0+d!w(=ndt|W)|3V zsk9o;o{i1XLLu2NOBXTCsC4M_dpT8n85=6McSZ8+%P4BaHoIIDkTzbKd|9KEy;6S4 z)@`nW8nqyeBCr`QFT9aeMw(x{CTb#lwF+;7!8S(0V5QKY{eJqS`fcvcoTu)>m@l*P z&G$R&FtA;S7q9YeAjD`O3dD6M;{Q4SA0#?PLH7~<f_g}3@b4e#eNOt57XKi<Xn(%J zD2uaMz1&{XosoS8D|)Bz5vv%6=srx13mS&h65Upw0WHMkNKIEJ$WbN*aEdl@yo*NL z@98WCGQCx}p2eg7*#=EPVz|~0`RH)jx`_s-a`7g(=E`?pldaEd;Wur~Q;$aQ&5f{| zrMbc1spjqRPQSRxdg=5T)WMdm*tWr1&er|1-adZp`erWca3gk8k*j--HT;oRkjQv1 z!uZGHg<;;zF7bv0$Aa;XMn$B1G=kWRDP3Qlz(}FQMy(#^D#7X^_?lRJhoPLIwL7Za z>PMqiUxKY-RSEy0&1ppq^nt6lMs}GJxK^H0M;(8j<F<!=uETn@7t@E$dUk~;6QV8Z z1ze0!?J7{*Fwp6(w4jp(w|rHzzeM|+9QYX0O-=fS`3a%!MgMAAYH^MX(?{~LKss}- z+c(l}`SejTg3gG)(u@@g&B*XhDZnsujf|?(<8F<(KnV>aRK%(8R`{E`cccUw$@3?; z6I%J_i9k>qwqU3SYX3Ku)YLc8uc5&wrY=;Ocb2_0j)&xqsWw7r$0ffqv`sw<eZYlX z)I0m4s61z4RJdMokpkxuMw~@4B-3IL1&m&?c-EPWygL>8V$iHtIhCjQ)^P<P@J5z` zog&SjH2gA)15{i}9A%T9>%D-9=|H`Rf%#$JzOjgfD*oa=$rDbj6EY?n^5_F7P3Xv_ zrxEuKTOe`b!=B5emH2m?LUmyGser@2Z=^$)c}gYplx!iayX1e5wCmcOIxh-_Ks<PA z;gc>=K*16kcGs8rL0W$k@fLyy_eHp_dzLI5*5BaQK=ke$jA(s>@KT2B4%ATaLvFEX zVJ=Zg2;kLK)1@>)y?gRwc~t`wD30P=NrKr<xu&5#Bgu8c4R$u1#v^??1iBA0>t1C~ zOLyxg5o0CwkA(ONgiBE1J7)3c&s|q||2-jYzE6Mj`iYYUXg(eSdM<SskvYGn``<CF zD^ZNt+7!xdo@3hwz(rEOLKacl0j!A+3CiSoNg&j5$ux&+xZu?H!7<Kz*>S20Su@2a zGST6)ZPmyKMQnrpU1kP;!kBKr#8Pl#a6|L!T~}P$BM5)!dRYgKvku^9COzx(7=0Km zvG)i%%gP~~#<M(rQ#BCjWxL!!Xx22EyteFWF=VoLsZ7ttFUvq{e~)L`5h3grnKux@ zh-xlKXk;@zb4X`F%K3!pRQ<9N3saSeC$r--lWjtG)y4DJkqpa7C!4Zk&ZtC`#gWZ- zI~wl7GHBQT%phv2CPE~)>7q+CFI#U9Ly9Taif?fKCCPv8DiOQ|NIl4%ML$jDn<~!f z+^VJDVid^<vtKgBnpU8LP=NO=J_C!Kg-In<AwS<GsL&{VYo)EM4aT0YQK{As_!(AN zm;Z2t;GTe>R9}gZL@^N?_~*dXplvl&ua8f?v$CZcFtE-S{ys%d;Ur-@oRYgF#{4~L ze$rm-XmYZY>i|zFfeJo}J(eTw><5kA<<Sd8glB**hCXEGIiTN`h)OFxYt-V{q%Zb* z6hwQh2Wc2)E0f@f$;U8VP4b%|ulbV`GRf`B9EsiY(mjf-35)TjJ~!$KJHZd_O@7>W z9b-WS7rPMeC9elI)=w3^n5K~-&{JXz*>GRx3Yt={6h0q4Vq&=2$N(}aL(8K&*M_`3 zh}1$g4ZABqjL(>Mp6gU&WoV@=mcH;pO%Gi=BM5j8*Q1uYE5<g5QqHGK6#a`+rU#;R z7am#8D^%oAVrcC+$!*8vWD15|_gXMa&_XGBP4J&gIrgJ+{<BPZn!9Yio>ccSX9ysK z+8XV&D|{=x>fzMr=Uo5f2U<3f9O-2ql%jCiHkY-zO1F5H(gF{GS=qeX14F^s^>GVU z5g`i)YM*-G^&@_CLaMf3uye0e{~v%n4PN5Xg^|`6f!eJU`4(%QGuJ|Rb^Fo*G6zfl zS{7NfCqoFatt=^oAeKz$06(|Aq23ASnkZBB?lTaQD{}yF+BFYqWU~8N^EzNUu>KcB z@ClrI9e7--7eT#JE_qF$MQhl;ynhg<5B*G_9aoxrM164teLieXowJx9?&=>lT0h={ zI$|jaLBzxeEFWWKu?RI*#Mr0&v~!xd=Z&n(rY_}_Tq)k+GA`T_9aC@Z`$F+}_I2N) zx}K)>%>>V0=i+va>OJ9>mjBL)l9zSedvzoniArLOGk5iYv3j0<h%pms77ntU3b+~a zE!;H5j;SaS+%$%NaV_;7e+_u(Y;dgz04a92a&HbfGI9yt3T}1_HHca_r>fya+J}-{ zaL1k|ZW!doanh4x)P~ki_(v$aN}%YQJU6v9!W4oN7lM)<bpOdAB{b|DpbQyavFePb z@%HsSBy+4sjTDyp2FcTFK}M#r%aO|l?lA3&T%-5}?mR_*w|sXBG~b=JCI9w<9hgnG z!D>tuYh&M8mI;zR7S%UI_j~&5tE+j*#fx`jyY{#7TaUMP1cN9YX{mWeRF56S&YDaM za=_Q~Rg*QQoXQHVLaHi79y%>|#LQB5L0ML!wJmyvK#}+&<O*gZdD?8S0RwHFZXh`G zdTsVr-SkeToXkU`)XS$+i}euq63$5@Q={+|LM__tr0kwks*{)4zIwECPyvUeY_z8f zV@obh=K;l%ZS0EV6w6@D*k9Qmy8#j-@@X-sx{|Z}H$8pMuc$3Hb_whdaTo6tQe{g1 zmE}NXf1baI45mv*DCQK9W92fwCaL!X0NZO~r3$({<prT$N&FSK^g%NL8MtZgiOx1z z#|f*bdpeCr;@f3~Ih>EpbQbJjz6|6a@3`Owiv#FwE!e-tbcLWoHC3>ogQ=s=#+E*( zv!DL_j{mH#8sXsxv2;;&I_56zBB6u2voI_ov$V+L*jFnrNxId7)?rZPXzB^P{|S)Q zT~yC>HzCi1DB&fMTzGoJdg7*Qreg9)Kijn7Jdm&p(A(1045F)4_3TdN|Dv~;Te&J- zxNnQ5X;S-<6OpQ}tC^sT`MifPsG6n40zp_--9tn`eKAKcNt>^T7%Ru1jgCvLtr;w- zN{9(ihfphK22;@Gi_9+%L9FJshb$`{Ao(C6sm=KICji{A8Y5H|{fe4qTW5|fMzzA& z*@=-a5<o-xy-_tqb;y}6)k%SJa!_N?;*?Qd9OQ<)uI<l)N-96`q`F|vR0jALF*s>N z@VQfoz3V3hDrk&TujB;oCH;z}qlCyHx3o94kG@56YGI(geGt4~lP&bUWR%-Fg*PH2 zDq+VX6uRf`LJst5o_tAE7mpYsc$pTOz|RLHtQ>J3|E_o~3i$xp43o3KcU1fwwO3vr zzqaa|T%gb(!^UVSv9e7$1N_OlY}IG!vbr}!{4+sABNWYq?CMf73C_z>bN@lh>w+-y z@-t7F{je4?q)doTwqnU=)DjJE89IN_2{BtIyrc;BThqwqh_7{%OQlWJ)&>;z>zKSP z>ka0~S%FR&ToS;(i~J+qwG6IVN2gb22YY+KkK8UJB2Qy#x(5=KVXVt_CK~MYuj%LF z1|hnBBz8v18#;D9ty-f##j@=NlZaLP&cIOI@_kb80KW{=Tq%S~Oo}jq(q$!HMVR0F zlFLs`7h3R5d1Y-JqT*HAukRmN=~XeSnPJ|wL|wXY6YQ&l(czDx)W<DG;(nD&IE7{L z8vOJ&R&3ofD-)8lX5JaPSO{z}i~3f&U?Ys<&RJnD2rYPnmX3(BM-Tn8w?E6Vir7He z&I|+|ETQ^S9OWoya;k!Qvziz0YrzInzST%BWhJ!`ozv-b<|W41%+#EnU5)1v<AJ;0 zs?9FHMrB2Wq3j92?c7;4ZjD3wExBGBU_hGQpp-Uf(Aber0T>9hg2x(T^s%x&4ChPj z1LK-sr~R;SS@`aOrhwB&P;DGKe{MI#hZI-xz0FdyAtp8!t|ePO608tG?Gt|_xQ%X( z)8i!v+_YS6sSSQlvuchBuWSwYGK}7m46ZeGk=47Mbz)UlUe;8I%FVDElT?;<KzxYi zZ3}Qn&7M7CI~6n4C92V4Cq{T!>iZqwFp57jr(*r3m&uW?J)ZZERfYau0T@lS)hX%S zprD6isb0xig5tjhME5H<k9uwSMmggkW&sac1BQ##1PfovZ?xnijnaqsl>Ow`oi{>w zBDhd7dW33Fg}k>#*?xCH*|udhLLRsCid}bd*9|u2TI!_ck%JhI7Qj9tLx|5yt_zIU z8S;~b5qRkadnw~-?JAbLGluqL(w3n^iCv;ztRm202#td8!4)7M3pF)0VH-~h;LQgg zFI`{0fhWYY3zm4xj(fR>V~+}q4&MrA*p3FIG@1L@<KwiSt$?Sc6)!@$%fY^@*}u0O z&Q7jAW34<9>9AXZapAGcqA}~_ag=6~UHCNWRL99Jn(38h7Pc*k4@OV52Tx1%X+`6t zXc+RDDO7w{7mq(q--%5&nfbqqKI#Nv)W?%CXfGuMQ7~xSVg7-l11ppb&W9|Lt&$Yw zoN~kh@0B=IL6KJXa7C8M&eTMd$E?vq&q}X(r3_jg?GElLY;1)sS(K<3fLO|n=52Mj z<**?lgwul*^Am*2rq$bB*;(rwPsvxUI1H0T9nC-AxDFR%IBLbjiL2spy|4Z)y^P(A z$*g$LAeMBF;ER^6z@+jc^<2)6wOK)%LNddFsh(n*(fW7>F{8*@pMhL_!PB1Sj+qLt zLalzBsVc#Hx$T&Il81O858XMKLlqo~MnwbxWv)4(7INkYZYAA(CN*<8{bA-_wVWv; za|$29#jQJ0h1{8$6mrXzKbxw4droS3>Y)8_@o~#-o6Y72nDw@*%@~5)c9IQrx6^i% z&GFVnLsW_RWSF#22V+B5D=k0zw<@Y^hPtPvNjJm+&B*dpT_BbW@upv(<eSLUzOnwD z@!I4?*=xgI;rd6F^(HLr2n=ZT?*Qj3OZ)-FXP?Qn6Ha~8<1d~39p8SZSp##(@zDD9 zjozZ1)@jWNscWPk;$xEpZ$7YN&2XAW&He;Cebingi2}%H|6oHcE=IlmdI%Q>VS2Db z>T)I-nwcO)&QTx$%YC*Z7Bu-e!|?sSYYsbtO-K<}#H<8bP_oS}yYNYYXi^Ll4U>D! zR!--eG^PiyFO9#m|6G$A$%qjil)`)jI6POJo=%`z8|{hd;@bn0msvOIw<0QVnFgH* z*nIB}px@qJ20*)HL)y-bg|>ptav(Xnvx2(f;90EK#d5?9VQ|W4KQ&bwk3ySJLQu|$ zuCHot=)<TYYisgSzprKM)&AsbPSW@GT+>VdkVg-Kk~}3djlwd~Le*d`T}^_d3nJN$ zMNd@Z<PB1m&zRg!j4S<Qy*3KiZ5)<8XsjFXO8MtmF}dK83og+ajQf?(4%jsi&a?Sl zaL%3!^GfzA;FdC523en(_&B#ur;P<92YesgjgBI7o)_$<GHHAniQh3FVXgl~mAw8T z{*ZuNp^NBEqVSe_qQw2Vdz!js{TKDuhj3Z$$gugL0DAw|=5fbV4o`o`#25w@dSHhu z#Obu*kQ|)4u!-_7%*TF=HvNNyWI9<`I&K;6{a=OzVB=jE5s_R;7?}vgwS9P03rtjm zm|qktluW`s%Ar(Bri*Ql*Ukf7q6)62h%3QVPV1;nyOpcg$zw{f>Fv}m$58*8T$M44 zisA~e()`Gqx-}q%Bqq~rS*hClQHZNH;!S1OyB0XP3sXmty*IRD--XljSJO?m`dk`B zuAf{%9plp6-vazt#;%6;FJ$W*5EzK?<LMd=8Bz}Yey&)#U*jd4=I!S=4a9=mV_KCg z3N0TEXz31Dt6@CPu^`z>mTiqkl^u$mbEhZ%@SE~dRymoqehX~rR~+coCpZO_2TVQ1 z!2gI6>K+Q`YHEy~PCE%`xVcD{`0n}J)=KdJdhXZD`{pqr$g+|qvpr>~+Ci188MhlZ zjd67nbCT;@of}7ri2YQ?)8*#`9ZQk_*}?plUUqC4f(Il~NkLnbbNZe8ouM%=L;r;p zzWQa9^lKsVZbRV|HE@Z*k`!@zy*g6j=yc2**uRrPPEgw1ch_lsA{Ew}&Xx3{)NkJT zGWz^S<CG54W%e2~BiJ1aC?LY>4L9HBw~kOEX}9WVym2_=a&z;{!;w-OyKPw>t`LIa z*VCihpbAX~omz$8{-@RfC91w~ex`mixR%E;)tik?xsG@7jCRG*br4ko9chzdl(y1k zmM?P{{X8<6jhOm4M~7uN4JzgUYG2HuDg4LEfKeV=N^T9T`+Ws%FNHA?qK&^o$noKp z*AOv=I!tD=H-mGtup<VWrHtCJ$618-%lJIiL1*QzV7!Y-VQe;&0#duA%(al(7Qz7} z$!u`S(N+)qBbI;$2^FTrE&6!G`kDD(;3@qqW`e29qq5Q4R$98_ca5ewPvJUbWt!3r za;0G!{%p55&OePDKc2Z&Dmc4!u@x|ZxI@ZSN<(BCC54RPr|O}d(hjPc!&7TvMbsZm zvc_b5apu+?7cF7FyFMm=$J<<#I8NzFLN*swS855P%3qZ*q*Tv(o~qAYJLdcYQcsl{ zZ_##d@wkfFzNNDg>Tl+-x%L7#1j|AMN_Z@j{JZq9Ep^-p^8a{IZV=N9XXA@RxELvi z6o*17wU`_CFkjY1xVy*}m3vcbYw-?bw`mo%(7NNeNnayWYg;kUIN=QT$O%Uj+)B@h zwv3_@irlS1NIrc(1kk1=8U58;7U@BD^^oD=SV2)_QPbEdRDP~70QK`>8pqwP+P&?9 zXMuOVnN7k+Nc1%25L`Zs!yrbV|JmN=AD;FKiK~vISPJd%KLGe1)PVc?Ld5`ji4Ja~ zMLEeGs7m1*P-Pl0;j(X^(e^05?JI;$g#GJe*Gl$)8KOxDw$kf7A-#8@Ws-Xa5XXVX zp-{4A9XROGl4v(8!r1VJ@>h2se+={|Eg^c=s6&+3pI0_{a=YFQ<ZryHlEAV8VzHO% z5lfq&RO^ma-D2e)IF<h|n)mXn=QiSTDW+i(fBhyUJw6=*3$zA;P$M7-_edZ8p4|dK zsFL5369p6&1<z2COs66nYtE&)poN>4><7~P<2Q~ykh$)MkU*c(QMuE?p&1fj=Cixt zJHV+Gc$pBV>3ztIwBUY}8@VC#;}FzGG4Z?azHhVUt?k3|zjF!#oKe%^l(9$8?qj5P zEn>CoJU`OwM4mcz9I4%0wP*ro#yoq4?Bl{u-(2sb+J>-!b;nkuDIc~YYCh@D;}>rk zSmvEF+|FL*DH<moF~JOs<pKG==TPBZ*5e1k@_?(^J8p~z_K!iKI}9M##CWS^zlaF; zPkw=k$sIDQ%t9(2x@n^CTk(6tP9a}Ok!NNGj&8&qeOg{-T29x~dasZO**yXe1{2My z-+mePHZR+u{z5H&(5+l1r@Po#a+st=701iBk7Zw{<GY=&E;pL4U$hQ0!U}=qT2|1> z57DRlTf2Zc@8;FRc-pU@R(-MDVyZD>y988k=vxZWIZVa0batomy(|A-pLAC#nC$eE zloSx++B1BO`gFGUwCvNws7d2iwKTpQBw<~yEP#$_(VY3x<`%72v!HH&kpC=XoBsMf z6M?sx!J?VJatJhz9ZSo7^?kj4WhQd?(UtdrR?*uf9)K2o9ZLz<9(%ivex*1`^^9f8 z*=|dR-g4GK{n6TnWBE{15zD5^Tk%}87G|;VQN~%S_x@l55%Lho@293G@HD$7m!^;w zU<0k{fX8K7Je#XgyTd$Q*s6pv!k?BIwm2MzaB-VW)vTUy;htpcpGt6SW7z_J^s(C0 zRDA)oY2=bzIp3S$K-spdVv^V1ys;787>30a_}CZLP4JigC}KqDne+Vz6QhMVFp?WM zgxad(gb0k@?+82cQ~eo%8CBptcD)+y&L6AV1U^N2z?AzTCqKA+`8#U$Qr0>{xDz9} zYO{>QFT<OBZux}(ckgCFJG$vD$&aohv08gu`l3<Ity4WLzXoJc@+S1IWNqkq(+t?V zFA?f6i7I$~J!Sd;g$ymUuRIh;r|({Ycs@X3ry|=Cp(1iDz^_wn(xKsGqN2GGFz#{0 z_r9j4$Lk&FKB!Afk*qJI1YP5v2cS^p8Gt;4t!;8HfQ=ZVjg(<j1;aEkd6J1t2l7cy z%aySYb61_~1D~k!(EHlwQMvc~{xF%^VXZ$$^^4=y#CtOa^;}YIShMA(aUfvC_1Mo~ z%o`TvH}i(-o?jjlr#;n1S}mig+zs4crsKzf!7V4ImT2YOBktIKQMdNx@{TUmrNB^^ z;VIdchYV{Q$K)m5QTv~Iz9BYv77koPWt^MgU`0^|OHs5lowCV$KO}kRXFV$-u}K(% za)o*AMm$c|IsIne_**+fKC^o`YC|h7Q&ONkI^^J#5m^#wDOJj9H02ndVl1yxVy5Ki ztDXn7_zwzy^*@^hq%-rm=&tV?9#XMsF?(-`o+g$|F3iVhp`g@?vG~MpkGEkGTD7@a z*AwC~(zg~?j01Git|s3$0j3?wb&F97X6DyWDx{w6{z#C)kkQx;I#ye>D#@j+Yn?oV z6wsxJ-2H)0yfJ}6DM+8kj%SG>{BI=kV?S_<2w?*=;hkz%09(#946q4kfHt={4z=0; zs`JF{4AC2WZyniHSN-fyO!HeF*L8(=E6@3x1v|nc84I<?Y53bzkYA(U&{EHq1gk{b z2XDCQuw$HoE#?MZ51l%NAn`9rLPoE4v3as;MwQSn0X$)>XdYHg69Ys?*wOC3*SD*q zhZy?hC}Xo94F%0J9IZ3>?Ft`L8llMa!3FS7RC*NudRW00e_!9?Jc8-Owca+BR$Rf1 zpI@R*Xi8)3u&^LNu5=c9LmXyuN6(94VRJ*@{T|xb_zmu5rm5Tcb2`=o4nnobfF;kW zh$?}YzPn?cL<h6_LUeg|fim1u2%rG0z5qX|7?R(kXdWOf$h#(MUW1fu2U$>T!zNL~ zrVADI7K09$gfg<2#e5g^$|z5NJ~n5JdaROg>6fAnXVHqP?T}j8=k|h23jth5nC*4( z6bwd}dNk#~h&8Qk6Ls{>9Q29Aa{Hj>cY&{nkPXFklyz);G6Xrp)1f%~V^<5RYDo(+ znUA-AXnXJ1!B^!A-!B+V^9(rh9&tO8A_ofif}0BXg9@gnuR{9<x}8m4*l0KTNNcm( z#@^_CLg<eawQAZDn-~qK6{w2=-eB~#K8KeVM#D&J)S1}Xqf~U)1P#YaP=P70cf+-D zh9~TaBlxOB4CxFpiT105p8O;vOTT7_F>H)nP*sy3rk7!Sv1s5ssb?D~yUAK`&U4W= z%}3NKen!1mcn;xdF>yXP3uMLX{AM@!OWnVIq=wGv!GSxz`sbICt8wa4j8|NO*m2S^ zP2un>lVF4aELP}H|1AkBr^kt#Af#~N<+4sCd7YAi;9YeXMnveUe&PZ2>87vS8h~ra zLXg+JWlgmYrWq7QP<_z|nDd{-?(7S^+~KgH&;-wjoVGqeN{Xkd=)0!b7v@_@)2K1? zv6<8K1zfF>DAYjA>58J@&H)U@%o3`i21jy7EW4e%&FVLDIF_K!1P+j_4s%K0qL10Y z(T^dWLfAL<Ck+pY`SVPV<YE?B|E`j|zuFRqO_r&*{hc&iq61ghV+R=ak_-|PT32B> zJEP7G5z-C8j6F>1o5OWJojm2Vo4I)DrFV}~%0a_R{kMDWbYuz;(k>ObSSN6zRntcr zT4C0Bw$8Z+e0so+Z2A@M6A5SS69w<5&Ue>2iu_3!+R+R%NR;3Q&*ke<%Yr9VLf0aB zt|>6Jt42mJjI=OQd=V_%ld|PdpTTm=JCXc>Je4i0@x6+;H_p%TL>9r&OT@61;BSB+ zS+9ISXzX`MKp$6lQa{4#sXp~m$YTBiB*gs?-l(-=rB-cX{oownS(+0=%-6FiKD*$0 zA~-P&&jJsb<)Ybz96CvAU)av8#IPt{A%{PUwm(_-=+1O#Lys9l05GG(bJW69WOPl} zZ^3Jzs~)g|t%?%8UO<2BV|zQ=XDPA7DBwys%^B^VmE)wkBhg;TIBQPU6W(D}H{hQ2 znU<2`{z^dR7tN&CBfki4H|(-FTBX-w;c0_l_=z+}V%`@7aqTh_V_<%6_J)ER>~Rzn zAX};!%UZdqwPtJt7Uvq-Hv2?1eFXs6v0g>7#tR7w7ql)9RfVqyj<wA^$=b>Acup}< zj{bzI8eIqoko@5LN6?%BIaY59r^cYsr_&f@^l4r{Dy3|tA{8v=^Vqf_OJ;*#KQxst zs6A_Q5ZptK*hi?gJK~peighS42#wBW`r$5G=9eD3_VIAY-8!#p(iSOIvp>63Y{d-3 zP+}eYL9Fn|g{cD{E%`9+8Q0N?7i#5djffkn^puuquX|QbLJ!Q!IX7m1sj4=)h*|R4 z_^<=!gs|>tGqG<&gSQVRDK2q1TDue{=ct9QN$Du65dPw5ks3fS;I`{Mpt4*ti?ckW zf8@ZIp{Bj>daqC9_vPi?1Sp4&#CZK4B(=BJbanpe(VW*<J;#435*KU2Ms*)|hxB<6 z*?@bJL;GV2`(9&@aLzW?51J?bG{sL@Ehmd9Jy62m`_|(97VMFH0RKRC#q?wnVb8M~ zO6&-VR9_Em&a~4-e=6#7%hjfHNWbe2$Nif99OmQCnA6N`9an-Hros=i+MUdQsOatW z8tGK2$;DP217=+|hGC*VFC1sY=Is;k`MpyZC%@s9SU%0bnu7sVy*mK?p;BG@9MrqL zO0pvP^B+Bp#zPa}fvw-1TAUOY097GSrrXQy)X6pZtf6b5d>mI3JI(U3St?>a=BiA) z;}ka@F^8#f+a7z819VYh<3F-;2%Pgdk_N;MNVB?w50e05G375@6t^ccS&1yBtuxI# z1+vL(PBcRf9dAUAF!x0m2Q(Pbb19Q2GrqmwSKujS`@uIo57g+>%%8Bf5LXM)SK`I| zWE>HSM)P%LznAJX&h)(gcx7UMlT%!Ad$1QoJ|S|iRQ7DsAl3cF{L>)xGOmb@f6#90 zs0?9;6m!V=*Pze9mybva6N+t2Qpn~6$MSae!ve~>?`3J@%MInZ4u6C$S-U4-TKYQD z$n9u@Gwew5I05f9Z}X~~h!~|7On0>y^S7aKxdES+_#O7a^k8|@x2O|}JX^EfU(S%k z;%V1nQA4AEZ;0*9Nwz<svfMN@6$58ul{=x4!NY$~Xi4}&O)|a@r0Q%%M`{tHK!SZg za>=@u{EGuxvNV6ADP9bs-GL8S1}OfA!OX&K3C=#LW&rjmleuWbu9sFz7-fL<)a9IS z!yl(I3>{`(gyw!md58*@CWyjD%XGv(BpD{w=Yo<r{X)4Vg8Ov(<myP*qImh?(LQ;S zpd`lgo7;E}<g#jlumr|xnf^#Cht)&_XsjMd=W_`<4DukA#LIuhG;o)cXCTaP<b@Qy z-;eSo1ChwIW{;u1##fY1e437tzgFhxBuKO`lfy#CQ^_-FL`Vl3mM}e^@(1NbD_q!n z0;{io-&x|u5n$EHU4!rT1>&`6$1W#aGibPDH8;GIUeJ51{7wBS@3^$wAfQ)0^heIY zEA~01lh6izn;4~uJE3~)O=~fQ-o<Eg#Dljsuwup;Q?U76iDwo~RrW38&+x(1jv7p% zpUZfXlYBuzz^jBO&a@}$?C0$N9x?0K-9Gf)bMM>Ys=?NoktitmSCz_1MQq;Ff5ESA z9nh3BT>e0<pFU+9&d}25u3W+YGXw12s_$*H55VdF0VbXH*x$58#*4ffx{oKfDFMwk zG~*eZMWh)bl#Tc@p3{TXceKanP5y7g`|kRmsgq!P{8bYdKaqZ46BqC3p9|nGn#T4U zR^EQnJtcIKK;tw1ih~uO>3z0%|M{pIl;pR-VPyE8vXMcrF2`PI$6JBPKV&@y^4*k5 z9a~EWlQR2Q^+*v=$KZ8Xu=$GraOKpEoExd9;p^arL^NPJD0<(y|6b|R((8mv&0GdU z8SF&lM6&nWi)^E<Zv*O|R%5D5Rk<>3j|{1PbO4hx!re1#CYWnvLoBeWrPpHe_Ubp8 z@h9aCJNRP8R=lk06TUopb?`Jbj_7-b%4CYJj<AG47G}(WRcYqmeMIt(Fa@g(NX^Uv z6dmke!sa#F__QNmI!e?*l6;)?&!zFy3~)1VrvCCx93)c%sXD?t6D#4=-;dWPPPHkw z3mrE{F3t2;8Cv`BeM(KA6%T^{j2a4j^8b2&<M%37+2xNNY9RVU45%LgU-JWTfa)yR zT%uA>Wd{+DVjZ?K(<qfIB_f@e^qs8p7ZK6Iqswo_KQ7yQO61Zy<+q6F)&&17|No`@ P`Wg6@88HNw2oCl?mOlN8 literal 0 HcmV?d00001 diff --git a/packages/ospfv3 b/packages/ospfv3 index 8301b31..45f218f 100644 --- a/packages/ospfv3 +++ b/packages/ospfv3 @@ -17,7 +17,7 @@ 'gui': ['metrics/ospfv3.py', 'wato/ospfv3.py']}, 'name': 'ospfv3', 'title': 'Collection of OSPFv3 checks', - 'version': '0.4.0-20230603', + 'version': '0.4.0-20231221', 'version.min_required': '2.1.0b1', - 'version.packaged': '2.1.0p21', - 'version.usable_until': None} \ No newline at end of file + 'version.packaged': '2.2.0p14', + 'version.usable_until': None} -- GitLab