diff options
author | Andrey Ponomarenko <aponomarenko@rosalab.ru> | 2013-06-28 12:50:10 +0400 |
---|---|---|
committer | Andrey Ponomarenko <aponomarenko@rosalab.ru> | 2013-06-28 12:50:10 +0400 |
commit | e3a8d81ab0e2aeefe91205d96c2edeec14749ec7 (patch) | |
tree | 423d33d7fe031d6f4be35b62f333323e760787ac | |
parent | 96b86aef1d1dc6a223bc260aa1af55a0093d1136 (diff) | |
download | abi-compliance-checker-e3a8d81ab0e2aeefe91205d96c2edeec14749ec7.tar.gz |
Fixed infinite loop; Improved performance (5%).
-rw-r--r-- | INSTALL | 4 | ||||
-rwxr-xr-x | abi-compliance-checker.pl | 159 | ||||
-rw-r--r-- | doc/Changes.html | 11 | ||||
-rw-r--r-- | doc/Descriptor.html | 2 | ||||
-rw-r--r-- | doc/Options.html | 2 | ||||
-rw-r--r-- | doc/Readme.html | 6 | ||||
-rw-r--r-- | doc/SysCheck/Descriptor.html | 2 | ||||
-rw-r--r-- | doc/SysCheck/Examples.html | 2 | ||||
-rw-r--r-- | doc/SysCheck/Usage.html | 2 |
9 files changed, 105 insertions, 85 deletions
@@ -9,8 +9,8 @@ All rights reserved. RELEASE INFORMATION Project: ABI Compliance Checker (ACC) -Version: 1.99.3 -Date: 2013-06-26 +Version: 1.99.4 +Date: 2013-06-29 This file explains how to install and setup environment diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl index 9603b10..e2064c9 100755 --- a/abi-compliance-checker.pl +++ b/abi-compliance-checker.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl ########################################################################### -# ABI Compliance Checker (ACC) 1.99.3 +# ABI Compliance Checker (ACC) 1.99.4 # A tool for checking backward compatibility of a C/C++ library API # # Copyright (C) 2009-2010 The Linux Foundation @@ -64,7 +64,7 @@ use Storable qw(dclone); use Data::Dumper; use Config; -my $TOOL_VERSION = "1.99.3"; +my $TOOL_VERSION = "1.99.4"; my $ABI_DUMP_VERSION = "3.2"; my $OLDEST_SUPPORTED_VERSION = "1.18"; my $XML_REPORT_VERSION = "1.1"; @@ -93,7 +93,7 @@ $SkipHeadersPath, $CppCompat, $LogMode, $StdOut, $ListAffected, $ReportFormat, $UserLang, $TargetHeadersPath, $BinaryOnly, $SourceOnly, $BinaryReportPath, $SourceReportPath, $UseXML, $Browse, $OpenReport, $SortDump, $DumpFormat, $ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath, -$CheckInfo); +$CheckInfo, $Quick); my $CmdName = get_filename($0); my %OS_LibExt = ( @@ -273,7 +273,8 @@ GetOptions("h|help!" => \$Help, "force!" => \$Force, "tolerance=s" => \$Tolerance, "tolerant!" => \$Tolerant, - "check!" => \$CheckInfo + "check!" => \$CheckInfo, + "quick!" => \$Quick ) or ERR_MESSAGE(); sub ERR_MESSAGE() @@ -771,6 +772,9 @@ OTHER OPTIONS: -check Check completeness of the ABI dump. + + -quick + Quick analysis. Disable check of some template instances. REPORT: Compatibility report will be generated to: @@ -2550,7 +2554,7 @@ sub createType($$) my $NewId = ++$MAX_ID; $TypeInfo{$Version}{$NewId} = $Attr; - $TName_Tid{$Version}{$Attr->{"Name"}} = $NewId; + $TName_Tid{$Version}{formatName($Attr->{"Name"}, "T")} = $NewId; return "$NewId"; } @@ -2577,8 +2581,7 @@ sub instType($$$) { # remove absent # _Traits, etc. $Attr->{"Name"}=~s/,\s*\b$Key(,|>)/$1/g; - if(defined $Attr->{"NameSpace"}) - { + if(defined $Attr->{"NameSpace"}) { $Attr->{"NameSpace"}=~s/,\s*\b$Key(,|>)/$1/g; } foreach (keys(%{$Attr->{"TParam"}})) @@ -2586,8 +2589,7 @@ sub instType($$$) if($Attr->{"TParam"}{$_}{"name"} eq $Key) { delete($Attr->{"TParam"}{$_}); } - else - { + else { $Attr->{"TParam"}{$_}{"name"}=~s/,\s*\b$Key(,|>)/$1/g; } } @@ -2625,6 +2627,8 @@ sub instType($$$) delete($Attr->{"Template"}); } + my $New = createType($Attr, $LibVersion); + my %EMap = (); if(defined $TemplateMap{$LibVersion}{$Tid}) { %EMap = %{$TemplateMap{$LibVersion}{$Tid}}; @@ -2633,44 +2637,42 @@ sub instType($$$) $EMap{$_} = $Map->{$_}; } - if(defined $Attr->{"BaseType"}) { - $Attr->{"BaseType"} = instType(\%EMap, $Attr->{"BaseType"}, $LibVersion); + if(defined $TypeInfo{$LibVersion}{$New}{"BaseType"}) { + $TypeInfo{$LibVersion}{$New}{"BaseType"} = instType(\%EMap, $TypeInfo{$LibVersion}{$New}{"BaseType"}, $LibVersion); } - if(defined $Attr->{"Base"}) + if(defined $TypeInfo{$LibVersion}{$New}{"Base"}) { - foreach my $Bid (keys(%{$Attr->{"Base"}})) + foreach my $Bid (keys(%{$TypeInfo{$LibVersion}{$New}{"Base"}})) { my $NBid = instType(\%EMap, $Bid, $LibVersion); if($NBid ne $Bid) { - %{$Attr->{"Base"}{$NBid}} = %{$Attr->{"Base"}{$Bid}}; - delete($Attr->{"Base"}{$Bid}); + %{$TypeInfo{$LibVersion}{$New}{"Base"}{$NBid}} = %{$TypeInfo{$LibVersion}{$New}{"Base"}{$Bid}}; + delete($TypeInfo{$LibVersion}{$New}{"Base"}{$Bid}); } } } - my $R = createType($Attr, $LibVersion); - - if(defined $Attr->{"Memb"}) + if(defined $TypeInfo{$LibVersion}{$New}{"Memb"}) { - foreach (sort {int($a)<=>int($b)} keys(%{$Attr->{"Memb"}})) { - $Attr->{"Memb"}{$_}{"type"} = instType(\%EMap, $Attr->{"Memb"}{$_}{"type"}, $LibVersion); + foreach (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}{$New}{"Memb"}})) { + $TypeInfo{$LibVersion}{$New}{"Memb"}{$_}{"type"} = instType(\%EMap, $TypeInfo{$LibVersion}{$New}{"Memb"}{$_}{"type"}, $LibVersion); } } - if(defined $Attr->{"Param"}) + if(defined $TypeInfo{$LibVersion}{$New}{"Param"}) { - foreach (sort {int($a)<=>int($b)} keys(%{$Attr->{"Param"}})) { - $Attr->{"Param"}{$_}{"type"} = instType(\%EMap, $Attr->{"Param"}{$_}{"type"}, $LibVersion); + foreach (sort {int($a)<=>int($b)} keys(%{$TypeInfo{$LibVersion}{$New}{"Param"}})) { + $TypeInfo{$LibVersion}{$New}{"Param"}{$_}{"type"} = instType(\%EMap, $TypeInfo{$LibVersion}{$New}{"Param"}{$_}{"type"}, $LibVersion); } } - if(defined $Attr->{"Return"}) { - $Attr->{"Return"} = instType(\%EMap, $Attr->{"Return"}, $LibVersion); + if(defined $TypeInfo{$LibVersion}{$New}{"Return"}) { + $TypeInfo{$LibVersion}{$New}{"Return"} = instType(\%EMap, $TypeInfo{$LibVersion}{$New}{"Return"}, $LibVersion); } - return $R; + return $New; } } @@ -3593,11 +3595,15 @@ sub isTypedef($) } if(my $Info = $LibInfo{$Version}{"info"}{$_[0]}) { - my $TDid = getTypeDeclId($_[0]); - if(getNameByInfo($TDid) - and $Info=~/unql[ ]*:[ ]*\@(\d+) / - and getTypeId($TDid) eq $_[0]) { - return $1; + if(my $TDid = getTypeDeclId($_[0])) + { + if(getTypeId($TDid) eq $_[0] + and getNameByInfo($TDid)) + { + if($Info=~/unql[ ]*:[ ]*\@(\d+) /) { + return $1; + } + } } } } @@ -4023,15 +4029,18 @@ sub getTrivialTypeAttr($) if($ADD_TMPL_INSTANCES) { - if(not getTreeAttr_Flds($TypeId)) + if($Tmpl) { - if($Tmpl) + if(my $MainInst = getTreeAttr_Type($Tmpl)) { - if(my $MainInst = getTreeAttr_Type($Tmpl)) + if(not getTreeAttr_Flds($TypeId)) { if(my $Flds = getTreeAttr_Flds($MainInst)) { $LibInfo{$Version}{"info"}{$TypeId} .= " flds: \@$Flds "; } + } + if(not getTreeAttr_Binf($TypeId)) + { if(my $Binf = getTreeAttr_Binf($MainInst)) { $LibInfo{$Version}{"info"}{$TypeId} .= " binf: \@$Binf "; } @@ -5655,7 +5664,7 @@ sub setFuncArgs($$) } elsif(my $OldId = $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"type"}) { - if(getFuncType($InfoId) ne "Method" or $Pos>0) + if($Pos>0 or getFuncType($InfoId) ne "Method") { # params if($OldId ne $ParamTypeId) { @@ -7158,9 +7167,9 @@ sub selectSystemHeader_I($$) return join_P($Path,$Header); } } - if(not keys(%SystemHeaders)) + if(not defined $Cache{"checkSystemFiles"}) { # register all headers in system include dirs - detectSystemHeaders(); + checkSystemFiles(); } foreach my $Candidate (sort {get_depth($a)<=>get_depth($b)} sort {cmp_paths($b, $a)} getSystemHeaders($Header, $LibVersion)) @@ -14529,8 +14538,8 @@ sub find_ParamPair_Pos_byTypeAndPos($$$$$) sub getTypeIdByName($$) { - my ($TypeName, $Version) = @_; - return $TName_Tid{$Version}{formatName($TypeName, "T")}; + my ($TypeName, $LibVersion) = @_; + return $TName_Tid{$LibVersion}{formatName($TypeName, "T")}; } sub diffTypes($$$) @@ -18770,7 +18779,9 @@ sub get_LibPath_I($$) return join_P($Dir,$Name); } } - detectSystemObjects() if(not keys(%SystemObjects)); + if(not defined $Cache{"checkSystemFiles"}) { + checkSystemFiles(); + } if(my @AllObjects = keys(%{$SystemObjects{$Name}})) { return $AllObjects[0]; } @@ -19203,46 +19214,51 @@ sub get_prefixes_I($$) } } -sub detectSystemHeaders() +sub checkSystemFiles() { + $Cache{"checkSystemFiles"} = 1; + my @SysHeaders = (); - foreach my $DevelPath (@{$SystemPaths{"include"}}) + + foreach my $DevelPath (@{$SystemPaths{"lib"}}) { next if(not -d $DevelPath); - # search for all header files in the /usr/include - # with or without extension (ncurses.h, QtCore, ...) - push(@SysHeaders, cmd_find($DevelPath,"f")); - foreach my $Link (cmd_find($DevelPath,"l")) - { # add symbolic links - if(-f $Link) { - push(@SysHeaders, $Link); - } + + my @Files = cmd_find($DevelPath); + + if(not $CheckObjectsOnly) + { + # search for headers in /usr/lib + @SysHeaders = grep { /\.h(pp|xx)?\Z|\/include\// } @Files; + @SysHeaders = grep { not /\/(gcc|jvm|syslinux|kbd|parrot|xemacs|perl|llvm)/ } @SysHeaders; } - } - foreach my $DevelPath (@{$SystemPaths{"lib"}}) - { # search for config headers in the /usr/lib - next if(not -d $DevelPath); - foreach (cmd_find($DevelPath,"f",'\.h(pp|xx)?\Z|\/include\/',"",1)) + + # search for libraries in /usr/lib (including symbolic links) + my @Libs = grep { /\.$LIB_EXT[0-9.]*\Z/ } @Files; + foreach my $Path (@Libs) { - if(/\/(gcc|jvm|syslinux|kbd|parrot|xemacs)/) - { # skip useless headers - next; - } - push(@SysHeaders, $_); + my $N = get_filename($Path); + $SystemObjects{$N}{$Path} = 1; + $SystemObjects{parse_libname($N, "name+ext", $OStarget)}{$Path} = 1; } } - get_prefixes_I(\@SysHeaders, \%SystemHeaders); -} - -sub detectSystemObjects() -{ - foreach my $DevelPath (@{$SystemPaths{"lib"}}) + + if(not $CheckObjectsOnly) { - next if(not -d $DevelPath); - foreach my $Path (find_libs($DevelPath,"","")) - { # search for shared libraries in the /usr/lib (including symbolic links) - $SystemObjects{parse_libname(get_filename($Path), "name+ext", $OStarget)}{$Path}=1; + foreach my $DevelPath (@{$SystemPaths{"include"}}) + { + next if(not -d $DevelPath); + # search for all header files in the /usr/include + # with or without extension (ncurses.h, QtCore, ...) + push(@SysHeaders, cmd_find($DevelPath,"f")); + foreach my $Link (cmd_find($DevelPath,"l")) + { # add symbolic links + if(-f $Link) { + push(@SysHeaders, $Link); + } + } } + get_prefixes_I(\@SysHeaders, \%SystemHeaders); } } @@ -22305,6 +22321,9 @@ sub scenario() $COMMON_LOG_PATH = $LoggingPath; } } + if($Quick) { + $ADD_TMPL_INSTANCES = 0; + } if($OutputDumpPath) { # validate if(not isDump($OutputDumpPath)) { diff --git a/doc/Changes.html b/doc/Changes.html index 325e388..b477ba4 100644 --- a/doc/Changes.html +++ b/doc/Changes.html @@ -21,7 +21,7 @@ </style> <script src="/load.php?debug=false&lang=en&modules=startup&only=scripts&skin=monobook&*"></script> <script>if(window.mw){ - mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8293, "wgArticleId": 2293, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []}); + mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8295, "wgArticleId": 2293, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []}); } </script><script>if(window.mw){ mw.loader.load(["mediawiki.page.startup"]); @@ -43,7 +43,7 @@ </p> <table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div> <ul> -<li class="toclevel-1 tocsection-1"><a href="#Version_1.99.3_.28June_26.2C_2013.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.99.3 (June 26, 2013)</span></a></li> +<li class="toclevel-1 tocsection-1"><a href="#Version_1.99.4_.28June_29.2C_2013.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.99.4 (June 29, 2013)</span></a></li> <li class="toclevel-1 tocsection-2"><a href="#Version_1.99.1_.28June_07.2C_2013.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.99.1 (June 07, 2013)</span></a></li> <li class="toclevel-1 tocsection-3"><a href="#Version_1.99_.28May_24.2C_2013.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.99 (May 24, 2013)</span></a></li> <li class="toclevel-1 tocsection-4"><a href="#Version_1.98.8_.28February_07.2C_2013.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.98.8 (February 07, 2013)</span></a></li> @@ -91,8 +91,8 @@ <li class="toclevel-1 tocsection-46"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">46</span> <span class="toctext">Version 1.0 (July 31, 2009)</span></a></li> </ul> </td></tr></table> -<h2> <span class="mw-headline" id="Version_1.99.3_.28June_26.2C_2013.29"> Version 1.99.3 (June 26, 2013) </span></h2> -<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.3.tar.gz">abi-compliance-checker-1.99.3.tar.gz</a><br /> +<h2> <span class="mw-headline" id="Version_1.99.4_.28June_29.2C_2013.29"> Version 1.99.4 (June 29, 2013) </span></h2> +<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.4.tar.gz">abi-compliance-checker-1.99.4.tar.gz</a><br /> </p><p><b>ACC 2.0</b> pre-release. </p><p>This is a bug-fix release with a few new features. </p> @@ -105,6 +105,7 @@ </li><li> Corrected visualization of v-table content in the report </li><li> Corrected identification of target headers </li><li> Corrected source-compatibility check +</li><li> Performance optimization (5%) </li></ul> </li></ul> <ul><li> <b>New Options</b> @@ -1036,5 +1037,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20130626113712 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20130628084630 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/Descriptor.html b/doc/Descriptor.html index 1bf31b4..488c9da 100644 --- a/doc/Descriptor.html +++ b/doc/Descriptor.html @@ -510,5 +510,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!en!*!* and timestamp 20130625115533 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!en!*!* and timestamp 20130627211302 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/Options.html b/doc/Options.html index 947d66f..e0bd05d 100644 --- a/doc/Options.html +++ b/doc/Options.html @@ -277,5 +277,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20130625182409 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20130628084703 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/Readme.html b/doc/Readme.html index 79dc9b5..38c2e7d 100644 --- a/doc/Readme.html +++ b/doc/Readme.html @@ -21,7 +21,7 @@ </style> <script src="/load.php?debug=false&lang=en&modules=startup&only=scripts&skin=monobook&*"></script> <script>if(window.mw){ - mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8292, "wgArticleId": 2292, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []}); + mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8294, "wgArticleId": 2292, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []}); } </script><script>if(window.mw){ mw.loader.load(["mediawiki.page.startup"]); @@ -93,7 +93,7 @@ <h2> <span class="mw-headline" id="Downloads"> Downloads </span></h2> <h3> <span class="mw-headline" id="Releases"> Releases </span></h3> <p>All releases can be downloaded from <b><a href="Changes.html" title="ABI Compliance Checker Downloads">this page</a></b> or <b><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/">github.com</a></b>. -</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.3.tar.gz">1.99.3</a> +</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.4.tar.gz">1.99.4</a> </p> <h3> <span class="mw-headline" id="Git"> Git </span></h3> <p>Read-only access to the latest development version:<br /> @@ -499,5 +499,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20130626113629 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20130628084448 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/SysCheck/Descriptor.html b/doc/SysCheck/Descriptor.html index 9b01685..5b767ce 100644 --- a/doc/SysCheck/Descriptor.html +++ b/doc/SysCheck/Descriptor.html @@ -233,5 +233,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20130625220600 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20130628084706 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/SysCheck/Examples.html b/doc/SysCheck/Examples.html index 0d45e0e..10acc6c 100644 --- a/doc/SysCheck/Examples.html +++ b/doc/SysCheck/Examples.html @@ -239,5 +239,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20130625145729 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20130628032307 --> </div></div></div></div></div></body></html>
\ No newline at end of file diff --git a/doc/SysCheck/Usage.html b/doc/SysCheck/Usage.html index 8a34826..4ce5080 100644 --- a/doc/SysCheck/Usage.html +++ b/doc/SysCheck/Usage.html @@ -116,5 +116,5 @@ Template argument size: 0/2097152 bytes Expensive parser function count: 0/100 --> -<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20130626113929 --> +<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20130627150848 --> </div></div></div></div></div></body></html>
\ No newline at end of file |