path: root/compilerplugins/clang/store
AgeCommit message (Collapse)AuthorFilesLines
2021-05-10rename to remove the gtk3 prefixCaolán McNamara1-1/+1
Change-Id: I219798ed42aff11d09fd45c26ca1a018c2d22c08 Reviewed-on: Tested-by: Jenkins Reviewed-by: Caolán McNamara <>
2021-04-27loplugin:moveoptNoel Grandin1-0/+161
An attempt that did not find anything convincing enough to finish it up and make it permanently active. So just leave it in /store for now. Change-Id: I1750e177655a4a510da100f880ba81bf762be277 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2020-11-22tdf#123936 Formatting files in module compilerplugins with clang-formatPhilipp Hofer2-14/+14
Change-Id: Ie6e23d3d2a20849e47d048b439d72fd7376c53db Reviewed-on: Tested-by: Jenkins Reviewed-by: Christian Lohmaier <>
2020-11-06retire the stringbuffer lopluginNoel1-0/+76
the best code is now the opposite of what this plugin recommends Change-Id: I88c04200c73a9bae07ef8fcf6ba5f1d9e4927709 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2020-09-12Replace remaining uses of sal_CharJulien Nabet2-4/+2
+ remove sal_Char check on compilerplugins Change-Id: I0f7da14e620f0c3d031d038aa8345ba4080fb3e9 Change-Id: Ia6dba4f27b47bc9e0c89159182ad80a5aee17166 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2020-07-10replace usage of whitelist with allowlistThorsten Behrens1-38/+38
Background and motivation: [API CHANGE] officecfg::Office::Common::Misc::OpenCLWhiteList -> OpenCLAllowList Change-Id: I65636b19b13e4af1e4851f70e78053f3443d6bb1 Reviewed-on: Tested-by: Thorsten Behrens <> Reviewed-by: Thorsten Behrens <>
2020-02-21Drop o3tl::optional wrapperStephan Bergmann1-1/+1 that macOS builds are guaranteed to have std::optional since 358146bbbd1b9775c12770fb5e497b6ec5adfc51 "Bump macOS build baseline to Xcode 11.3 and macOS 10.14.4". The change is done mostly mechanically with > for i in $(git grep -Fl optional); do > sed -i -e 's:<o3tl/optional\.hxx>\|\"o3tl/optional\.hxx\":<optional>:' \ > -e 's/\<o3tl::optional\>/std::optional/g' \ > -e 's/\<o3tl::make_optional\>/std::make_optional/g' "$i" > done > for i in $(git grep -Flw o3tl::nullopt); do > sed -i -e 's/\<o3tl::nullopt\>/std::nullopt/g' "$i" > done (though that causes some of the resulting #include <optional> to appear at different places relative to other includes than if they had been added manually), plus a few manual modifications: * adapt bin/find-unneeded-includes * adapt desktop/IwyuFilter_desktop.yaml * remove include/o3tl/optional.hxx * quote resulting "<"/">" as "&lt;"/"&gt;" in officecfg/registry/cppheader.xsl * and then solenv/clang-format/reformat-formatted-files Change-Id: I68833d9f7945e57aa2bc703349cbc5a56b342273 Reviewed-on: Tested-by: Jenkins Reviewed-by: Stephan Bergmann <>
2020-02-03make some headers privateCaolán McNamara1-1/+1
as shown with ./bin/ Change-Id: I7662417e76fe00c0fc352957560e104b6c2a3d61 Reviewed-on: Tested-by: Jenkins Reviewed-by: Caolán McNamara <>
2020-01-30new (but unused) refassign lopluginNoel Grandin1-0/+152
which I wrote to check if there were any other cases where assigning to a ref local var looks dodgy, after my fixes in 0b113d6ebbaf923e11ba576bed2691bb68e95ae6, but I didn't find anything, so just leave this one in store Change-Id: Ib820924c5e8aa85206730afeb06972ef48231ec5
2019-12-01Introduce o3tl::optional as an alias for std::optionalStephan Bergmann1-1/+1
...with a boost::optional fallback for Xcode < 10 (as std::optional is only available starting with Xcode 10 according to <>, and our baseline for iOS and macOS is still Xcode 9.3 according to And mechanically rewrite all code to use o3tl::optional instead of boost::optional. One immediate benefit is that disabling -Wmaybe-uninitialized for GCC as per fed7c3deb3f4ec81f78967c2d7f3c4554398cb9d "Slience bogus -Werror=maybe-uninitialized" should no longer be necessary (and whose check happened to no longer trigger for GCC 10 trunk, even though that compiler would still emit bogus -Wmaybe-uninitialized for uses of boost::optional under --enable-optimized, which made me ponder whether this switch from boost::optional to std::optional would be a useful thing to do; I keep that check for now, though, and will only remove it in a follow up commit). Another longer-term benefit is that the code is now already in good shape for an eventual switch to std::optional (a switch we would have done anyway once we no longer need to support Xcode < 10). Only desktop/qa/desktop_lib/test_desktop_lib.cxx heavily uses boost::property_tree::ptree::get_child_optional returning boost::optional, so let it keep using boost::optional for now. After a number of preceding commits have paved the way for this change, this commit is completely mechanical, done with > git ls-files -z | grep -vz -e '^bin/find-unneeded-includes$' -e '^$' -e '^desktop/qa/desktop_lib/test_desktop_lib.cxx$' -e '^dictionaries$' -e '^external/' -e '^helpcontent2$' -e '^include/IwyuFilter_include.yaml$' -e '^sc/IwyuFilter_sc.yaml$' -e '^solenv/gdb/boost/$' -e '^solenv/vs/LibreOffice.natvis$' -e '^translations$' -e '\.svg$' | xargs -0 sed -i -E -e 's|\<boost(/optional)?/optional\.hpp\>|o3tl/optional.hxx|g' -e 's/\<boost(\s*)::(\s*)(make_)?optional\>/o3tl\1::\2\3optional/g' -e 's/\<boost(\s*)::(\s*)none\>/o3tl\1::\2nullopt/g' (before committing include/o3tl/optional.hxx, and relying on some GNU features). It excludes some files where mention of boost::optional et al should apparently not be changed (and the sub-repo directory stubs). It turned out that all uses of boost::none across the code base were in combination with boost::optional, so had all to be rewritten as o3tl::nullopt. Change-Id: Ibfd9f4b3d5a8aee6e6eed310b988c4e5ffd8b11b Reviewed-on: Tested-by: Jenkins Reviewed-by: Stephan Bergmann <>
2019-10-08better name for a function in compilerpluginsLuboš Luňák8-8/+8
The function is not just about a spelling location. Change-Id: I96e9e9ef7e27a9763397b4b86473c1c30d0e3eeb Reviewed-on: Tested-by: Jenkins Reviewed-by: Luboš Luňák <>
2019-10-07do not use compiler.getSourceManager().getFilename()Luboš Luňák8-8/+8
This is a continuation of ff002524c12471668e63837a804b6006f9136a34. When compiling with icecream, its -frewrite-includes merges all #include's into one .cxx file and marks them with with line markers. But SourceManager::getFilename() doesn't take those into account and so it reports all of those as <stdin>. So use getFileNameOfSpellingLoc(), which explicitly handles this case. And we should probably never ever use SourceManager::getFilename(). Change-Id: Ia194c2e041578e1e199aee2df2f885922ef7e31a Reviewed-on: Tested-by: Jenkins Reviewed-by: Luboš Luňák <>
2019-09-29constmethod for accessor-type methodsNoel Grandin1-523/+0
Apply the constmethod plugin, but only to accessor-type methods, e.g. IsFoo(), GetBar(), etc, where we can be sure of that constifying is a reasonable thing to do. Change-Id: Ibc97f5f359a0992dd1ce2d66f0189f8a0a43d98a Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2019-09-06Fixing "...."Andrea Gelmini1-1/+1
Change-Id: Id005a7531d546dd43de13b49bcb3e93081c5ad8d Reviewed-on: Tested-by: Jenkins Reviewed-by: Julien Nabet <>
2019-09-01Fix '..'Andrea Gelmini1-1/+1
To complete this: This is a massive replace for lines ending with ".." instead of "..." It passed "make check" on Linux. Change-Id: I07fa7b2e30ba9ea17a1f9a5e21c57216ba958efe Reviewed-on: Reviewed-by: Julien Nabet <> Tested-by: Jenkins
2019-07-23resurrect and improve loplugin:referencecastingNoel Grandin2-228/+0
Improve the plugin to avoid generating false+ with the special case of querying XInterface (what the code calls normalisation). Also ignore places where the querying is dealing with ambiguous base classes. Change-Id: I23b2b2fa6618328fafc4707b94c26582a462ea87 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2019-05-05Fix typoAndrea Gelmini2-2/+2
Change-Id: I87fa75d2aab64031426ce0560344908bd81d413c Reviewed-on: Reviewed-by: Julien Nabet <> Tested-by: Julien Nabet <>
2019-04-28Fix typoAndrea Gelmini1-1/+1
Change-Id: Id6985abca7702039168381082da4e47603b9aaf3 Reviewed-on: Tested-by: Jenkins Reviewed-by: Julien Nabet <>
2019-04-28Fix typoAndrea Gelmini1-1/+1
Change-Id: I8c928576919c9410eda0a7f33b2120d13c3bc6bf Reviewed-on: Tested-by: Jenkins Reviewed-by: Julien Nabet <>
2019-04-26There is no ImplSVMainHook()Tor Lillqvist1-4/+0
Change-Id: Ief2636425712f60cfc6e8f68ee0d3fb01608d8ba Reviewed-on: Tested-by: Jenkins Reviewed-by: Tor Lillqvist <>
2019-04-26Fix typoAndrea Gelmini1-1/+1
Change-Id: Ie687feebfccf27c366922acfc29ff12cdfa325ba Reviewed-on: Reviewed-by: Julien Nabet <> Tested-by: Julien Nabet <>
2019-03-24Resolves: tdf#122114 remove support for ~/.recently-used fileArkadiy Illarionov1-4/+0
Change-Id: Ie91f0bf21e6f5c3f7a7aa4ae3d1dff6cc8e15a86 Reviewed-on: Tested-by: Jenkins Reviewed-by: Stephan Bergmann <>
2019-03-12make (some) clang plugins share the same RecursiveASTVisitorLuboš Luňák3-3/+3
Each plugin currently uses its own recursive AST run, which adds up. This patch adds another shared plugin which internally contains all (suitable) plugins and dispatches to them from the same one recursive run. This patch converts ~25 plugins and for starmath's accessibility.cxx reduces clang build time from 5.43s to 5.14s (and it's 4.39s without any plugins). As there are almost 50 more plugins to go, this can theoretically result in 4.56s final time, although probably not all plugins can be that easily converted, if at all. This mostly requires very little change in many plugins (see e.g. BadStatics), some even work without any functionality change (e.g. CharRightShift). Traverse* calls require some changes but are often not that difficult. WalkUp* probably can't be supported, although some plugins can(?) possibly be adjusted to not rely on them. And of course some plugins can be left as they are, using their own recursive run. See description at the top of generator.cxx for description of how to convert a plugin. The sharedvisitor.cxx source is generated based on scanning relevant plugin sources using a clang-based scanner/generator. The generated source is intentionally included instead of getting always generated, as the generating currently takes some time, so it should get updated in git whenever a change in a plugin triggers a source change in it. Change-Id: Ia0d2e3a5a464659503dbb4ed6c20b6cc89b4de01 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <> Reviewed-by: Luboš Luňák <>
2018-12-02loplugin:intvsfloat get this working reliablyNoel Grandin1-109/+0
Change-Id: Ifdf1a152f6bc2e2f6edae97a5191120f630f7e49 Reviewed-on: Tested-by: Jenkins Reviewed-by: Mike Kaganski <> Reviewed-by: Noel Grandin <>
2018-08-23filter out AST in more pluginsNoel Grandin8-16/+15
I seem to have missed quite a few in commit 9f4d23c15115d64febd6bf01f870cc157badd350 filter out some of the AST in the plugins This nets me another 14% improvement Change-Id: I39b980b49ced560f768045dbedd3ddfef29306c1 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2018-08-18new loplugin intvsfloatNoel Grandin1-0/+109
This was a good idea from mike kaganski as a consequence of Unfortunately, clang/llvm is not yet up to the job of doing floating point evaluation, I get tons of crashes all over the evaluate infrastruction inside clang, so this will need to wait until clang's code matures. So park it in store for now Change-Id: I5ba4de8323e462b4fd4db301e4d116a81fd56ed3 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2018-08-14filter out some of the AST in the pluginsNoel Grandin32-64/+46
by checking if the current namespace decl is in our code, so we have to scan less stuff, which results in a 10% perf improvement for me Change-Id: Idf0e30d57b6d0dcd13daa9ed679c28b9d233d387 Reviewed-on: Tested-by: Jenkins Reviewed-by: Noel Grandin <>
2018-07-03Adapt compilerplugins/clang/store/deletedspecial.cxxStephan Bergmann1-1/+0 322083e0cf1268bc5d40f0d49eb50f00f503ef15 "ScFormEditData copy functions can be deleted" Change-Id: Ic62c83b79e70a79d1d236b79140009a4212b6a43 Reviewed-on: Tested-by: Jenkins Reviewed-by: Stephan Bergmann <>
2018-05-18Replace SVGFilter using SVGIOArmin Le Grand1-4/+0
Target of this change is to get rid of the SVGFilter in current LO which is based on the standard-ODF importer using it's functionality by passing in/handing over temporary created XML-Stream-Data. First step is to alternatively import the given SVG file to a newly created Document and to strip the existing Filter-Code. Adding the first prototype of the changed import. It is capable of importing the given SVG to the created Draw/Impress document. It adds the SVG which gets imported by SVGIO as GraphicObject. It adapts sizes and positions of Page and GraphicObject to have a smooth import. Adding stripping of SVGFilter and used ressources. Done as deep as possible, hopefully all places found. Adapted now to create an Impress document. Also added needed adaptions to PageSize(s), including layout and PresObj stuff to make all MasterPages/LayoutPages work correctly. Added reaction on empty SVG. This is needed since the PageSize is adapted to the Graphic. With empty Graphic a Size(0,0) results and this goes wrong. Change-Id: Ia364a5783bee7dadcbe91e700efbabc121cf98f9 Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Armin Le Grand <>
2018-03-11weld color pickerCaolán McNamara1-2/+0
Change-Id: I487b9a0cc13b2b60a0f1e28667773b5d3b5c66cc Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Caolán McNamara <> Tested-by: Caolán McNamara <>
2018-02-19Remove now unused libgetuid.somichael.weghorn1-5/+0
Some scripts in which it was used have been removed (commit e1082e45361a92a31adedcc3ed0a35c704bca543) and the more reliable 'fakeroot' is now in use at all other places where was previously used (s. tdf#115554). Change-Id: I638e96e5c8d671e3b145b79f33de718fe34ea514 Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Michael Stahl <>
2017-12-19Bump --enable-compiler-plugins to Clang 3.8.0Stephan Bergmann2-4/+2
<> "Clang baseline bump" Change-Id: I18fca8794ea34118fc6308458064d0c28cf5caf7 Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Stephan Bergmann <>
2017-12-19remove unused typedefsNoel Grandin1-1/+0
Change-Id: I6fd7a9fed3a80c91a3766fceefd43c5db0aa5275 Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Noel Grandin <>
2017-11-30Move loplugin:fpcomparison to store/Stephan Bergmann1-0/+388
...after bc4e8de8eea1ccebda479c8e2db2f3c6dfff60d2 "Silence new loplugin:fpcomparison for now": > Nov 30 08:33:16 <sberg> noelgrandin, thoughts on whether fpcomparison is actually worth it, seeing the loooooooong blacklist there? > Nov 30 08:34:11 <noelgrandin> sberg, that's wasn't my idea, can't remember who came up with it. vmiklos was that you? > Nov 30 08:34:36 <noelgrandin> sberg, the original commit message was "Find code that compares floating point values with == or != > Nov 30 08:34:36 <noelgrandin> It should rather use rtl::math::approxEqual" > Nov 30 08:34:45 <noelgrandin> so in theory the replacement should be fairly manual > Nov 30 08:34:48 <vmiklos> i don't think so :) > Nov 30 08:35:15 <noelgrandin> might have been moggi, but he's not around so.... just disable it > Nov 30 08:36:19 <sberg> noelgrandin, yeah, in theory; in practice, I guess there's also cases where x==1.0 is what you want exactly (given x tends not to be a computed value after all, but some literal that's being passed around) > Nov 30 08:36:33 <sberg> noelgrandin, yeah, I'll disable it then Change-Id: I35f5328efa0ec02d9be837c12efab2b03a3dae52 Reviewed-on: Reviewed-by: Stephan Bergmann <> Tested-by: Stephan Bergmann <>
2017-10-30new loplugin: constmethodNoel Grandin1-0/+523
parked in store/ for now, because, as I worked my way up the layers of modules, the higher I got, the more false+ I got when trying to only make changes that preserved logical-constness. Change-Id: I4acd2c4416775f7c6a3d91eb0bce048630ccaff5
2017-10-18loplugin:manualrefcountNoel Grandin1-0/+323
this is the code I used to find naked acquire/release stuff No need to run it all the time, so leave it in store Change-Id: I9ac4a6f5db7cd4cbb1b63698340425eed7cb8713
2017-10-09Move loplugin:bodynotinblock to store/, to improve performanceStephan Bergmann2-0/+187 it was the last remaining enabled-by-default plugin that calls expensive parentStmt. It isn't immediately clear to me how to rewrite the plugin to not call that, but a superset of this plugin's warnings are now also emitted by GCC 6 -Wmisleading-indentation. Change-Id: Ifa55cb14f6763594fe48926585df29d4d30355df
2017-09-25Fix typosAndrea Gelmini2-2/+2
Change-Id: I879a52820d78d9151ef64dd21612379f617f66e2 Reviewed-on: Reviewed-by: Tamás Zolnai <> Tested-by: Tamás Zolnai <>
2017-08-16move deadclass plugin to storeNoel Grandin2-0/+83
<sberg> noelgrandin, and is loplugin:deadclass even sound? struct B { B(B const &) {} }; struct D: B { D(): B(*this) {} }; Change-Id: Idadd379b925aa6f9de6c625bffa8560ec4192ac7
2017-06-26update constantfunction lopluginNoel Grandin1-0/+24
didn't find anything useful, so just updating the exclusion lists Change-Id: I66d37aee185290f454e5ac0baeafd1f67bfaf106 Reviewed-on: Reviewed-by: Noel Grandin <> Tested-by: Noel Grandin <>
2017-06-20improve oncevar lopluginNoel Grandin1-166/+0
we look for any kind of scalar variable now that deserves to be inlined, and we check for variables that cannot be inlined because they are being passed by reference, or modified, or have their address taken Change-Id: Ia744a180e91d1516140a1555d4514f6fa4de1c0b Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Noel Grandin <>
2017-06-19Make SfxItemSet ranges correct by construction: Fix static casesStephan Bergmann1-0/+157
...with the aid of an extended compilerplugins/clang/store/sfxitemsetrewrite.cxx (which in turn needed a small addition to compilerplugins/clang/check.hxx). Enable svl::detail::validGap check for the static case, but keep it disabled for now for the dynamic case. Change-Id: I4846ba8e99aff94a86518e2cb5044e575093386e
2017-06-16Make SfxItemSet ranges correct by constructionStephan Bergmann1-0/+262
This is a follow-up to 45a7f5b62d0b1b21763c1c94255ef2309ea4280b "Keep WID ranges sorted, and join adjacent ones". While SfxItemSet::MergeRange relies on the m_pWhichRanges being sorted (and, under DBG_UTIL, asserts if they are not), the various SfxItemSet constructors curiously only check (via assert or DBG_ASSERT) that each individual range has an upper bound not smaller than its lower bound. Arguably, all SfxItemSet instances should fulfill the stronger guarantees required and checked by MergeRange. And in many cases the ranges are statically known, so that the checking can happen at compile time. Therefore, replace the two SfxItemSet ctors taking explicit ranges with two other ctors that actually do proper checking. The (templated) overload taking an svl::Items struct should be used in all cases where the range values are statically known at compile time, while the overload taking a std::initializer_list<Pair> is for the remaining cases (that can only do runtime checking via assert). Most of those latter cases are simple cases with a single range covering a single item, but a few are more complex. (At least some of the uses of the existing SfxItemSet overload taking a const sal_uInt16* pWhichPairTable can probably also be strengthened, but that is left for another day.) This commit is the first in a series of two. Apart from the manual changes to compilerplugins/clang/store/sfxitemsetrewrite.cxx, include/svl/itemset.hxx, and svl/source/items/itemset.cxx, it only consists of automatic rewriting of the relevant SfxItemSet ctor calls (plus a few required manual fixes, see next). But it does not yet check that the individual ranges are properly sorted (see the TODO in svl::detail::validGap). That check will be enabled, and the ensuing manual fixes will be made in a follow-up commit, to reduce the likelyhood of accidents. There were three cases of necessary manual intervention: * sw/source/core/unocore/unostyle.cxx uses eAtr of enum type RES_FRMATR in braced-init-list syntax now, so needs explicit narrowing conversion to sal_uInt16. * In sw/source/uibase/uiview/formatclipboard.cxx, the trailiing comma in the definition of macro FORMAT_PAINTBRUSH_FRAME_IDS needed to be removed manually. * In svx/source/svdraw/svdoashp.cxx, svx/source/svdraw/svdotext.cxx, sw/source/uibase/app/docstyle.cxx, sw/source/uibase/shells/frmsh.cxx, sw/source/uibase/shells/grfsh.cxx, and sw/source/uibase/shells/textsh1.cxx, some comments had to be put back (see "TODO: the replaced range can contain relevant comments" in compilerplugins/clang/store/sfxitemsetrewrite.cxx). A few uses of the variadic form erroneously used nullptr instead of 0 for termination. But this should have been harmless even if promoted std::nullptr_t is larger than promoted sal_uInt16, assuming that the part of the nullptr value that was interpreted as sal_uInt16/promoted int was all-zero bits. Similarly, some uses made the harmless error of using 0L instead of 0. Change-Id: I2afea97282803cb311b9321a99bb627520ef5e35 Reviewed-on: Reviewed-by: Stephan Bergmann <> Tested-by: Stephan Bergmann <>
2017-05-05sc: Remove some dead slotsMaxim Monastirsky1-8/+0
Change-Id: I92cfd5043c084d64fdfba3a1df817ee035388797
2017-04-25tools: svstream.hxx needs only errcode.hxx & not errinf.hxxChris Sherlock2-0/+2
Change-Id: Ia28e35ae5af4f601e9a586a3deffbcd61702b0ca Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Chris Sherlock <>
2017-03-28fixes for some lopluginsNoel Grandin2-1/+11
ran the ones in store/ just for fun, but didn't find anything useful Change-Id: I2bb251e8d99b5d88e11b2ca74e99672d75f0a1fd
2017-02-01loplugin: use TypeCheck instead of getQualifiedNameAsStringNoel Grandin1-3/+3
since the latter is rather slow Change-Id: Ib73cdb923585580777c2265b561c1808e93b2baa Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Noel Grandin <>
2016-12-22Generalize vector/deque ctor checks to work with MSVCRTStephan Bergmann1-4/+5
Change-Id: I2d493a36b8c2e3abe69964c04b46f08d67ef8a48
2016-11-08loplugin:oncevarNoel Grandin1-60/+81
Change-Id: I44fb6858eeff14fcbd9fdfbbb0aabd1433b6a27d Reviewed-on: Tested-by: Jenkins <> Reviewed-by: Noel Grandin <>
2016-11-04move loplugin:defaultparams to store/Eike Rathke1-0/+128
As per IRC 2016-11-04 12:21 Change-Id: Ic4cc7f67fb31be80a966c652cb30bb859f874a8b