aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2018-08-02Merge #13851: fix locale for lint-shellMarcoFalke
83c48d9a1f fix locale for lint-shell (Julian Fleischer) Pull request description: A piece of code from https://github.com/bitcoin/bitcoin/pull/13816 which I am hereby splitting into smaller PRs. The `shellcheck` executable shipped with travis's trusty linux environment (contains shellcheck `0.3.1` in `/usr/local/bin` as opposed to the distros `0.3.3` in `/usr/bin`) segfaults when `LC_ALL=C`. This makes sure that in travis, no matter from where the script is called, `LC_ALL` is left unset. Comment changed accordingly. Tree-SHA512: 86afa9247f2adbeefa75bf3d56a94766f8e8e1839f40b73763ff7b893a09c848ee64648fc06ce3e6bd0f650127365f508b37fdefb48d61e49f5d551c074cb16e
2018-08-02fix locale for lint-shellJulian Fleischer
2018-08-02Merge #13837: qa: Extract rpc_timewait as test paramWladimir J. van der Laan
fa5b440971a0dfdd64c1b86748a573fcd7dc65d3 qa: Extract rpc_timewait as test param (MarcoFalke) Pull request description: Also increase it for wallet_dump and wallet_groups Tree-SHA512: 7367bc584228bda3010c453713a1505c54a8ef3d116be47dab9934d30594089dfeb27ffa862f7517fd0ec8b5dc07f4904d67ef2a53dd284cbe2a58982e410e2b
2018-08-02gui: Pull initial 017x translations from transifexWladimir J. van der Laan
Tree-SHA512: 4372a0602587e2bfceae69e3c90726c5d4a9d34a934dac9d000a9611fa7fca51e9d0fbacaee60decbea09294e53f94259ddcef2b3f876fefa1fd9f8a4dc25188
2018-08-02tx: Update transifex slug 016x→017xWladimir J. van der Laan
Make sure translations are pulled from the correct resource. Tree-SHA512: 5e65e6b04e0bbead9f7850071abc562f290e07935d9db155c6c423bc0de26756c70b1fc375f58d8ba5a258bd1770aefd3cd95f5c7bb9aafb0de76f7fcc1843ae
2018-08-02Merge #13791: gui: Reject dialogs if key escape is pressedWladimir J. van der Laan
7bf22bf0c21d13557ec46a67413819ebcabc3df0 gui: Reject options dialog when key escape is pressed (João Barbosa) 4a43306a4f643cf0d356d5d5e16913541f1bc893 gui: Reject edit address dialog when key escape is pressed (João Barbosa) f7a553177d4b969956bc04a0140fce34958971f5 gui: Add GUIUtil::ItemDelegate with keyEscapePressed signal (João Barbosa) Pull request description: Currently `EditAddressDialog` and `OptionsDialog` don't close when the escape key is pressed. The `QDataWidgetMapper` instances prevents closing the dialogs because the escape key is used to reset the widgets values. More details and workarounds in https://stackoverflow.com/a/51487847 and http://qtramblings.blogspot.com/2010/10/qdatawidgetmapper-annoyances.html. The adopted solution is different from the above references. It turns out that `QDataWidgetMapper::setItemDelegate` sets the event filter for all mapped widgets. So in this PR the mapper's delegate are changed to a custom `GUIUtil::ItemDelegate` that offers the signal `keyEscapePressed`, which is connected to the `QDialog::reject` slot. Note that the installed event filter lets all events pass, so the current behaviour isn't changed, meaning that widgets values are reset in addition to closing the dialog. Tree-SHA512: 9c961d488480b4ccc3880a11a8f1824b65f77570ee8918c7302c62775a1a73e52ae988a31a55ffff87b4170ddbecf833c2f09b66095c00eb6854a4d43f030f1f
2018-08-02Merge #13811: travis: Run bench_bitcoin onceWladimir J. van der Laan
fa7a3a1783cd81907779392f626bdcca5e10efb1 travis: Run bench_bitcoin once (MarcoFalke) Pull request description: The bench should be run once just to make sure it doesn't crash or hit assertions. Closes: #13810 Tree-SHA512: f34038c47535fb5cbd32b5eadd3ae84c294b2dc84c9d3bf3ccbbfb88a927b76f044ed24fb26f51a10d21341916c9dd0cdc98fab9d908cb90333c8ea7d4d4f620
2018-08-02Merge #13844: doc: correct the help output for -pruneWladimir J. van der Laan
312ff01ee533fab68348283200eb57e9956fdb34 -prune option -help output aligned with code (Hennadii Stepanov) Pull request description: The -help output for -prune is aligned with the code. In the code (.../src/init.cpp#L1063): ``` if (nPruneTarget < MIN_DISK_SPACE_FOR_BLOCK_FILES) { return InitError(strprintf(_("Prune configured below the minimum of %d MiB. Please use a higher number."), MIN_DISK_SPACE_FOR_BLOCK_FILES / 1024 / 1024)); } ``` So correct value of nPruneTarget is **greater than or equal to** MIN_DISK_SPACE_FOR_BLOCK_FILES. Tree-SHA512: 8e55aa99c8f5a9d020677b0f1b016215e2dbda5fa4ee7c8504b12a3abef226bc21beca118fa332c0bf206a4aff913a5a717b55bb5b2ecdba38423e9c0161209e
2018-08-02Merge #13824: doc: Remove outdated net commentWladimir J. van der Laan
fa365021bbb4c0865e6655100c1cbf85e2b3c7fa doc: Remove outdated net comment (MarcoFalke) Pull request description: `mapAddresses` and the corresponding "critsect" has been removed in 5fee401fe14aa6459428a26a82f764db70a6a0b9 more than 6 years ago. Now is probably a good time to remove this confusing comment. Tree-SHA512: 498a403d5703da395c18a7ebb776aa6e693e59fe43a839fefd261e0a5af58621763813979d4cfbd8d1728ce73b325b82002e393cde79bdbff33e0fbf68ab6747
2018-08-02Merge #13835: [trivial,doc] Fix memory consistency model in commentWladimir J. van der Laan
fe7180c5b2c37313722b8d21c33eec6ff011f26d [trivial,doc] Fix memory consistency model in comment (Jesse Cohen) Pull request description: Updating a comment overlooked during review in #13247 Tree-SHA512: 0bd54ba1c265fdd77fd6e12ad0be46dd422348f7d926ce9abaca53fdb3a3c55c0d1cd90b4382321352076f4a81e2249c0014cd789f47a3637cb93bd983cb4657
2018-08-02-prune option -help output aligned with codeHennadii Stepanov
see: .../src/init.cpp#L1063
2018-08-01qa: Extract rpc_timewait as test paramMarcoFalke
Also increase it for wallet_dump and wallet_groups
2018-08-01Merge #13697: Support output descriptors in scantxoutsetWladimir J. van der Laan
f6b7fc349ccf9cfbeb7e91e19c20e2a2fcc9026f Support h instead of ' in hardened descriptor paths (Pieter Wuille) fddea672eb8f63012f2e9ce04fa477e5d4140750 Add experimental warning to scantxoutset (Jonas Schnelli) 6495849bfd362d6a2f128bac5982fa9e3e2e3396 [QA] Extend tests to more combinations (Pieter Wuille) 1af237faefc316bd708e25d6901ee6f17b706e57 [QA] Add xpub range tests in scantxoutset tests (Jonas Schnelli) 151600bb4972f7bab4ed4a03d1f67c38e081fefe Swap in descriptors support into scantxoutset (Pieter Wuille) 0652c3284fe12941b28624dbbf5e0862c5d0dbc3 Descriptor tests (Pieter Wuille) fe8a7dcd78cfeedc9a7c705e91384f793822912b Output descriptors module (Pieter Wuille) e54d76044b3a2c625e53f2116c5f6a7c40105d5d Add simple FlatSigningProvider (Pieter Wuille) 29943a904a11607787d28b1f4288f500bd076dde Add more methods to Span class (Pieter Wuille) Pull request description: As promised, here is an implementation of my output descriptor concept (https://gist.github.com/sipa/e3d23d498c430bb601c5bca83523fa82) and integration within the `scantxoutset` RPC that was just added through #12196. It changes the RPC to use descriptors for everything; I hope the interface is simple enough to encompass all use cases. It includes support for P2PK, P2PKH, P2WPKH, P2SH, P2WSH, multisig, xpubs, xprvs, and chains of keys - combined in every possible way. Tree-SHA512: 63b54a96e7a72f5b04a8d645b8517d43ecd6a65a41f9f4e593931ce725a8845ab0baa1e9db6a7243190d8ac841f6e7e2f520d98c539312d78f7fd687d2c7b88f
2018-08-01[trivial,doc] Fix memory consistency model in commentJesse Cohen
2018-08-01Merge #13805: [wallet] Correctly limit output group sizeMarcoFalke
a13647b8bd [qa] Add test for too-large wallet output groups (Suhas Daftuar) 57ec1c97b2 [wallet] correctly limit output group size (Suhas Daftuar) Pull request description: Also add a test to ensure that output groups are being limited, even if a wallet has many outputs corresponding to the same scriptPubKey (the test fails without the first commit). Tree-SHA512: 2aaa82005b0910488f5cbf40690d4c5e2f46949e299ef70b4cb6e440713811443d411dcbc6d71b1701fd82423073125e21747787d70830cd021c841afb732d51
2018-08-01travis: Run bench_bitcoin onceMarcoFalke
2018-07-31Merge #13247: Add tests to SingleThreadedSchedulerClient() and document the ↵MarcoFalke
memory model cbeaa91dbb Update ValidationInterface() documentation to explicitly specify threading and memory model (Jesse Cohen) b296b425a7 Update documentation for SingleThreadedSchedulerClient() to specify the memory model (Jesse Cohen) 9994d01d8b Add Unit Test for SingleThreadedSchedulerClient (Jesse Cohen) Pull request description: As discussed in #13023 I've split this test out into a separate pr This test (and documentation update) makes explicit the guarantee (previously undefined, but implied by the 'SingleThreaded' in `SingleThreadedSchedulerClient()`) - that callbacks pushed to the `SingleThreadedSchedulerClient()` obey the single threaded model for memory and execution - specifically, the callbacks are executed fully and in order, and even in cases where a subsequent callback is executed by a different thread, sequential consistency of memory for all threads executing these callbacks is maintained. Maintaining memory consistency should make the api more developer friendly - especially for users of the validationinterface. To the extent that there are performance implications from this decision, these are not currently present in practice because all use of this scheduler happens on a single thread currently, furthermore the lock should guarantee consistency across callback executions even when callbacks are executed by multiple threads (as the test does). Tree-SHA512: 5d95a7682c402e5ad76b05bc9dfbca99ca64105f62ab9e78f6fc0f6ea8c5277aa399fbb94298e35cc677b0c2181ff17259584bb7ae230e38aa68b85ecbc22856
2018-07-31doc: Remove outdated net commentMarcoFalke
2018-07-31Merge #13822: bench: Make CoinSelection output groups pass eligibility filterMarcoFalke
494634a052 bench: Make CoinSelection output groups pass eligibility filter (Andrew Chow) Pull request description: Set the depth of the output groups used in the CoinSelection benchmark to be 6 in order to pass the eligibility filter for the benchmark. Fixes #13813 Tree-SHA512: 55fc6aeda0127f5e155efb982aec211b70dfd3257808dce627886af6866ffa25de4df3c9b10f8c45b6c298a42542c54654f36e59efb208e9055885361f0e501c
2018-07-31Merge #13776: net: Add missing verification of IPv6 address in ↵Wladimir J. van der Laan
CNetAddr::GetIn6Addr(...) 2fb0066b9932f3725a5a0533530453c6da4010ce net: Add missing verification of IPv6 address in CNetAddr::GetIn6Addr(...) (practicalswift) Pull request description: Add missing verification of IPv6 address in `CNetAddr::GetIn6Addr(...)`. Tree-SHA512: 8b0681252eec9cf293a2043e99fdacec520e321b477d8aca1cbd6327b85bf6c5e8cd820fb914f097c62655947e88745ebccd824a78b995a8186e910e6fe520aa
2018-07-31bench: Make CoinSelection output groups pass eligibility filterAndrew Chow
Set the depth of the output groups used in the CoinSelection benchmark to be 6 in order to pass the eligibility filter for the benchmark.
2018-07-31Merge #13799: Ignore unknown config file options; warn instead of errorMarcoFalke
247d5740d2 Ignore unknown config file options for now (Pieter Wuille) 04ce0d88ca Report when unknown config file options are ignored (Pieter Wuille) Pull request description: As reported by @satwo on IRC a few days ago, the current mechanism of treating unknown config file options as errors is problematic for options like `-rpcclienttimeout` which aren't defined for `bitcoind`. A full solution would be to either make all binaries be aware of each other's options, or to permit config file options that only apply to specific binaries (`bitcoind`, `bitcoin-qt`, `bitcoin-cli`). Both of these seem too invasive to introduce for 0.17. As a compromise, this PR makes it ignores those options, but still warn about it in the log file. Tree-SHA512: dfddc771b91df3031a9c98d9f3292f8f4fcd1b97ebb7317b2f457e12d9f205dc63f42721302e7258dbb53f273d7cc041a65a0a9120972769555784e1f1cc9aef
2018-07-31Merge #13809: contrib: Remove debian and rpm subfolderMarcoFalke
fa0e1e2f63 contrib: Remove debian and rpm subfolders (MarcoFalke) Pull request description: The folders are now located here: * https://github.com/bitcoin-core/packaging/tree/master/debian * https://github.com/bitcoin-core/packaging/tree/master/rpm Note that I kept the copyright file, so that it can be updated for our purposes in the commit that adds new files. Tree-SHA512: 4c919e8e04cdcc56f2c4c16e83c68d5ec74b7e4438ca54222a37f85cf604b77880393d1a0004f16f270ab04ee00b2060129c5c2e0b34815679940f1c3b5754f3
2018-07-31Merge #13794: chainparams: Update with data from assumed valid chainWladimir J. van der Laan
fa8f2d826c7ed90c164cfc039d97ce2fa95d1914 doc: Fix chainTxData comment (MarcoFalke) fa6094f1529ccb8068db06c63a0fecebb3f82583 chainparams: Update with data from assumed valid chain (MarcoFalke) Pull request description: Can be reviewed by using the `getblock` and `getchaintxstats` rpcs of a synced node. Reviewers get extra points when their full node has checkpoints and assumevalid disabled. Tree-SHA512: cedd61fde129ae4c16fc12275b61e4c5659b6d72dd801c608efc294188561bc986d94652fe9bea71ada48654258e2a074d2d2da78036c69608ccff3a6cc1ccf5
2018-07-30Ignore unknown config file options for nowPieter Wuille
2018-07-30Update ValidationInterface() documentation to explicitly specify threading ↵Jesse Cohen
and memory model
2018-07-30Update documentation for SingleThreadedSchedulerClient() to specify the ↵Jesse Cohen
memory model
2018-07-30gui: Reject options dialog when key escape is pressedJoão Barbosa
2018-07-30gui: Reject edit address dialog when key escape is pressedJoão Barbosa
2018-07-30gui: Add GUIUtil::ItemDelegate with keyEscapePressed signalJoão Barbosa
2018-07-30Merge #13814: Add BIP174 to list of implemented BIPsMarcoFalke
1dbad82f61 Add BIP174 to list of implemented BIPs (Pieter Wuille) Pull request description: Tree-SHA512: 43d605d47ef08f9cf4008d6b25d990ddfa02fa59b1db84d805113609c5339de9e3def6ea39637bbb1c5439a7a1aaeffdb528c345349548777338f9250274ee2f
2018-07-30Add BIP174 to list of implemented BIPsPieter Wuille
2018-07-30Merge #13786: refactor: Avoid locking tx pool cs thriceMarcoFalke
fa5ed4f8d2 refactor: Avoid locking tx pool cs thrice (MarcoFalke) Pull request description: `addUnchecked` is (outside the tests) only called by ATMP, which already takes the tx pool read lock. So locking it twice more in both `addUnchecked` methods seems redundant. Similarly `CalculateMemPoolAncestors` is (beside once in the wallet) only called in contexts, where the tx pool lock is already taken. So remove the lock there as well. Tree-SHA512: fcf603b570da0fc529fe6db8add218663eae52845510732bee0d4611263d2429d3d3c9c8ae68493d67287d13504500ed51905ccbe711eb15a0af3b019edad543
2018-07-30doc: Fix chainTxData commentMarcoFalke
2018-07-30Merge #13779: travis: improve readability of travis.yml and log outputsMarcoFalke
f98146d001 use travis:fold in test script steps (Julian Fleischer) 9730d3af31 make .travis/yml a bit more readable (Julian Fleischer) Pull request description: This PR contains two commits which * make the travis.yml file a bit more readable by splitting the environment variables over lines (it's a little bit more verbose but way easier to compare across forks or visually grasp in the first place), * use `travis:fold` to fold the `autogen`, `configure`, `make`, and so forth, steps. The `END_FOLD` shell function preserves the exit code of the statement right before. Tree-SHA512: 7aff86e72008093f46d6ec7afa735f01e40c18f1efe55867d6ff4039191986c0fa8d4136cd53adb34e29f0f40e30c37d1a83615aea3f8438c20ec3b1c2910295
2018-07-30use travis:fold in test script stepsJulian Fleischer
2018-07-30contrib: Remove debian and rpm subfoldersMarcoFalke
2018-07-30Merge #13782: Fix osslsigncode compile issue in gitian-buildMarcoFalke
284f424d5a Fix osslsigncode compile issue in gitian-build (Chun Kuan Lee) Pull request description: Install libssl1.0-dev that is compatible with osslsigncode. Fixes #13762 Verifed that this gitian descriptor file can sign 0.16.2rc2. Tree-SHA512: 3029b86e77567a4e033b5ad95826e60df12a0486ac3c4afcac48218f5c76ba49e7f1c1307ce93ffc465ca2f24e12c401e4542929263688e4bd6521aeca3ff73b
2018-07-30Merge #13806: qa: Fix bench/block_assemble assert failureMarcoFalke
6f53edb395 Acquire cs_main before ATMP call in block_assemble bench (James O'Beirne) Pull request description: Calling `bench_bitcoin` currently fails due to calling ATMP without acquiring cs_main first in the recently added block_assemble bench (https://github.com/bitcoin/bitcoin/pull/13219). ``` $ cat <(uname -a) <(gcc --version) Linux james 4.4.0-119-generic #143+jamesob SMP Mon Apr 16 21:47:24 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 $ ./src/bench/bench_bitcoin WARNING: This is a debug build - may result in slower benchmarks. # Benchmark, evals, iterations, total, min, max, median Assertion failed: lock cs_main not held in validation.cpp:566; locks held: [1] 19323 abort (core dumped) ./src/bench/bench_bitcoin ``` ``` (gdb) bt #0 0x00007fbdc9cf5428 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:54 #1 0x00007fbdc9cf702a in __GI_abort () at abort.c:89 #2 0x0000555a19580dc5 in AssertLockHeldInternal (pszName=pszName@entry=0x555a19834549 "cs_main", pszFile=pszFile@entry=0x555a1988a001 "validation.cpp", nLine=nLine@entry=566, cs=cs@entry=0x555a19ba55c0 <cs_main>) at sync.cpp:157 #3 0x0000555a194b395f in AcceptToMemoryPoolWorker (chainparams=..., pool=..., state=..., ptx=std::shared_ptr (count 1, weak 0) 0x555a1bb819b0, pfMissingInputs=pfMissingInputs@entry=0x0, nAcceptTime=1532964079, plTxnReplaced=0x0, bypass_limits=false, nAbsurdFee=@0x7ffcbc1719d8: 0, coins_to_uncache=std::vector of length 0, capacity 0, test_accept=false) at validation.cpp:566 #4 0x0000555a194ba661 in AcceptToMemoryPoolWithTime (chainparams=..., pool=..., state=..., tx=std::shared_ptr (count 1, weak 0) 0x555a1bb819b0, pfMissingInputs=pfMissingInputs@entry=0x0, nAcceptTime=<optimized out>, plTxnReplaced=0x0, bypass_limits=false, nAbsurdFee=0, test_accept=false) at validation.cpp:998 #5 0x0000555a194ba7ce in AcceptToMemoryPool (pool=..., state=..., tx=std::shared_ptr (count 1, weak 0) 0x555a1bb819b0, pfMissingInputs=pfMissingInputs@entry=0x0, plTxnReplaced=plTxnReplaced@entry=0x0, bypass_limits=bypass_limits@entry=false, nAbsurdFee=0, test_accept=false) at validation.cpp:1014 #6 0x0000555a19363fbe in AssembleBlock (state=...) at bench/block_assemble.cpp:102 #7 0x0000555a193654d3 in std::_Function_handler<void (benchmark::State&), void (*)(benchmark::State&)>::_M_invoke(std::_Any_data const&, benchmark::State&) (__functor=..., __args#0=...) at /usr/include/c++/5/functional:1871 #8 0x0000555a193501d7 in std::function<void (benchmark::State&)>::operator()(benchmark::State&) const (this=this@entry=0x555a1ba2cda0, __args#0=...) at /usr/include/c++/5/functional:2267 #9 0x0000555a1934ec4c in benchmark::BenchRunner::RunAll (printer=..., num_evals=5, scaling=<optimized out>, filter=..., is_list_only=false) at bench/bench.cpp:121 #10 0x0000555a1934ade9 in main (argc=<optimized out>, argv=<optimized out>) at bench/bench_bitcoin.cpp:92 ``` Tree-SHA512: fdd7b28ff123ccea7a4f334d53f735d0c0f94aa9cc52520c2dd34dca45d78c691af64efcd32366fc472fedffbd79591d2be2bb3bfc4a5186e8712b6b452d64e3
2018-07-30[qa] Add test for too-large wallet output groupsSuhas Daftuar
2018-07-30Acquire cs_main before ATMP call in block_assemble benchJames O'Beirne
Otherwise we fail an assert in sync.cpp:AssertLockHeldInternal.
2018-07-30Merge #13803: doc: add note to contributor docs about warranted PR'sMarcoFalke
db213aa47f doc: add note to contributor docs about warranted PR's (Karl-Johan Alm) Pull request description: Tree-SHA512: 39d4085ec0217c56b0d6a34e95d7b7a18e0373ec25549e6460cb8ef16218a6060f15e539ec2f8cceccd1188d2769e14fc276071f214ceb80db9b08ec5c24ccef
2018-07-30doc: add note to contributor docs about warranted PR'sKarl-Johan Alm
2018-07-30Fix osslsigncode compile issue in gitian-buildChun Kuan Lee
2018-07-30[wallet] correctly limit output group sizeSuhas Daftuar
2018-07-30Merge #13554: Remove unused function argumentsWladimir J. van der Laan
bd9d0690dcc62bb6dc01bda38f63fa965003b8b9 Remove unused argument to WitnessSigOps(...) (practicalswift) d1d7cfebd2c22bdec9ed96d8a389c00d7f898ff8 Remove unused argument to DefaultOptions(...) (practicalswift) 05dbb0c042ba647bf83c15f059c41620e2164337 Remove unused argument to ThreadHTTP(...) (practicalswift) Pull request description: Remove unused function arguments. Tree-SHA512: 9933b6d34ff00a32d2f06a2e542d1225bdfb2c960599f01a8ff0427324b3529db49f19ffdbf54059acbbef5ca87f4c3169e97082169022022cd1e3afa7aaa56d
2018-07-30Merge #13764: contrib: Fix test-security-check fail in Ubuntu 18.04Wladimir J. van der Laan
1e60713a68296a0ff221befb48b2958fbf019ebf contrib: Fix test-security-check fail in Ubuntu 18.04 (Chun Kuan Lee) Pull request description: - Fix test-security-check fail in Ubuntu 18.04. Those flags are enabled by default, so we must specify `-no` to make the executable does 'not' have those attributes. - Drop HIGH_ENTROPY_VA. After update our gitian system to Bionic, the compiler should support HIGH_ENTROPY_VA Tree-SHA512: 78c1f2aae1253ddd52faa1af569b7151a503a217c7ccbe21b8004d8910c45d8a27ff04695eacbdadd7192d2c91c0d59941ca20c651dd2d5052b9999163a11ae4
2018-07-30Report when unknown config file options are ignoredPieter Wuille
2018-07-29chainparams: Update with data from assumed valid chainMarcoFalke
2018-07-29doc: Add historical release notes for 0.16.2Wladimir J. van der Laan
Tree-SHA512: 39601090cbfbc51b00426696c118758953d3eb5e0323e9105a5aabb63ab22eb1b3edbabb541bb7a24869c53624dee3c220fd2c1f3fbe627f8d9d168a23064393