From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <36RUbXwgKCoAktvsgmheksskpi.gsqpmfefmkempwsyvgi0evi.svk@flex--gprocida.bounces.google.com> Received: from mail-wm1-x349.google.com (mail-wm1-x349.google.com [IPv6:2a00:1450:4864:20::349]) by sourceware.org (Postfix) with ESMTPS id CB2283857C64 for ; Fri, 24 Jul 2020 17:10:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org CB2283857C64 Received: by mail-wm1-x349.google.com with SMTP id s2so2116641wmj.7 for ; Fri, 24 Jul 2020 10:10:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=Jyh6qWlbtrQM9uqUMC9G8WBoe8qoVaXZaSu7cdwrF3M=; b=O+hD4uKXuw+FTHwzDcHYsWWYT0GieDbMxpVx/TFQBwKDMj9pC+jifamqg2xWEaPbGe Un62fjNywq8iOKXDfQjmDJ94PI2CHG+tlBgIO9nXMZn09V/TH5JTaTNnDahZSX8IQOEa rhfC386xX6UMRtiQ6q/NZ8zGeuv23ctj4xZAbtWlkCmMVQth3rW1Ax6aDbCqz3cwuUz0 lg27rQJAv0LlgVSh4BjrPR9Gb6bkThQfBELxEJunmVRkqOWvkeSyI1VAFy7AnwXt1n7G x1h8curUOsE8E97XyEYSaX6UMQKF2iltZ5nla4/3OtfM6FFgwA8yr+f2zRYUHwLgoiKV kdxg== X-Gm-Message-State: AOAM533W12MefhNDdFXrOd0lZBAGuCaC4Qufa7+PF/woIOlYJ1CKLbDZ nc/tYEVdmxR1P7rQ5qVpklwUKw9NjScIQllOSc+Ln867yPTMq+1iNjslfpAZnlrfgdz9jkQzc1P 00oAemmaznpxgLuGaIlu9xkQOEhsJKdsKACgH6Ve1JBxmPpi3zH13AfxBXDCP2BVnL0Lj2eQ= X-Google-Smtp-Source: ABdhPJx51kcLf+vZMRGYekATl0PDhDlt3oxLDKAhvOE2IUDdKy8abKOeZ/GYQiD02DRs3iDsXQ7MuBoghlY6Lg== X-Received: by 2002:a1c:96c5:: with SMTP id y188mr9808315wmd.71.1595610601517; Fri, 24 Jul 2020 10:10:01 -0700 (PDT) Date: Fri, 24 Jul 2020 18:09:53 +0100 In-Reply-To: <20200724170953.4069948-1-gprocida@google.com> Message-Id: <20200724170953.4069948-3-gprocida@google.com> Mime-Version: 1.0 References: <20200724170953.4069948-1-gprocida@google.com> X-Mailer: git-send-email 2.28.0.rc0.142.g3c755180ce-goog Subject: [PATCH 2/2] DWARF: track chained DIE declaration-only status From: Giuliano Procida To: libabigail@sourceware.org Cc: dodji@seketeli.org, kernel-team@android.com, gprocida@google.com, maennich@google.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-20.9 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SCC_10_SHORT_WORD_LINES, SCC_20_SHORT_WORD_LINES, SCC_35_SHORT_WORD_LINES, SCC_5_SHORT_WORD_LINES, SPF_HELO_NONE, SPF_PASS, TXREP, T_FILL_THIS_FORM_SHORT, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Jul 2020 17:10:35 -0000 Bug 26297: Possible misinterpretation of DW_AT_declaration via DW_AT_specif= ication This commit causes the DWARF reader to only consider a DIE to be "declaration only" if all DIEs in the chain leading to it have the DW_AT_declaration attribute. It is a follow-up commit to a change making die_is_declaration_only examine just the immediate DIE. The responsibility of tracking the cumulative declaration-only status of DIEs falls on build_ir_node_from_die which is the function that makes recursive calls to itself on encountering a DW_AT_specification or DW_AT_abstract_origin link. Various other functions that would have previously called die_is_declaration_only are modified so that get the cumulative value for this flag, rather than just examing the DIE they are given. This change eliminates a lot of spurious declaration-only types in ABI output and may also prevent the same, particularly when anonymous, from confusing libabigail's type equality and canonicalisation logic. * src/abg-dwarf-reader.cc (add_or_update_class_type): Add an is_declaration_only argument. Use this in favour of the die_is_declaration_only helper function. (add_or_update_union_type): Ditto. (function_is_suppressed): Ditto. (build_or_get_fn_decl_if_not_suppressed): Ditto. (build_enum_type): Ditto. (build_ir_node_from_die): To the main overload, add is_declaration_only argument and default this to true. Update this to false if the given DIE is not declaration only and pass this on in recusrive calls and calls to build_enum_type, add_or_update_union_type, add_or_update_class_type and build_or_get_fn_decl_if_not_suppressed. * tests/data/test-annotate/test17-pr19027.so.abi: Update test. This is mostly the removal of is-declaration-only attributes, removal of unreachable parts of the type graph and type id renumbering. * tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi: Likewise. * tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi: Likewise. * tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi: Likewise. * tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1-rep= ort-0.txt: Likewise. * tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise. * tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi: Likewise. * tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.ab= i: Likewise. * tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi: Likewise. Signed-off-by: Giuliano Procida --- src/abg-dwarf-reader.cc | 107 ++++++----- .../data/test-annotate/test17-pr19027.so.abi | 18 +- ...st18-pr19037-libvtkRenderingLIC-6.1.so.abi | 58 +++--- ...19-pr19023-libtcmalloc_and_profiler.so.abi | 108 +++++------ ...st20-pr19025-libvtkParallelCore-6.1.so.abi | 174 +++++++++--------- ...-pr19026-libvtkIOSQL-6.1.so.1-report-0.txt | 33 +--- .../test-read-dwarf/test17-pr19027.so.abi | 18 +- ...st18-pr19037-libvtkRenderingLIC-6.1.so.abi | 57 +++--- ...19-pr19023-libtcmalloc_and_profiler.so.abi | 108 +++++------ ...st20-pr19025-libvtkParallelCore-6.1.so.abi | 174 +++++++++--------- 10 files changed, 422 insertions(+), 433 deletions(-) diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index 66705882..ba2fc41b 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -7852,6 +7852,7 @@ build_ir_node_from_die(read_context& ctxt, scope_decl* scope, bool called_from_public_decl, size_t where_offset, + bool is_declaration_only =3D true, bool is_required_decl_spec =3D false); =20 static type_or_decl_base_sptr @@ -7861,21 +7862,23 @@ build_ir_node_from_die(read_context& ctxt, size_t where_offset); =20 static class_decl_sptr -add_or_update_class_type(read_context& ctxt, - Dwarf_Die* die, - scope_decl* scope, - bool is_struct, - class_decl_sptr klass, - bool called_from_public_decl, - size_t where_offset); +add_or_update_class_type(read_context& ctxt, + Dwarf_Die* die, + scope_decl* scope, + bool is_struct, + class_decl_sptr klass, + bool called_from_public_decl, + size_t where_offset, + bool is_declaration_only); =20 static union_decl_sptr -add_or_update_union_type(read_context& ctxt, - Dwarf_Die* die, - scope_decl* scope, - union_decl_sptr union_type, - bool called_from_public_decl, - size_t where_offset); +add_or_update_union_type(read_context& ctxt, + Dwarf_Die* die, + scope_decl* scope, + union_decl_sptr union_type, + bool called_from_public_decl, + size_t where_offset, + bool is_declaration_only); =20 static decl_base_sptr build_ir_node_for_void_type(read_context& ctxt); @@ -7889,14 +7892,16 @@ build_function_decl(read_context& ctxt, static bool function_is_suppressed(const read_context& ctxt, const scope_decl* scope, - Dwarf_Die *function_die); + Dwarf_Die *function_die, + bool is_declaration_only); =20 static function_decl_sptr build_or_get_fn_decl_if_not_suppressed(read_context& ctxt, scope_decl *scope, Dwarf_Die *die, size_t where_offset, - function_decl_sptr f =3D function_decl_sptr()); + bool is_declaration_only, + function_decl_sptr f); =20 static var_decl_sptr build_var_decl(read_context& ctxt, @@ -13055,7 +13060,8 @@ static enum_type_decl_sptr build_enum_type(read_context& ctxt, Dwarf_Die* die, scope_decl* scope, - size_t where_offset) + size_t where_offset, + bool is_declaration_only) { enum_type_decl_sptr result; if (!die) @@ -13068,7 +13074,6 @@ build_enum_type(read_context& ctxt, string name, linkage_name; location loc; die_loc_and_name(ctxt, die, loc, name, linkage_name); - bool is_declaration_only =3D die_is_declaration_only(die); =20 bool is_anonymous =3D false; // If the enum is anonymous, let's give it a name. @@ -13541,7 +13546,8 @@ add_or_update_class_type(read_context& ctxt, bool is_struct, class_decl_sptr klass, bool called_from_public_decl, - size_t where_offset) + size_t where_offset, + bool is_declaration_only) { class_decl_sptr result; if (!die) @@ -13581,7 +13587,6 @@ add_or_update_class_type(read_context& ctxt, string name, linkage_name; location loc; die_loc_and_name(ctxt, die, loc, name, linkage_name); - bool is_declaration_only =3D die_is_declaration_only(die); =20 bool is_anonymous =3D false; if (name.empty()) @@ -13787,8 +13792,7 @@ add_or_update_class_type(read_context& ctxt, &child)) continue; =20 - decl_base_sptr ty =3D is_decl( - build_ir_node_from_die(ctxt, &type_die, + decl_base_sptr ty =3D is_decl(build_ir_node_from_die(ctxt, &type_di= e, called_from_public_decl, where_offset)); type_base_sptr t =3D is_type(ty); @@ -13908,12 +13912,13 @@ add_or_update_class_type(read_context& ctxt, /// e.g, DW_TAG_partial_unit that can be included in several places in /// the DIE tree. static union_decl_sptr -add_or_update_union_type(read_context& ctxt, - Dwarf_Die* die, - scope_decl* scope, +add_or_update_union_type(read_context& ctxt, + Dwarf_Die* die, + scope_decl* scope, union_decl_sptr union_type, - bool called_from_public_decl, - size_t where_offset) + bool called_from_public_decl, + size_t where_offset, + bool is_declaration_only) { union_decl_sptr result; if (!die) @@ -13939,7 +13944,6 @@ add_or_update_union_type(read_context& ctxt, string name, linkage_name; location loc; die_loc_and_name(ctxt, die, loc, name, linkage_name); - bool is_declaration_only =3D die_is_declaration_only(die); =20 bool is_anonymous =3D false; if (name.empty()) @@ -15183,7 +15187,8 @@ build_var_decl(read_context& ctxt, static bool function_is_suppressed(const read_context& ctxt, const scope_decl* scope, - Dwarf_Die *function_die) + Dwarf_Die *function_die, + bool is_declaration_only) { if (function_die =3D=3D 0 || dwarf_tag(function_die) !=3D DW_TAG_subprogram) @@ -15202,8 +15207,7 @@ function_is_suppressed(const read_context& ctxt, // symbol, by default, it's not suppressed. Unless we are asked to // drop undefined symbols too. if (!is_class_type(scope) - && (!die_is_declaration_only(function_die) - || ctxt.drop_undefined_syms())) + && (!is_declaration_only || ctxt.drop_undefined_syms())) { Dwarf_Addr fn_addr; if (!ctxt.get_function_address(function_die, fn_addr)) @@ -15256,10 +15260,11 @@ build_or_get_fn_decl_if_not_suppressed(read_conte= xt& ctxt, scope_decl *scope, Dwarf_Die *fn_die, size_t where_offset, + bool is_declaration_only, function_decl_sptr result) { function_decl_sptr fn; - if (function_is_suppressed(ctxt, scope, fn_die)) + if (function_is_suppressed(ctxt, scope, fn_die, is_declaration_only)) return fn; =20 if (!result) @@ -16232,6 +16237,7 @@ build_ir_node_from_die(read_context& ctxt, scope_decl* scope, bool called_from_public_decl, size_t where_offset, + bool is_declaration_only, bool is_required_decl_spec) { type_or_decl_base_sptr result; @@ -16268,6 +16274,12 @@ build_ir_node_from_die(read_context& ctxt, return result; } =20 + // This is *the* bit of code that ensures we have the right notion + // of "declared" at any point in a DIE chain formed from + // DW_AT_abstract_origin and DW_AT_specification links. There should + // be no other callers of die_is_declaration_only. + is_declaration_only =3D is_declaration_only && die_is_declaration_only(d= ie); + switch (tag) { // Type DIEs we support. @@ -16373,7 +16385,8 @@ build_ir_node_from_die(read_context& ctxt, else if (!type_suppressed) { enum_type_decl_sptr e =3D build_enum_type(ctxt, die, scope, - where_offset); + where_offset, + is_declaration_only); result =3D add_decl_to_scope(e, scope); if (result) { @@ -16415,7 +16428,9 @@ build_ir_node_from_die(read_context& ctxt, is_decl(build_ir_node_from_die(ctxt, &spec_die, skope.get(), called_from_public_decl, - where_offset)); + where_offset, + is_declaration_only, + /*is_required_decl_spec=3D*/false)); ABG_ASSERT(cl); klass =3D dynamic_pointer_cast(cl); ABG_ASSERT(klass); @@ -16426,7 +16441,8 @@ build_ir_node_from_die(read_context& ctxt, tag =3D=3D DW_TAG_structure_type, klass, called_from_public_decl, - where_offset); + where_offset, + is_declaration_only); } else klass =3D @@ -16434,7 +16450,8 @@ build_ir_node_from_die(read_context& ctxt, tag =3D=3D DW_TAG_structure_type, class_decl_sptr(), called_from_public_decl, - where_offset); + where_offset, + is_declaration_only); result =3D klass; if (klass) { @@ -16451,7 +16468,8 @@ build_ir_node_from_die(read_context& ctxt, add_or_update_union_type(ctxt, die, scope, union_decl_sptr(), called_from_public_decl, - where_offset); + where_offset, + is_declaration_only); if (union_type) { maybe_set_member_type_access_specifier(union_type, die); @@ -16541,7 +16559,7 @@ build_ir_node_from_die(read_context& ctxt, if (tag =3D=3D DW_TAG_member) ABG_ASSERT(!is_c_language(ctxt.cur_transl_unit()->get_language())); =20 - if (die_die_attribute(die, DW_AT_specification, spec_die,false) + if (die_die_attribute(die, DW_AT_specification, spec_die, false) || (var_is_cloned =3D die_die_attribute(die, DW_AT_abstract_origin, spec_die, false))) { @@ -16555,6 +16573,7 @@ build_ir_node_from_die(read_context& ctxt, spec_scope.get(), called_from_public_decl, where_offset, + is_declaration_only, /*is_required_decl_spec=3D*/true)); if (d) { @@ -16636,7 +16655,9 @@ build_ir_node_from_die(read_context& ctxt, origin_die, interface_scope.get(), called_from_public_decl, - where_offset)); + where_offset, + is_declaration_only, + /*is_required_decl_spec=3D*/false)); if (d) { fn =3D dynamic_pointer_cast(d); @@ -16659,7 +16680,9 @@ build_ir_node_from_die(read_context& ctxt, : scope; =20 result =3D build_or_get_fn_decl_if_not_suppressed(ctxt, logical_scope, - die, where_offset, fn); + die, where_offset, + is_declaration_only, + fn); =20 if (result && !fn) result =3D add_decl_to_scope(is_decl(result), logical_scope); @@ -16814,7 +16837,8 @@ build_ir_node_from_die(read_context& ctxt, const scope_decl_sptr& scop =3D ctxt.global_scope(); return build_ir_node_from_die(ctxt, die, scop.get(), called_from_public_decl, - where_offset); + where_offset, + true); } =20 scope_decl_sptr scope =3D get_scope_for_die(ctxt, die, @@ -16822,7 +16846,8 @@ build_ir_node_from_die(read_context& ctxt, where_offset); return build_ir_node_from_die(ctxt, die, scope.get(), called_from_public_decl, - where_offset); + where_offset, + true); } =20 status diff --git a/tests/data/test-annotate/test17-pr19027.so.abi b/tests/data/te= st-annotate/test17-pr19027.so.abi index 4814b0f2..f3d326e4 100644 --- a/tests/data/test-annotate/test17-pr19027.so.abi +++ b/tests/data/test-annotate/test17-pr19027.so.abi @@ -8847,7 +8847,7 @@ - + @@ -8868,7 +8868,7 @@ - + @@ -8889,7 +8889,7 @@ - + @@ -14004,7 +14004,7 @@ - + @@ -14025,7 +14025,7 @@ - + @@ -14046,7 +14046,7 @@ - + @@ -35220,7 +35220,7 @@ - + @@ -35241,7 +35241,7 @@ - + @@ -35262,7 +35262,7 @@ - + diff --git a/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1= .so.abi b/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so= .abi index 3fa79582..0999e02d 100644 --- a/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi +++ b/tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi @@ -5148,7 +5148,7 @@ - + @@ -5195,7 +5195,7 @@ - + @@ -5623,7 +5623,7 @@ - + @@ -5845,7 +5845,7 @@ - + @@ -5960,7 +5960,7 @@ - + @@ -8094,10 +8094,6 @@ - - - - @@ -10304,7 +10300,7 @@ - + @@ -12359,7 +12355,7 @@ - + @@ -13005,7 +13001,7 @@ - + @@ -13017,7 +13013,7 @@ - + @@ -13046,7 +13042,7 @@ - + @@ -13790,7 +13786,7 @@ - + @@ -13819,7 +13815,7 @@ - + @@ -13831,7 +13827,7 @@ - + @@ -13843,7 +13839,7 @@ - + @@ -13896,7 +13892,7 @@ - + @@ -14011,7 +14007,7 @@ - + @@ -14126,7 +14122,7 @@ - + @@ -16338,7 +16334,7 @@ - + @@ -16367,7 +16363,7 @@ - + @@ -16379,7 +16375,7 @@ - + @@ -16391,7 +16387,7 @@ - + @@ -16403,7 +16399,7 @@ - + @@ -16417,7 +16413,7 @@ - + @@ -16433,7 +16429,7 @@ - + @@ -16445,7 +16441,7 @@ - + @@ -16487,7 +16483,7 @@ - + @@ -16499,7 +16495,7 @@ - + diff --git a/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profil= er.so.abi b/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profile= r.so.abi index 48221737..0450fe3c 100644 --- a/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.a= bi +++ b/tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.a= bi @@ -2694,7 +2694,7 @@ - + @@ -7964,7 +7964,7 @@ - + @@ -10488,7 +10488,7 @@ - + @@ -10506,7 +10506,7 @@ - + @@ -12218,7 +12218,7 @@ - + @@ -13421,7 +13421,7 @@ - + @@ -15822,7 +15822,7 @@ - + @@ -15851,7 +15851,7 @@ - + @@ -16021,7 +16021,7 @@ - + @@ -16050,7 +16050,7 @@ - + @@ -16193,7 +16193,7 @@ - + @@ -18385,7 +18385,7 @@ - + @@ -18397,7 +18397,7 @@ - + @@ -18409,7 +18409,7 @@ - + @@ -18421,7 +18421,7 @@ - + @@ -19052,7 +19052,7 @@ - + @@ -19081,7 +19081,7 @@ - + @@ -19093,7 +19093,7 @@ - + @@ -19105,7 +19105,7 @@ - + @@ -19121,7 +19121,7 @@ - + @@ -19133,7 +19133,7 @@ - + @@ -19934,7 +19934,7 @@ - + @@ -22030,7 +22030,7 @@ - + @@ -22378,7 +22378,7 @@ - + @@ -22407,7 +22407,7 @@ - + @@ -22419,7 +22419,7 @@ - + @@ -22458,7 +22458,7 @@ - + - + @@ -22877,7 +22877,7 @@ - + @@ -22889,7 +22889,7 @@ - + @@ -22901,7 +22901,7 @@ - + @@ -22913,7 +22913,7 @@ - + @@ -22925,7 +22925,7 @@ - + @@ -22940,7 +22940,7 @@ - + @@ -23055,7 +23055,7 @@ - + @@ -26740,9 +26740,9 @@ - + - + @@ -28141,7 +28141,7 @@ - + @@ -28256,7 +28256,7 @@ - + @@ -30654,7 +30654,7 @@ - + @@ -31029,7 +31029,7 @@ - + @@ -31426,7 +31426,7 @@ - + @@ -31541,7 +31541,7 @@ - + @@ -34265,7 +34265,7 @@ - + @@ -34932,7 +34932,7 @@ - + @@ -34987,7 +34987,7 @@ - + @@ -34999,7 +34999,7 @@ - + @@ -35011,7 +35011,7 @@ - + @@ -35066,7 +35066,7 @@ - + @@ -35095,7 +35095,7 @@ - + @@ -37172,7 +37172,7 @@ - + @@ -37695,7 +37695,7 @@ @@ -37812,7 +37812,7 @@ - + @@ -39279,7 +39279,7 @@ - + diff --git a/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1= .so.abi b/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so= .abi index 3dbf8cd2..44148103 100644 --- a/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi +++ b/tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi @@ -7297,7 +7297,7 @@ - + @@ -10195,7 +10195,7 @@ - + @@ -10438,7 +10438,7 @@ - + @@ -10450,7 +10450,7 @@ - + @@ -10672,7 +10672,7 @@ - + @@ -10792,7 +10792,7 @@ - + @@ -10804,7 +10804,7 @@ - + @@ -10937,7 +10937,7 @@ - + @@ -11083,7 +11083,7 @@ - + @@ -11095,7 +11095,7 @@ - + @@ -11612,7 +11612,7 @@ - + @@ -11952,7 +11952,7 @@ - + @@ -12067,7 +12067,7 @@ - + @@ -12182,7 +12182,7 @@ - + @@ -19226,7 +19226,7 @@ - + @@ -19349,7 +19349,7 @@ - + @@ -19528,9 +19528,9 @@ - + - + @@ -20358,7 +20358,7 @@ - + @@ -21186,7 +21186,7 @@ - + @@ -24768,7 +24768,7 @@ - + @@ -24932,9 +24932,9 @@ - + - + @@ -24948,7 +24948,7 @@ - + @@ -24962,7 +24962,7 @@ - + @@ -25117,7 +25117,7 @@ - + @@ -25129,7 +25129,7 @@ - + @@ -25141,7 +25141,7 @@ - + @@ -25153,7 +25153,7 @@ - + @@ -25306,7 +25306,7 @@ - + @@ -25335,7 +25335,7 @@ - + @@ -25347,7 +25347,7 @@ - + @@ -25359,7 +25359,7 @@ - + @@ -25440,7 +25440,7 @@ - + @@ -25452,7 +25452,7 @@ - + @@ -25607,7 +25607,7 @@ - + @@ -25619,7 +25619,7 @@ - + @@ -25631,7 +25631,7 @@ - + @@ -25643,7 +25643,7 @@ - + @@ -25659,7 +25659,7 @@ - + @@ -25671,7 +25671,7 @@ - + @@ -25683,7 +25683,7 @@ - + @@ -25695,7 +25695,7 @@ - + @@ -25707,7 +25707,7 @@ - + @@ -25719,7 +25719,7 @@ - + @@ -27704,7 +27704,7 @@ - + @@ -30444,7 +30444,7 @@ - + @@ -30559,7 +30559,7 @@ - + @@ -30676,7 +30676,7 @@ - + @@ -30791,7 +30791,7 @@ - + @@ -30908,7 +30908,7 @@ - + @@ -31023,7 +31023,7 @@ - + @@ -31140,7 +31140,7 @@ - + @@ -31255,7 +31255,7 @@ - + @@ -31370,7 +31370,7 @@ - + @@ -31634,7 +31634,7 @@ - + @@ -31749,7 +31749,7 @@ - + @@ -31864,7 +31864,7 @@ - + @@ -31979,7 +31979,7 @@ @@ -32094,7 +32094,7 @@ - + @@ -34461,9 +34461,9 @@ - + - + @@ -34475,7 +34475,7 @@ - + @@ -34487,7 +34487,7 @@ - + @@ -34499,7 +34499,7 @@ - + @@ -34511,7 +34511,7 @@ - + @@ -34527,7 +34527,7 @@ - + @@ -34539,7 +34539,7 @@ - + @@ -34551,7 +34551,7 @@ - + @@ -34575,7 +34575,7 @@ - + @@ -34742,7 +34742,7 @@ - + @@ -40006,9 +40006,9 @@ - + - + @@ -40020,7 +40020,7 @@ - + @@ -40032,7 +40032,7 @@ - + @@ -40044,7 +40044,7 @@ - + @@ -40056,7 +40056,7 @@ - + @@ -40209,7 +40209,7 @@ - + @@ -40221,7 +40221,7 @@ - + @@ -40233,7 +40233,7 @@ - + @@ -40245,7 +40245,7 @@ - + @@ -40257,7 +40257,7 @@ - + @@ -40592,7 +40592,7 @@ - + @@ -40707,7 +40707,7 @@ - + @@ -40822,7 +40822,7 @@ - + @@ -40937,7 +40937,7 @@ - + @@ -42357,7 +42357,7 @@ - +