summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* Move QT_DEPRECATED_SINCE(5,2 and 5,3) macro before than qdoc comments5.4Denis Shienkov2015-07-161-2/+2
| | | | | Change-Id: I72c455d2e5bbd660c53edd4bbb0b3fa5b08d806e Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
* Add missing QT_DEPRECATED_SINCE(5, 2) macroDenis Shienkov2015-07-165-0/+10
| | | | | | | | | The macro was added in the header file, but not in the implementation file. Change-Id: I51bc62eedbaba627fb525c04dc126bf0125e7a39 Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* Bump versionOswald Buddenhagen2015-04-201-1/+1
| | | | Change-Id: If106bffcc9c8c0f57fc375f6a92c72eec15394c5
* bic: Add/Replace 5.{1,2,3,4}.0 bic data for linux-gcc-amd64v5.4.25.4.2Sergio Ahumada2015-02-135-3520/+14514
| | | | | | | | | Remove the ia32 data since there are no linux x86 machines in the CI system (which makes the data useless from an automated testing point of view) and most people use x64 these days anyway. Change-Id: If43f9164f94662dc7f7160babb9e3de709078fec Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
* Merge remote-tracking branch 'origin/5.4.1' into 5.4Frederik Gladhorn2015-02-101-0/+61
|\ | | | | | | Change-Id: I32d198d0259ec984df78df89c4bd3a6d7cb026dc
| * Edit changelog for 5.4.1 versionv5.4.15.4.1Leena Miettinen2015-01-191-27/+26
| | | | | | | | | | | | | | Fix grammar, spelling, and style issues. Change-Id: I98f8429f200d24633f504f6ea701509555da38a1 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
| * Add changelog for 5.4.1 versionDenis Shienkov2015-01-191-0/+62
| | | | | | | | | | Change-Id: I7623182c1ce1eecd724a2b4e8593f75a1ac49cc9 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | Doc: Fix the examples pageTopi Reinio2015-01-202-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The group page listing all the examples defined also a \page name, which caused the generated page to contain no examples. Also correct the group name for Command Line Enumerator Example, and move the qtserialport-examples.qdoc to the correct location. Change-Id: I6ebfbe1c49d2a44e4ed631f22027659ba43ceb8d Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
* | Doc: added dependencies to qdocconf fileNico Vertriest2015-01-191-1/+1
| | | | | | | | | | | | Task-number: QTBUG-43810 Change-Id: Iaaeea833a78af467f8ccb56ffc1de613aa3d2c35 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | Bump versionOswald Buddenhagen2015-01-161-1/+1
|/ | | | Change-Id: Ibd1acdaeaaf3ccb5e097958fed6b33749a02442f
* Skip the constructByInfo() test if no serial ports are found on *nixDenis Shienkov2015-01-161-1/+15
| | | | | | | | | | | In unix-like systems it is possible to use socat to creation of the virtual serial ports. But these devices are symlinks on the /dev/pts devices, that is not a serial ports. Thus QSPI can not find it and will construct a null object. In this case this is not an error and we need just to skip test. Change-Id: I59bbb3c4653555be39ea6fff903c386065c10d0a Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* Share the clearReceiver() function and for the *nix testsDenis Shienkov2015-01-151-6/+2
| | | | | | | | | | | | | The waitForReadyReadWithTimeout() test is failed when using the socat utility. The reason is that the receiver's side receive data from the previous waitForBytesWritten() test, even the receiver was closed and re-opened again in the new test. We need suppress this behavior using the clearReceiver() function when starting of waitForReadyReadWithTimeout() test. Change-Id: I6735aa9c9744ec1732f9bd4f701068a540ae2316 Reviewed-by: Laszlo Papp <lpapp@kde.org> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* Do not touch of the read notifier after its creationDenis Shienkov2015-01-062-28/+0
| | | | | | | | | | | | | | When are used the multiple opening and closing chains, then a read notification can be stalled. The reason is in old heritage of a code related to preventing of recursive calls. Thus, need just to remove this old code. It is not the in-depth investigation of an issue but just a workaround which can be improved in future. Tested on Linux with on-board and socat serial ports using Qt5. Task-number: QTBUG-43484 Change-Id: I04556fdde2775448b33d68f141f4328647c549c9 Reviewed-by: Laszlo Papp <lpapp@kde.org>
* Remove README file.Jeff Tranter2014-12-231-0/+0
| | | | | | | Remove the README file as it is empty. Change-Id: Icd252062c00d81a28a41d910161a4e56d2934493 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* Merge "Merge remote-tracking branch 'origin/5.4.0' into 5.4" into ↵Frederik Gladhorn2014-12-171-0/+39
|\ | | | | | | refs/staging/5.4
| * Merge remote-tracking branch 'origin/5.4.0' into 5.4Frederik Gladhorn2014-12-171-0/+39
| |\ | | | | | | | | | Change-Id: Ic608866ccf52db4cd42bc2563a040d9cbd47d684
| | * Remove foreign records from 5.4.0 changesv5.4.05.4.0Denis Shienkov2014-11-281-3/+0
| | | | | | | | | | | | | | | | | | | | | To this changelog were added wrong changes from 5.4.1. Change-Id: I77cc5abb7d537dda3859969d18fb22546cf466ec Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
| | * Add changelog for Qt 5.4.0Denis Shienkov2014-11-281-0/+42
| | | | | | | | | | | | | | | Change-Id: I7c15897db3429df3a0d122893662c20ede4c8f66 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Merge remote-tracking branch 'origin/5.3' into 5.4Frederik Gladhorn2014-12-177-119/+291
|\ \ \ | |/ / |/| | | | | Change-Id: I078c03570399f5212b660b7ed29d3e45ed995896
| * | Refactor and add missed changes up 5.2.0 to 5.3.25.3Denis Shienkov2014-11-276-111/+285
| | | | | | | | | | | | | | | | | | Change-Id: I8a3c40202a89cd1fd264e324e6379d1f6220c340 Reviewed-by: Martin Smith <martin.smith@digia.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
| * | Improve the QSP::clear() on WindowsDenis Shienkov2014-11-271-5/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 9c88ad89801596e1d94acc4f32ff55c34118a66f solves a problem partially. Still when used QSP::clear() with some devices (e.g. virtual ports from the "AGG Software") the reading can be stalled. It is reasonable to make following: 1. Prevent to reset the both readStarted and writeStarted variables inside of QSP::clear() method. These variables shall be reset inside of _q_completeXX() methods which will be called automatically from the notifiers, since the PurgeComm should terminate pending read or write operations. 2. Instead of startAsyncRead() should be called the startAsyncCommunication(), that allow to correctly startup of the read sequence. This scenario can be reproduced with running of the tst_QSerialPort::readAfterInputClear() autotest. Tested on Windows 8 with the virtual com0com ports and with the virtual ports from the "AGG Software" using Qt5. Change-Id: Ic1a53334abd97667a9dd3291c3b975eb04062efd Reviewed-by: Robert Kurjata <rkurjata@gmail.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
| * | Prevent multiple calls of WaitCommEventDenis Shienkov2014-11-271-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit ac0422e8c9e74f2275129e3c7c69ef64299f07a9 introduced a regression that QSP::startAsyncCommunication() was called twice when a limited read buffer is used. In the second call the WaitCommEvent function returned the ERROR_INVALID_PARAMETER error that lead to a stall of the read sequence. QSP::startAsyncCommunication() should be called only when the read buffer has enough space. Tested on Windows 8 with the virtual com0com ports using Qt5. Change-Id: Icd6cada7c3acfd4e689ac76ec304416b00f52b50 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
| * | Fix critical typo with _q_startAsyncWrite()Denis Shienkov2014-11-271-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 62dfdeb3642250bdb642dbf607a8c7b95e57835e introduce a critical typo that revert a bug which are fixed in the b4d5bd813f591dc618e0fff2d55d93eeccb1a26e commit. Change-Id: I9ed29f5b443cbd7102878287d531d18a9351a2e5 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
* | | Bump versionOswald Buddenhagen2014-12-121-1/+1
| | | | | | | | | | | | Change-Id: Id5237f32002f15c64ff41e59e19c6308cc1eb2b5
* | | Use Q_NULLPTR where it is possibleDenis Shienkov2014-12-106-39/+39
| | | | | | | | | | | | | | | Change-Id: I7261a92ea4405c8aeab7670f73e7225ed7e4d9d0 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Do not use internal pre-cached RTS and DTR variablesDenis Shienkov2014-12-052-14/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some devices do not support these signals, and returns an errors when attempt to query it. But the QSP::open() always requests a status of these lines. In this case the QSP::open() will return true, but also will setup an error code (for example, QSP::UnsupportedOperationError for socat's devices in Linux). That is unexpected behavior for the user. It is reasonable do not query a state of these signals when opening. Also we do not need to use of appropriate internal variables, and we can remove it. Change-Id: I277110014c20c1f2c3fdaed20c4582d1356897b9 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Interpret ENOTTY as UnsupportedOperationError instead of ResourceErrorDenis Shienkov2014-12-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | The ENOTTY is closer to QSP::UnsupportedOperationError, because it is decoded as "Inappropriate ioctl for device". Change-Id: Ibcbe09e201eeb5ede6daa417654a181dd380df5a Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | | Detect of Bluetooth SPP (rfcomm) device with SysFsDenis Shienkov2014-12-041-11/+19
| | | | | | | | | | | | | | | Change-Id: I41d67e9ca8d9cb6042b4d8de756a22d18b077dcd Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Setup an error when QSP::setBaudRate() fails on UnixDenis Shienkov2014-12-041-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Inside of a method is missed setup of an error code, therefore always returns QSP::UnknownError (or some previous error). Tested on Linux with USB PL2303, using Terminal example (when trying to setup of an unsupported 14400 baud rate). Change-Id: I6b3143dd6d451a32024a5ca5239dac826ceb7af6 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Mark a device as open only after all settings was apliedDenis Shienkov2014-12-041-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Otherwise it lead to emmiting of the QSP::NotOpenError in case we close a device from a slot, which is connected to QSP::SerialPortError signal. In this case QSP::close() called twice: from the slot, and from the QSP::open() method (this behavior can be reproduced with Terminal example). So, inside of QSP::open() we need to move QIODevice::open() down, and instead of QSP::close() to use QSPP::close(). Tested on Linux with USB PL2303 with trying to setup an unsupported baud rate as 14400 baud. Change-Id: I12dec085423dd9f5a08b7884f32dd2ba8aa8c951 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Do not close closed device in Terminal exampleDenis Shienkov2014-12-041-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When opening is fails, the QSP himself close a device. Thus, we do not need to close device in Terminal example again, because it caused emmiting of the QSP::NotOpenError and to showing of additional messagebox. Change-Id: Id8aa3f3b835fd7d4187bdf83c1d6584d5fd541f7 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Detect a valid of serial8250 portsDenis Shienkov2014-12-032-8/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Usually, a Linux kernel reserves a places for the non-PnP serial devices, for example, such as ttyS[0-4/14]. In case the system has not a HW devices which are attached to this places, then these devices will be stubs and present as usual serial ports. Thus, we can know about a validity of these devices only in attempt to open them and to query a type of. Note: This patch is theoretical, because are not tested for a valid 8250 devices. Task-number: QTBUG-32024 Change-Id: I313145caadfeeee4d5fe3c8e16c1bcf4ae79214d Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Improve QSPI sysfs algorithmDenis Shienkov2014-12-031-81/+107
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Earlier, the algorithm used check for magic keywords (like "usb", "platform" and so on) in the target path for decision-making what of device can be skipped or accepted. But this is a wrong approach, because on different platforms can be different key-words and we can not know it. So, it is more reasonable to use a different approach where we make decision by a driver name (by analogy with current udev implementation). In this case we skip those devices which has an empty driver name or when a name is equal to "serial8250". * When a driver name is empty, then we can be sure that it is other than serial port device (e.g. as pseudo-terminal, console and so on). Thus, it is similar to udev devices without a parent, which we ignore. * When a driver name is "serial8250", it is equal to "platform" devices, which we too ignore for current implementation. Though in a future this can be solved (i.e. we can try to detect a valid devices based on "serial8250" driver). Tested on Linux with on-board and USB serial ports using Qt5. Change-Id: I884ad8f3fddff9487ad4a67c4904b57f62164e00 Reviewed-by: Rainer Keller <rainer.keller@theqtcompany.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Make QSPI udev functions more readableDenis Shienkov2014-12-021-31/+37
| | | | | | | | | | | | | | | | | | Change-Id: I5c33421338e6a64dbadeb168cf165a84bedec5b9 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | | Improve QSPI algorithm on UnixDenis Shienkov2014-12-022-14/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | QSPI uses the wrong algorithm of devices search. In case no any devices are detected with udev (or with sysfs), starts a search with a filters. In this case a user gets a list of devices that are not a serial ports, that is wrong. The main idea should be in that udev or sysfs are the main sources of obtaining information. In case they returns an empty list this means that system has no serial ports. Algorithm is: Try to find devices through udev. If it fails (system error or udev is not present), then try to find using sysfs; otherwise return udev result, even if it has an empty list. If sysfs is fails (permission denied or sysfs is not present), then try to find devices in /dev/ as last attempt; otherwise return sysfs result, even if it has an empty list. Tested on Linux (with udev, sysfs, filters) using FTDI serial ports. Change-Id: I0132e27f720b007ea3f4861e9cd7ed77833cff8c Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Add scroll area to Enumerator exampleDenis Shienkov2014-12-011-4/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | When a system has many serial ports, the last of them are not visible on the screen, because a widget has a big height. So, it is reasonable to add scrolling of all serial ports info. Change-Id: Ic13b58fba38a17d6f5142476bca501a0d26ec76d Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Translate serial port settings of Terminal exampleDenis Shienkov2014-12-011-11/+11
| | | | | | | | | | | | | | | Change-Id: Ica127147999eaecc3d03189cfa9cd893115b846c Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Allow to setup custom device in Terminal exampleDenis Shienkov2014-12-012-10/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | Terminal example allows to select only available devices which are received from QSPI. Now it is possible to enter and to open of any custom device. Change-Id: I83172a346cb5dc0e20c217957133e9e3e506d8a4 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Autotest misconfiguration error message is more verboseSergey Belyashov2014-12-012-4/+31
| | | | | | | | | | | | | | | | | | | | | | | | Error message about missing environment variables generates list of required variables. Change-Id: Icbb680abbd9fc5d0549907b7399757d943c6d535 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | | Simplify and improve the QSP::TimeoutError handlingDenis Shienkov2014-11-286-56/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It is reasonable to get rid of duplicating a code of TimeoutError handling. A common parts of a code can be moved to one place. Also, can be improved some of related if/else conditions. Tested on Windows 8 and Linux with virtual serial ports. Change-Id: I63112727faf42d4357f64f3450ea422167eaee90 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | | Handle EINVAL, ENOIOCTLCMD, ENOTTY and EPERM errorsDenis Shienkov2014-11-281-0/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | According to TTY_IOCTL(4), the ioctl on tty device can return these errors, which we need to interpret to QSP::SerialPortError. For example, a virtual devices which are created by SOCAT, returns the EINVAL error when the ioctl does query of line states. Change-Id: Iece3b773fdc8fe4b97951ccf7cff9d2670f24694 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Close the handle for the events that were createdAndy Shaw2014-11-272-0/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | The handles should be closed when QSerialPort is deleted in order to clean up the native resources. Change-Id: If04521fc0fa3b898093bda3317962b4c44818034 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com> Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Allow to use custom devices pathsDenis Shienkov2014-11-2715-100/+196
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | QSP incorrectly transforms non-standard device names to their paths and vice-versa (for example, "/home/ttyS0", "//./COM1", and so on). Now this problem is solved: * The transformation code is moved to QSPP. * Added autotests auto/qserialportinfoprivate to testing of conversion algorithm. These tests are private and can be activated with building of QtSerialPort with: qmake "QT_CONFIG+=private_tests warnings_are_errors" \ DEFINES+=QT_BUILD_INTERNAL Tested on Windows 8, Linux, OSX with auto-tests, with on-board and virtual serial ports. Task-number: QTBUG-38639 Change-Id: I43757a7f1390f53ed2b1d70de59c6bfb71892a59 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Remove Q_OS_WIN64 since Q_OS_WIN32 defines 64-bit tooDenis Shienkov2014-11-241-1/+1
| | | | | | | | | | | | | | | Change-Id: I32eaf132f19a3b6fcbd5fd55d0690c3bd62bb641 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Remove the 'register' keywordThiago Macieira2014-11-231-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | It doesn't do anything and has been deprecated in C++14. Clang even prints a warning. Change-Id: Ie803a206f02897f99358ed22bf9cb999ca457741 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | | Simplify handling of overlapped resultDenis Shienkov2014-11-232-7/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There is not necessary to pass direction to handleOverlappedResult(). Because it is passed already as a second argument (pointer to OVERLAPPED structure that defines a desired direction). Also this method is renamed to more simple and short name. Change-Id: I9c20cf97c1712aed8d3e9ea6d9b4687ce4487523 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Declare QElapsedTimer closer to usageDenis Shienkov2014-11-223-10/+6
| | | | | | | | | | | | | | | Change-Id: I74622eaf3a7f5179ff25fc815997d5e4cf3cc2c7 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | | Fix QSPI::isNull()Denis Shienkov2014-11-219-78/+206
| |/ |/| | | | | | | | | | | | | | | | | | | The method QSPI::isNull() should return false when QSPI is empty. Tested on Winsows 8 and Linux with on-board, virtual and USB serial ports using Qt5 and then Qt4. Task-number: QTBUG-41262 Change-Id: Ic9e0afc5549311283aef7ec2ed841f5e418b7edf Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
* | Check for lock file in non-writable directoriesv5.4.0-rc1Rainer Keller2014-10-231-8/+11
| | | | | | | | | | | | | | | | | | | | | | | | On some linux systems /var/lock is not writable by users which are not root and not in the uucp or dialout group. If the root user acquires a lock and you are trying to access the same port with a non-root user it will not check for the lock but creates a new lock file in /tmp instead. This change checks in readable directories for lock files. Change-Id: Ia308fd344d2fe9d3c699f7a428ff620ea101eff3 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
* | Merge remote-tracking branch 'origin/5.3' into 5.4Frederik Gladhorn2014-10-1412-52/+215
|\ \ | |/ | | | | Change-Id: Id7e66059233e8d07ba44cad19048d9cddc68e250