quarchpy 2.1.13.dev1__py2.py3-none-any.whl → 2.1.14__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (837) hide show
  1. quarchpy/.idea/.name +1 -1
  2. quarchpy/.idea/modules.xml +1 -0
  3. quarchpy/.idea/quarchpy.iml +4 -1
  4. quarchpy/.idea/workspace.xml +208 -11
  5. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  6. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  7. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  8. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  9. quarchpy/_version.py +1 -1
  10. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  11. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  12. quarchpy/connection_specific/QPS/commandLineOptions.txt +12 -10
  13. quarchpy/connection_specific/QPS/qis/qis.jar +0 -0
  14. quarchpy/connection_specific/QPS/qis/qis_lib/{CInterface-1.7.03.jar → CInterface-1.7.04.jar} +0 -0
  15. quarchpy/connection_specific/QPS/qis/qis_lib/{QuarchCommon-0.2.5.jar → QuarchCommon-0.2.6.jar} +0 -0
  16. quarchpy/connection_specific/QPS/qis/qis_lib/commons-lang3-3.2.1.jar +0 -0
  17. quarchpy/connection_specific/QPS/qps.jar +0 -0
  18. quarchpy/connection_specific/QPS/qps_lib/QuarchCommon-0.2.6.jar +0 -0
  19. quarchpy/connection_specific/QPS/qps_lib/istack-commons-runtime-3.0.11.jar +0 -0
  20. quarchpy/connection_specific/QPS/qps_lib/jakarta.activation-api-2.1.0.jar +0 -0
  21. quarchpy/connection_specific/QPS/qps_lib/jakarta.xml.bind-api-3.0.0.jar +0 -0
  22. quarchpy/connection_specific/QPS/qps_lib/jaxb-core-3.0.0.jar +0 -0
  23. quarchpy/connection_specific/QPS/qps_lib/jaxb-impl-3.0.0.jar +0 -0
  24. quarchpy/connection_specific/QPS/qps_lib/jaxb-runtime-3.0.0.jar +0 -0
  25. quarchpy/connection_specific/QPS/qps_lib/qis-1.39.jar +0 -0
  26. quarchpy/connection_specific/QPS/qps_lib/txw2-3.0.0.jar +0 -0
  27. quarchpy/connection_specific/QPS/scriptCommands.txt +2 -2
  28. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
  29. quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
  30. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
  31. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
  32. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
  33. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
  34. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
  35. quarchpy/connection_specific/__pycache__/connection_Telnet.cpython-311.pyc +0 -0
  36. quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
  37. quarchpy/connection_specific/__pycache__/connection_mDNS.cpython-311.pyc +0 -0
  38. quarchpy/connection_specific/connection_QIS.py +246 -331
  39. quarchpy/connection_specific/connection_QPS.py +1 -1
  40. quarchpy/connection_specific/connection_ReST.py +26 -16
  41. quarchpy/connection_specific/connection_TCP.py +1 -1
  42. quarchpy/connection_specific/connection_mDNS.py +46 -0
  43. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
  44. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
  45. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
  46. quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
  47. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  48. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
  49. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
  50. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
  51. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  52. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  53. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  54. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  55. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  56. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  57. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  58. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  59. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  60. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  61. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  62. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  63. quarchpy/device/device.py +2 -0
  64. quarchpy/device/quarchPPM.py +2 -2
  65. quarchpy/device/quarchQPS.py +95 -86
  66. quarchpy/device/scanDevices.py +13 -3
  67. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  68. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  69. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  70. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  71. quarchpy/docs/CHANGES.rst +11 -1
  72. quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
  73. quarchpy/docs/_build/doctrees/environment.pickle +0 -0
  74. quarchpy/docs/_build/doctrees/index.doctree +0 -0
  75. quarchpy/docs/_build/doctrees/readme.doctree +0 -0
  76. quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
  77. quarchpy/docs/_build/doctrees/source/licenses.doctree +0 -0
  78. quarchpy/docs/_build/doctrees/source/modules.doctree +0 -0
  79. quarchpy/docs/_build/doctrees/source/quarchpy.calibration.doctree +0 -0
  80. quarchpy/docs/_build/doctrees/source/quarchpy.config_files.doctree +0 -0
  81. quarchpy/docs/_build/doctrees/source/quarchpy.connection_specific.doctree +0 -0
  82. quarchpy/docs/_build/doctrees/source/quarchpy.debug.doctree +0 -0
  83. quarchpy/docs/_build/doctrees/source/quarchpy.device.doctree +0 -0
  84. quarchpy/docs/_build/doctrees/source/quarchpy.disk_test.doctree +0 -0
  85. quarchpy/docs/_build/doctrees/source/quarchpy.doctree +0 -0
  86. quarchpy/docs/_build/doctrees/source/quarchpy.fio.doctree +0 -0
  87. quarchpy/docs/_build/doctrees/source/quarchpy.iometer.doctree +0 -0
  88. quarchpy/docs/_build/doctrees/source/quarchpy.qis.doctree +0 -0
  89. quarchpy/docs/_build/doctrees/source/quarchpy.qps.doctree +0 -0
  90. quarchpy/docs/_build/doctrees/source/quarchpy.user_interface.doctree +0 -0
  91. quarchpy/docs/_build/doctrees/source/quarchpy.utilities.doctree +0 -0
  92. quarchpy/docs/_build/doctrees/source/readme.doctree +0 -0
  93. quarchpy/docs/_build/html/.buildinfo +1 -1
  94. quarchpy/docs/_build/html/CHANGES.html +198 -156
  95. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +30 -0
  96. quarchpy/docs/_build/html/_static/alabaster.css +3 -1
  97. quarchpy/docs/_build/html/_static/basic.css +47 -27
  98. quarchpy/docs/_build/html/_static/doctools.js +107 -274
  99. quarchpy/docs/_build/html/_static/documentation_options.js +5 -4
  100. quarchpy/docs/_build/html/_static/language_data.js +2 -100
  101. quarchpy/docs/_build/html/_static/pygments.css +1 -0
  102. quarchpy/docs/_build/html/_static/searchtools.js +440 -395
  103. quarchpy/docs/_build/html/_static/sphinx_highlight.js +154 -0
  104. quarchpy/docs/_build/html/genindex.html +263 -87
  105. quarchpy/docs/_build/html/index.html +68 -63
  106. quarchpy/docs/_build/html/objects.inv +0 -0
  107. quarchpy/docs/_build/html/py-modindex.html +9 -11
  108. quarchpy/docs/_build/html/readme.html +26 -27
  109. quarchpy/docs/_build/html/search.html +8 -10
  110. quarchpy/docs/_build/html/searchindex.js +1 -1
  111. quarchpy/docs/_build/html/source/changelog.html +249 -201
  112. quarchpy/docs/_build/html/source/licenses.html +23 -24
  113. quarchpy/docs/_build/html/source/modules.html +24 -17
  114. quarchpy/docs/_build/html/source/quarchpy.calibration.html +44 -45
  115. quarchpy/docs/_build/html/source/quarchpy.config_files.html +25 -26
  116. quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +239 -133
  117. quarchpy/docs/_build/html/source/quarchpy.debug.html +57 -54
  118. quarchpy/docs/_build/html/source/quarchpy.device.html +245 -211
  119. quarchpy/docs/_build/html/source/quarchpy.disk_test.html +75 -76
  120. quarchpy/docs/_build/html/source/quarchpy.fio.html +33 -34
  121. quarchpy/docs/_build/html/source/quarchpy.html +518 -61
  122. quarchpy/docs/_build/html/source/quarchpy.iometer.html +130 -44
  123. quarchpy/docs/_build/html/source/quarchpy.qis.html +420 -44
  124. quarchpy/docs/_build/html/source/quarchpy.qps.html +44 -43
  125. quarchpy/docs/_build/html/source/quarchpy.user_interface.html +70 -120
  126. quarchpy/docs/_build/html/source/quarchpy.utilities.html +39 -40
  127. quarchpy/docs/_build/html/source/readme.html +26 -27
  128. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  129. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  130. quarchpy/fio/__pycache__/fioDiskFinder.cpython-311.pyc +0 -0
  131. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  132. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  133. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  134. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  135. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  136. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  137. quarchpy/qis/qisFuncs.py +25 -42
  138. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  139. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  140. quarchpy/qps/qpsFuncs.py +18 -19
  141. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  142. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  143. quarchpy/user_interface/user_interface.py +156 -137
  144. quarchpy/utilities/TestCenter.py +11 -16
  145. quarchpy/utilities/Version.py +50 -0
  146. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  147. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  148. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  149. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  150. quarchpy/venv/.gitignore +2 -0
  151. quarchpy/venv/Include/Python-ast.h +535 -0
  152. quarchpy/venv/Include/Python.h +181 -0
  153. quarchpy/venv/Include/abstract.h +1396 -0
  154. quarchpy/venv/Include/asdl.h +45 -0
  155. quarchpy/venv/Include/ast.h +13 -0
  156. quarchpy/venv/Include/bitset.h +32 -0
  157. quarchpy/venv/Include/boolobject.h +36 -0
  158. quarchpy/venv/Include/bufferobject.h +33 -0
  159. quarchpy/venv/Include/bytearrayobject.h +57 -0
  160. quarchpy/venv/Include/bytes_methods.h +75 -0
  161. quarchpy/venv/Include/bytesobject.h +27 -0
  162. quarchpy/venv/Include/cStringIO.h +73 -0
  163. quarchpy/venv/Include/cellobject.h +28 -0
  164. quarchpy/venv/Include/ceval.h +154 -0
  165. quarchpy/venv/Include/classobject.h +83 -0
  166. quarchpy/venv/Include/cobject.h +89 -0
  167. quarchpy/venv/Include/code.h +116 -0
  168. quarchpy/venv/Include/codecs.h +212 -0
  169. quarchpy/venv/Include/compile.h +40 -0
  170. quarchpy/venv/Include/complexobject.h +66 -0
  171. quarchpy/venv/Include/datetime.h +239 -0
  172. quarchpy/venv/Include/descrobject.h +94 -0
  173. quarchpy/venv/Include/dictobject.h +160 -0
  174. quarchpy/venv/Include/dtoa.h +15 -0
  175. quarchpy/venv/Include/enumobject.h +17 -0
  176. quarchpy/venv/Include/errcode.h +37 -0
  177. quarchpy/venv/Include/eval.h +25 -0
  178. quarchpy/venv/Include/fileobject.h +97 -0
  179. quarchpy/venv/Include/floatobject.h +140 -0
  180. quarchpy/venv/Include/frameobject.h +89 -0
  181. quarchpy/venv/Include/funcobject.h +76 -0
  182. quarchpy/venv/Include/genobject.h +40 -0
  183. quarchpy/venv/Include/graminit.h +87 -0
  184. quarchpy/venv/Include/grammar.h +94 -0
  185. quarchpy/venv/Include/import.h +71 -0
  186. quarchpy/venv/Include/intobject.h +84 -0
  187. quarchpy/venv/Include/intrcheck.h +15 -0
  188. quarchpy/venv/Include/iterobject.h +23 -0
  189. quarchpy/venv/Include/listobject.h +68 -0
  190. quarchpy/venv/Include/longintrepr.h +103 -0
  191. quarchpy/venv/Include/longobject.h +135 -0
  192. quarchpy/venv/Include/marshal.h +25 -0
  193. quarchpy/venv/Include/memoryobject.h +74 -0
  194. quarchpy/venv/Include/metagrammar.h +18 -0
  195. quarchpy/venv/Include/methodobject.h +93 -0
  196. quarchpy/venv/Include/modsupport.h +134 -0
  197. quarchpy/venv/Include/moduleobject.h +24 -0
  198. quarchpy/venv/Include/node.h +41 -0
  199. quarchpy/venv/Include/object.h +1046 -0
  200. quarchpy/venv/Include/objimpl.h +369 -0
  201. quarchpy/venv/Include/opcode.h +171 -0
  202. quarchpy/venv/Include/osdefs.h +63 -0
  203. quarchpy/venv/Include/parsetok.h +64 -0
  204. quarchpy/venv/Include/patchlevel.h +43 -0
  205. quarchpy/venv/Include/pgen.h +18 -0
  206. quarchpy/venv/Include/pgenheaders.h +43 -0
  207. quarchpy/venv/Include/py_curses.h +177 -0
  208. quarchpy/venv/Include/pyarena.h +62 -0
  209. quarchpy/venv/Include/pycapsule.h +56 -0
  210. quarchpy/venv/Include/pyconfig.h +770 -0
  211. quarchpy/venv/Include/pyctype.h +31 -0
  212. quarchpy/venv/Include/pydebug.h +41 -0
  213. quarchpy/venv/Include/pyerrors.h +329 -0
  214. quarchpy/venv/Include/pyexpat.h +50 -0
  215. quarchpy/venv/Include/pyfpe.h +176 -0
  216. quarchpy/venv/Include/pygetopt.h +18 -0
  217. quarchpy/venv/Include/pymacconfig.h +102 -0
  218. quarchpy/venv/Include/pymactoolbox.h +232 -0
  219. quarchpy/venv/Include/pymath.h +214 -0
  220. quarchpy/venv/Include/pymem.h +122 -0
  221. quarchpy/venv/Include/pyport.h +950 -0
  222. quarchpy/venv/Include/pystate.h +200 -0
  223. quarchpy/venv/Include/pystrcmp.h +23 -0
  224. quarchpy/venv/Include/pystrtod.h +45 -0
  225. quarchpy/venv/Include/pythonrun.h +181 -0
  226. quarchpy/venv/Include/pythread.h +41 -0
  227. quarchpy/venv/Include/rangeobject.h +28 -0
  228. quarchpy/venv/Include/setobject.h +99 -0
  229. quarchpy/venv/Include/sliceobject.h +50 -0
  230. quarchpy/venv/Include/stringobject.h +210 -0
  231. quarchpy/venv/Include/structmember.h +99 -0
  232. quarchpy/venv/Include/structseq.h +41 -0
  233. quarchpy/venv/Include/symtable.h +98 -0
  234. quarchpy/venv/Include/sysmodule.h +31 -0
  235. quarchpy/venv/Include/timefuncs.h +26 -0
  236. quarchpy/venv/Include/token.h +85 -0
  237. quarchpy/venv/Include/traceback.h +31 -0
  238. quarchpy/venv/Include/tupleobject.h +61 -0
  239. quarchpy/venv/Include/ucnhash.h +33 -0
  240. quarchpy/venv/Include/unicodeobject.h +1413 -0
  241. quarchpy/venv/Include/warnings.h +23 -0
  242. quarchpy/venv/Include/weakrefobject.h +82 -0
  243. quarchpy/venv/Lib/os.py +742 -0
  244. quarchpy/venv/Lib/os.pyc +0 -0
  245. quarchpy/venv/Lib/site-packages/_virtualenv.pth +1 -0
  246. quarchpy/venv/Lib/site-packages/_virtualenv.py +130 -0
  247. quarchpy/venv/Lib/site-packages/_virtualenv.pyc +0 -0
  248. quarchpy/venv/Lib/site-packages/easy_install.py +5 -0
  249. quarchpy/venv/Lib/site-packages/pip/__init__.py +18 -0
  250. quarchpy/venv/Lib/site-packages/pip/__main__.py +26 -0
  251. quarchpy/venv/Lib/site-packages/pip/_internal/__init__.py +17 -0
  252. quarchpy/venv/Lib/site-packages/pip/_internal/build_env.py +242 -0
  253. quarchpy/venv/Lib/site-packages/pip/_internal/cache.py +346 -0
  254. quarchpy/venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
  255. quarchpy/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +164 -0
  256. quarchpy/venv/Lib/site-packages/pip/_internal/cli/base_command.py +260 -0
  257. quarchpy/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +971 -0
  258. quarchpy/venv/Lib/site-packages/pip/_internal/cli/command_context.py +36 -0
  259. quarchpy/venv/Lib/site-packages/pip/_internal/cli/main.py +75 -0
  260. quarchpy/venv/Lib/site-packages/pip/_internal/cli/main_parser.py +96 -0
  261. quarchpy/venv/Lib/site-packages/pip/_internal/cli/parser.py +285 -0
  262. quarchpy/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +280 -0
  263. quarchpy/venv/Lib/site-packages/pip/_internal/cli/req_command.py +436 -0
  264. quarchpy/venv/Lib/site-packages/pip/_internal/cli/spinners.py +173 -0
  265. quarchpy/venv/Lib/site-packages/pip/_internal/cli/status_codes.py +8 -0
  266. quarchpy/venv/Lib/site-packages/pip/_internal/commands/__init__.py +123 -0
  267. quarchpy/venv/Lib/site-packages/pip/_internal/commands/cache.py +234 -0
  268. quarchpy/venv/Lib/site-packages/pip/_internal/commands/check.py +51 -0
  269. quarchpy/venv/Lib/site-packages/pip/_internal/commands/completion.py +98 -0
  270. quarchpy/venv/Lib/site-packages/pip/_internal/commands/configuration.py +280 -0
  271. quarchpy/venv/Lib/site-packages/pip/_internal/commands/debug.py +230 -0
  272. quarchpy/venv/Lib/site-packages/pip/_internal/commands/download.py +143 -0
  273. quarchpy/venv/Lib/site-packages/pip/_internal/commands/freeze.py +116 -0
  274. quarchpy/venv/Lib/site-packages/pip/_internal/commands/hash.py +63 -0
  275. quarchpy/venv/Lib/site-packages/pip/_internal/commands/help.py +46 -0
  276. quarchpy/venv/Lib/site-packages/pip/_internal/commands/install.py +737 -0
  277. quarchpy/venv/Lib/site-packages/pip/_internal/commands/list.py +327 -0
  278. quarchpy/venv/Lib/site-packages/pip/_internal/commands/search.py +169 -0
  279. quarchpy/venv/Lib/site-packages/pip/_internal/commands/show.py +186 -0
  280. quarchpy/venv/Lib/site-packages/pip/_internal/commands/uninstall.py +95 -0
  281. quarchpy/venv/Lib/site-packages/pip/_internal/commands/wheel.py +198 -0
  282. quarchpy/venv/Lib/site-packages/pip/_internal/configuration.py +407 -0
  283. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/__init__.py +24 -0
  284. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/base.py +46 -0
  285. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/installed.py +25 -0
  286. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/sdist.py +105 -0
  287. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/wheel.py +37 -0
  288. quarchpy/venv/Lib/site-packages/pip/_internal/exceptions.py +391 -0
  289. quarchpy/venv/Lib/site-packages/pip/_internal/index/__init__.py +2 -0
  290. quarchpy/venv/Lib/site-packages/pip/_internal/index/collector.py +667 -0
  291. quarchpy/venv/Lib/site-packages/pip/_internal/index/package_finder.py +1015 -0
  292. quarchpy/venv/Lib/site-packages/pip/_internal/locations.py +193 -0
  293. quarchpy/venv/Lib/site-packages/pip/_internal/main.py +16 -0
  294. quarchpy/venv/Lib/site-packages/pip/_internal/models/__init__.py +2 -0
  295. quarchpy/venv/Lib/site-packages/pip/_internal/models/candidate.py +39 -0
  296. quarchpy/venv/Lib/site-packages/pip/_internal/models/direct_url.py +243 -0
  297. quarchpy/venv/Lib/site-packages/pip/_internal/models/format_control.py +92 -0
  298. quarchpy/venv/Lib/site-packages/pip/_internal/models/index.py +34 -0
  299. quarchpy/venv/Lib/site-packages/pip/_internal/models/link.py +246 -0
  300. quarchpy/venv/Lib/site-packages/pip/_internal/models/scheme.py +31 -0
  301. quarchpy/venv/Lib/site-packages/pip/_internal/models/search_scope.py +135 -0
  302. quarchpy/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +50 -0
  303. quarchpy/venv/Lib/site-packages/pip/_internal/models/target_python.py +117 -0
  304. quarchpy/venv/Lib/site-packages/pip/_internal/models/wheel.py +78 -0
  305. quarchpy/venv/Lib/site-packages/pip/_internal/network/__init__.py +2 -0
  306. quarchpy/venv/Lib/site-packages/pip/_internal/network/auth.py +310 -0
  307. quarchpy/venv/Lib/site-packages/pip/_internal/network/cache.py +79 -0
  308. quarchpy/venv/Lib/site-packages/pip/_internal/network/download.py +202 -0
  309. quarchpy/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +231 -0
  310. quarchpy/venv/Lib/site-packages/pip/_internal/network/session.py +428 -0
  311. quarchpy/venv/Lib/site-packages/pip/_internal/network/utils.py +97 -0
  312. quarchpy/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +53 -0
  313. quarchpy/venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  314. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  315. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
  316. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +77 -0
  317. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +47 -0
  318. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +113 -0
  319. quarchpy/venv/Lib/site-packages/pip/_internal/operations/check.py +155 -0
  320. quarchpy/venv/Lib/site-packages/pip/_internal/operations/freeze.py +277 -0
  321. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +2 -0
  322. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +52 -0
  323. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py +130 -0
  324. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +846 -0
  325. quarchpy/venv/Lib/site-packages/pip/_internal/operations/prepare.py +608 -0
  326. quarchpy/venv/Lib/site-packages/pip/_internal/pyproject.py +196 -0
  327. quarchpy/venv/Lib/site-packages/pip/_internal/req/__init__.py +103 -0
  328. quarchpy/venv/Lib/site-packages/pip/_internal/req/constructors.py +476 -0
  329. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_file.py +574 -0
  330. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_install.py +907 -0
  331. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_set.py +204 -0
  332. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_tracker.py +151 -0
  333. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +657 -0
  334. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  335. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/base.py +21 -0
  336. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  337. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +473 -0
  338. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  339. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +156 -0
  340. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +604 -0
  341. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +504 -0
  342. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +101 -0
  343. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +174 -0
  344. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +84 -0
  345. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +201 -0
  346. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +296 -0
  347. quarchpy/venv/Lib/site-packages/pip/_internal/self_outdated_check.py +197 -0
  348. quarchpy/venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  349. quarchpy/venv/Lib/site-packages/pip/_internal/utils/appdirs.py +44 -0
  350. quarchpy/venv/Lib/site-packages/pip/_internal/utils/compat.py +293 -0
  351. quarchpy/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +178 -0
  352. quarchpy/venv/Lib/site-packages/pip/_internal/utils/datetime.py +14 -0
  353. quarchpy/venv/Lib/site-packages/pip/_internal/utils/deprecation.py +104 -0
  354. quarchpy/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +126 -0
  355. quarchpy/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py +48 -0
  356. quarchpy/venv/Lib/site-packages/pip/_internal/utils/encoding.py +41 -0
  357. quarchpy/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +31 -0
  358. quarchpy/venv/Lib/site-packages/pip/_internal/utils/filesystem.py +224 -0
  359. quarchpy/venv/Lib/site-packages/pip/_internal/utils/filetypes.py +26 -0
  360. quarchpy/venv/Lib/site-packages/pip/_internal/utils/glibc.py +98 -0
  361. quarchpy/venv/Lib/site-packages/pip/_internal/utils/hashes.py +169 -0
  362. quarchpy/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +36 -0
  363. quarchpy/venv/Lib/site-packages/pip/_internal/utils/logging.py +399 -0
  364. quarchpy/venv/Lib/site-packages/pip/_internal/utils/misc.py +962 -0
  365. quarchpy/venv/Lib/site-packages/pip/_internal/utils/models.py +44 -0
  366. quarchpy/venv/Lib/site-packages/pip/_internal/utils/packaging.py +95 -0
  367. quarchpy/venv/Lib/site-packages/pip/_internal/utils/parallel.py +107 -0
  368. quarchpy/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py +44 -0
  369. quarchpy/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +181 -0
  370. quarchpy/venv/Lib/site-packages/pip/_internal/utils/subprocess.py +299 -0
  371. quarchpy/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +284 -0
  372. quarchpy/venv/Lib/site-packages/pip/_internal/utils/typing.py +38 -0
  373. quarchpy/venv/Lib/site-packages/pip/_internal/utils/unpacking.py +281 -0
  374. quarchpy/venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
  375. quarchpy/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +119 -0
  376. quarchpy/venv/Lib/site-packages/pip/_internal/utils/wheel.py +225 -0
  377. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
  378. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +123 -0
  379. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/git.py +454 -0
  380. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +172 -0
  381. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/subversion.py +340 -0
  382. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +735 -0
  383. quarchpy/venv/Lib/site-packages/pip/_internal/wheel_builder.py +362 -0
  384. quarchpy/venv/Lib/site-packages/pip/_vendor/__init__.py +114 -0
  385. quarchpy/venv/Lib/site-packages/pip/_vendor/appdirs.py +633 -0
  386. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +11 -0
  387. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +57 -0
  388. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +133 -0
  389. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +39 -0
  390. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +2 -0
  391. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +146 -0
  392. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +33 -0
  393. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +29 -0
  394. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +376 -0
  395. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +80 -0
  396. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +135 -0
  397. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +188 -0
  398. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +29 -0
  399. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +3 -0
  400. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
  401. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +4606 -0
  402. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/core.py +60 -0
  403. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +39 -0
  404. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
  405. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +47 -0
  406. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +233 -0
  407. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
  408. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +145 -0
  409. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +1 -0
  410. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +85 -0
  411. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +88 -0
  412. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/compat.py +34 -0
  413. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +49 -0
  414. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/enums.py +76 -0
  415. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +101 -0
  416. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +246 -0
  417. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +92 -0
  418. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +195 -0
  419. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +47 -0
  420. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +387 -0
  421. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +46 -0
  422. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +283 -0
  423. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +46 -0
  424. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +292 -0
  425. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +325 -0
  426. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +233 -0
  427. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +228 -0
  428. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py +333 -0
  429. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +225 -0
  430. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +200 -0
  431. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +225 -0
  432. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +199 -0
  433. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +193 -0
  434. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +145 -0
  435. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +91 -0
  436. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +54 -0
  437. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +572 -0
  438. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +132 -0
  439. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +73 -0
  440. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +92 -0
  441. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +286 -0
  442. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +82 -0
  443. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/version.py +9 -0
  444. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +6 -0
  445. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +102 -0
  446. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +258 -0
  447. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +80 -0
  448. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/win32.py +152 -0
  449. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +169 -0
  450. quarchpy/venv/Lib/site-packages/pip/_vendor/contextlib2.py +518 -0
  451. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +23 -0
  452. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py +6 -0
  453. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py +41 -0
  454. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py +764 -0
  455. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +84 -0
  456. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +786 -0
  457. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py +2607 -0
  458. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1120 -0
  459. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/database.py +1339 -0
  460. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/index.py +516 -0
  461. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/locators.py +1302 -0
  462. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +393 -0
  463. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/markers.py +131 -0
  464. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +1056 -0
  465. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/resources.py +355 -0
  466. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +419 -0
  467. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe +0 -0
  468. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe +0 -0
  469. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/util.py +1761 -0
  470. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/version.py +736 -0
  471. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe +0 -0
  472. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe +0 -0
  473. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +1018 -0
  474. quarchpy/venv/Lib/site-packages/pip/_vendor/distro.py +1230 -0
  475. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py +35 -0
  476. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py +289 -0
  477. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py +918 -0
  478. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py +1735 -0
  479. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py +5 -0
  480. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py +40 -0
  481. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py +67 -0
  482. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py +159 -0
  483. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py +2946 -0
  484. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py +0 -0
  485. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
  486. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py +12 -0
  487. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
  488. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py +93 -0
  489. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +207 -0
  490. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +916 -0
  491. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py +38 -0
  492. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py +2795 -0
  493. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py +409 -0
  494. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +30 -0
  495. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +54 -0
  496. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +50 -0
  497. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +88 -0
  498. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py +417 -0
  499. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +239 -0
  500. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +343 -0
  501. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
  502. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +154 -0
  503. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py +252 -0
  504. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +43 -0
  505. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +131 -0
  506. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
  507. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py +69 -0
  508. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/__init__.py +2 -0
  509. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/codec.py +118 -0
  510. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/compat.py +12 -0
  511. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/core.py +400 -0
  512. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +2050 -0
  513. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/intranges.py +53 -0
  514. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/package_data.py +2 -0
  515. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8357 -0
  516. quarchpy/venv/Lib/site-packages/pip/_vendor/ipaddress.py +2420 -0
  517. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +54 -0
  518. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/_version.py +1 -0
  519. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
  520. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +191 -0
  521. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +1063 -0
  522. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/__about__.py +27 -0
  523. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +26 -0
  524. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_compat.py +38 -0
  525. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +86 -0
  526. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_typing.py +48 -0
  527. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/markers.py +328 -0
  528. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +151 -0
  529. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +864 -0
  530. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/tags.py +852 -0
  531. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/utils.py +67 -0
  532. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/version.py +556 -0
  533. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/__init__.py +6 -0
  534. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py +280 -0
  535. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/build.py +124 -0
  536. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/check.py +203 -0
  537. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py +115 -0
  538. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/compat.py +34 -0
  539. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py +44 -0
  540. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py +167 -0
  541. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/meta.py +92 -0
  542. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py +327 -0
  543. quarchpy/venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3296 -0
  544. quarchpy/venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py +23 -0
  545. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/__init__.py +177 -0
  546. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/bar.py +91 -0
  547. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/counter.py +41 -0
  548. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/spinner.py +43 -0
  549. quarchpy/venv/Lib/site-packages/pip/_vendor/pyparsing.py +7107 -0
  550. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/__init__.py +144 -0
  551. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
  552. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +42 -0
  553. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/adapters.py +533 -0
  554. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/api.py +161 -0
  555. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/auth.py +305 -0
  556. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/certs.py +18 -0
  557. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/compat.py +76 -0
  558. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/cookies.py +549 -0
  559. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +123 -0
  560. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/help.py +119 -0
  561. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/hooks.py +34 -0
  562. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/models.py +956 -0
  563. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/packages.py +16 -0
  564. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/sessions.py +781 -0
  565. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +123 -0
  566. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/structures.py +105 -0
  567. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/utils.py +988 -0
  568. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +26 -0
  569. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
  570. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +6 -0
  571. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +119 -0
  572. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +37 -0
  573. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +454 -0
  574. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +149 -0
  575. quarchpy/venv/Lib/site-packages/pip/_vendor/retrying.py +267 -0
  576. quarchpy/venv/Lib/site-packages/pip/_vendor/six.py +982 -0
  577. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/__init__.py +25 -0
  578. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/decoder.py +1057 -0
  579. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/encoder.py +304 -0
  580. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/ordered.py +15 -0
  581. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/tz.py +24 -0
  582. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +85 -0
  583. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +337 -0
  584. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
  585. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +535 -0
  586. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1067 -0
  587. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  588. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
  589. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  590. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
  591. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +396 -0
  592. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
  593. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +121 -0
  594. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +509 -0
  595. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
  596. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
  597. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +313 -0
  598. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
  599. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
  600. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +5 -0
  601. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  602. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
  603. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1021 -0
  604. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +22 -0
  605. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +160 -0
  606. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +536 -0
  607. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/request.py +170 -0
  608. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/response.py +821 -0
  609. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
  610. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +150 -0
  611. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +56 -0
  612. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
  613. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +143 -0
  614. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
  615. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +601 -0
  616. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +474 -0
  617. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
  618. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +268 -0
  619. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +430 -0
  620. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +153 -0
  621. quarchpy/venv/Lib/site-packages/pip/_vendor/vendor.txt +24 -0
  622. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
  623. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/labels.py +231 -0
  624. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
  625. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/tests.py +153 -0
  626. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
  627. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/INSTALLER +1 -0
  628. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/LICENSE.txt +20 -0
  629. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/METADATA +94 -0
  630. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/RECORD +812 -0
  631. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/WHEEL +6 -0
  632. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/entry_points.txt +5 -0
  633. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/top_level.txt +1 -0
  634. quarchpy/venv/Lib/site-packages/pip-20.3.4.virtualenv +0 -0
  635. quarchpy/venv/Lib/site-packages/pkg_resources/__init__.py +3296 -0
  636. quarchpy/venv/Lib/site-packages/pkg_resources/__init__.pyc +0 -0
  637. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/__init__.py +0 -0
  638. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/__init__.pyc +0 -0
  639. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py +608 -0
  640. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.pyc +0 -0
  641. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py +21 -0
  642. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
  643. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py +14 -0
  644. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
  645. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py +30 -0
  646. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
  647. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py +68 -0
  648. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
  649. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py +301 -0
  650. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.pyc +0 -0
  651. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py +127 -0
  652. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
  653. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py +774 -0
  654. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
  655. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py +14 -0
  656. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py +393 -0
  657. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.pyc +0 -0
  658. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py +5742 -0
  659. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.pyc +0 -0
  660. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/six.py +868 -0
  661. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/six.pyc +0 -0
  662. quarchpy/venv/Lib/site-packages/pkg_resources/extern/__init__.py +73 -0
  663. quarchpy/venv/Lib/site-packages/pkg_resources/extern/__init__.pyc +0 -0
  664. quarchpy/venv/Lib/site-packages/pkg_resources/py31compat.py +23 -0
  665. quarchpy/venv/Lib/site-packages/pkg_resources/py31compat.pyc +0 -0
  666. quarchpy/venv/Lib/site-packages/setuptools/__init__.py +245 -0
  667. quarchpy/venv/Lib/site-packages/setuptools/_deprecation_warning.py +7 -0
  668. quarchpy/venv/Lib/site-packages/setuptools/_imp.py +73 -0
  669. quarchpy/venv/Lib/site-packages/setuptools/_vendor/__init__.py +0 -0
  670. quarchpy/venv/Lib/site-packages/setuptools/_vendor/ordered_set.py +488 -0
  671. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py +27 -0
  672. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +26 -0
  673. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py +31 -0
  674. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +68 -0
  675. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +296 -0
  676. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +138 -0
  677. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +749 -0
  678. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +404 -0
  679. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +57 -0
  680. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +420 -0
  681. quarchpy/venv/Lib/site-packages/setuptools/_vendor/pyparsing.py +5742 -0
  682. quarchpy/venv/Lib/site-packages/setuptools/_vendor/six.py +868 -0
  683. quarchpy/venv/Lib/site-packages/setuptools/archive_util.py +173 -0
  684. quarchpy/venv/Lib/site-packages/setuptools/build_meta.py +264 -0
  685. quarchpy/venv/Lib/site-packages/setuptools/cli-32.exe +0 -0
  686. quarchpy/venv/Lib/site-packages/setuptools/cli-64.exe +0 -0
  687. quarchpy/venv/Lib/site-packages/setuptools/cli.exe +0 -0
  688. quarchpy/venv/Lib/site-packages/setuptools/command/__init__.py +17 -0
  689. quarchpy/venv/Lib/site-packages/setuptools/command/alias.py +80 -0
  690. quarchpy/venv/Lib/site-packages/setuptools/command/bdist_egg.py +502 -0
  691. quarchpy/venv/Lib/site-packages/setuptools/command/bdist_rpm.py +43 -0
  692. quarchpy/venv/Lib/site-packages/setuptools/command/bdist_wininst.py +21 -0
  693. quarchpy/venv/Lib/site-packages/setuptools/command/build_clib.py +98 -0
  694. quarchpy/venv/Lib/site-packages/setuptools/command/build_ext.py +327 -0
  695. quarchpy/venv/Lib/site-packages/setuptools/command/build_py.py +270 -0
  696. quarchpy/venv/Lib/site-packages/setuptools/command/develop.py +221 -0
  697. quarchpy/venv/Lib/site-packages/setuptools/command/dist_info.py +36 -0
  698. quarchpy/venv/Lib/site-packages/setuptools/command/easy_install.py +2347 -0
  699. quarchpy/venv/Lib/site-packages/setuptools/command/egg_info.py +717 -0
  700. quarchpy/venv/Lib/site-packages/setuptools/command/install.py +125 -0
  701. quarchpy/venv/Lib/site-packages/setuptools/command/install_egg_info.py +62 -0
  702. quarchpy/venv/Lib/site-packages/setuptools/command/install_lib.py +121 -0
  703. quarchpy/venv/Lib/site-packages/setuptools/command/install_scripts.py +65 -0
  704. quarchpy/venv/Lib/site-packages/setuptools/command/launcher manifest.xml +15 -0
  705. quarchpy/venv/Lib/site-packages/setuptools/command/py36compat.py +136 -0
  706. quarchpy/venv/Lib/site-packages/setuptools/command/register.py +18 -0
  707. quarchpy/venv/Lib/site-packages/setuptools/command/rotate.py +66 -0
  708. quarchpy/venv/Lib/site-packages/setuptools/command/saveopts.py +22 -0
  709. quarchpy/venv/Lib/site-packages/setuptools/command/sdist.py +252 -0
  710. quarchpy/venv/Lib/site-packages/setuptools/command/setopt.py +149 -0
  711. quarchpy/venv/Lib/site-packages/setuptools/command/test.py +279 -0
  712. quarchpy/venv/Lib/site-packages/setuptools/command/upload.py +17 -0
  713. quarchpy/venv/Lib/site-packages/setuptools/command/upload_docs.py +206 -0
  714. quarchpy/venv/Lib/site-packages/setuptools/config.py +659 -0
  715. quarchpy/venv/Lib/site-packages/setuptools/dep_util.py +23 -0
  716. quarchpy/venv/Lib/site-packages/setuptools/depends.py +176 -0
  717. quarchpy/venv/Lib/site-packages/setuptools/dist.py +1274 -0
  718. quarchpy/venv/Lib/site-packages/setuptools/errors.py +16 -0
  719. quarchpy/venv/Lib/site-packages/setuptools/extension.py +57 -0
  720. quarchpy/venv/Lib/site-packages/setuptools/extern/__init__.py +73 -0
  721. quarchpy/venv/Lib/site-packages/setuptools/glob.py +174 -0
  722. quarchpy/venv/Lib/site-packages/setuptools/gui-32.exe +0 -0
  723. quarchpy/venv/Lib/site-packages/setuptools/gui-64.exe +0 -0
  724. quarchpy/venv/Lib/site-packages/setuptools/gui.exe +0 -0
  725. quarchpy/venv/Lib/site-packages/setuptools/installer.py +150 -0
  726. quarchpy/venv/Lib/site-packages/setuptools/launch.py +35 -0
  727. quarchpy/venv/Lib/site-packages/setuptools/lib2to3_ex.py +62 -0
  728. quarchpy/venv/Lib/site-packages/setuptools/monkey.py +179 -0
  729. quarchpy/venv/Lib/site-packages/setuptools/msvc.py +1679 -0
  730. quarchpy/venv/Lib/site-packages/setuptools/namespaces.py +107 -0
  731. quarchpy/venv/Lib/site-packages/setuptools/package_index.py +1136 -0
  732. quarchpy/venv/Lib/site-packages/setuptools/py27compat.py +60 -0
  733. quarchpy/venv/Lib/site-packages/setuptools/py31compat.py +32 -0
  734. quarchpy/venv/Lib/site-packages/setuptools/py33compat.py +59 -0
  735. quarchpy/venv/Lib/site-packages/setuptools/py34compat.py +13 -0
  736. quarchpy/venv/Lib/site-packages/setuptools/sandbox.py +491 -0
  737. quarchpy/venv/Lib/site-packages/setuptools/script (dev).tmpl +6 -0
  738. quarchpy/venv/Lib/site-packages/setuptools/script.tmpl +3 -0
  739. quarchpy/venv/Lib/site-packages/setuptools/site-patch.py +74 -0
  740. quarchpy/venv/Lib/site-packages/setuptools/ssl_support.py +260 -0
  741. quarchpy/venv/Lib/site-packages/setuptools/unicode_utils.py +44 -0
  742. quarchpy/venv/Lib/site-packages/setuptools/version.py +6 -0
  743. quarchpy/venv/Lib/site-packages/setuptools/wheel.py +220 -0
  744. quarchpy/venv/Lib/site-packages/setuptools/windows_support.py +29 -0
  745. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/INSTALLER +1 -0
  746. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/LICENSE +19 -0
  747. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/METADATA +86 -0
  748. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/RECORD +207 -0
  749. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/WHEEL +6 -0
  750. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/dependency_links.txt +2 -0
  751. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/entry_points.txt +69 -0
  752. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/top_level.txt +3 -0
  753. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/zip-safe +1 -0
  754. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.virtualenv +0 -0
  755. quarchpy/venv/Lib/site-packages/wheel/__init__.py +1 -0
  756. quarchpy/venv/Lib/site-packages/wheel/__main__.py +19 -0
  757. quarchpy/venv/Lib/site-packages/wheel/bdist_wheel.py +492 -0
  758. quarchpy/venv/Lib/site-packages/wheel/cli/__init__.py +88 -0
  759. quarchpy/venv/Lib/site-packages/wheel/cli/convert.py +269 -0
  760. quarchpy/venv/Lib/site-packages/wheel/cli/pack.py +82 -0
  761. quarchpy/venv/Lib/site-packages/wheel/cli/unpack.py +25 -0
  762. quarchpy/venv/Lib/site-packages/wheel/macosx_libfile.py +428 -0
  763. quarchpy/venv/Lib/site-packages/wheel/metadata.py +133 -0
  764. quarchpy/venv/Lib/site-packages/wheel/pkginfo.py +43 -0
  765. quarchpy/venv/Lib/site-packages/wheel/util.py +46 -0
  766. quarchpy/venv/Lib/site-packages/wheel/vendored/__init__.py +0 -0
  767. quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/__init__.py +0 -0
  768. quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/_typing.py +48 -0
  769. quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/tags.py +866 -0
  770. quarchpy/venv/Lib/site-packages/wheel/wheelfile.py +181 -0
  771. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/INSTALLER +1 -0
  772. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/LICENSE.txt +22 -0
  773. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/METADATA +69 -0
  774. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/RECORD +49 -0
  775. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/WHEEL +6 -0
  776. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/entry_points.txt +6 -0
  777. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/top_level.txt +1 -0
  778. quarchpy/venv/Lib/site-packages/wheel-0.37.1.virtualenv +0 -0
  779. quarchpy/venv/Lib/site.py +190 -0
  780. quarchpy/venv/Lib/site.pyc +0 -0
  781. quarchpy/venv/Scripts/activate +83 -0
  782. quarchpy/venv/Scripts/activate.bat +39 -0
  783. quarchpy/venv/Scripts/activate.fish +100 -0
  784. quarchpy/venv/Scripts/activate.nu +41 -0
  785. quarchpy/venv/Scripts/activate.ps1 +60 -0
  786. quarchpy/venv/Scripts/activate_this.py +32 -0
  787. quarchpy/venv/Scripts/deactivate.bat +19 -0
  788. quarchpy/venv/Scripts/deactivate.nu +11 -0
  789. quarchpy/venv/Scripts/easy_install-2.7.exe +0 -0
  790. quarchpy/venv/Scripts/easy_install.exe +0 -0
  791. quarchpy/venv/Scripts/easy_install2.7.exe +0 -0
  792. quarchpy/venv/Scripts/easy_install2.exe +0 -0
  793. quarchpy/venv/Scripts/pip-2.7.exe +0 -0
  794. quarchpy/venv/Scripts/pip.exe +0 -0
  795. quarchpy/venv/Scripts/pip2.7.exe +0 -0
  796. quarchpy/venv/Scripts/pip2.exe +0 -0
  797. quarchpy/venv/Scripts/pydoc.bat +1 -0
  798. quarchpy/venv/Scripts/python.exe +0 -0
  799. quarchpy/venv/Scripts/python27.dll +0 -0
  800. quarchpy/venv/Scripts/pythonw.exe +0 -0
  801. quarchpy/venv/Scripts/wheel-2.7.exe +0 -0
  802. quarchpy/venv/Scripts/wheel.exe +0 -0
  803. quarchpy/venv/Scripts/wheel2.7.exe +0 -0
  804. quarchpy/venv/Scripts/wheel2.exe +0 -0
  805. quarchpy/venv/libs/_bsddb.lib +0 -0
  806. quarchpy/venv/libs/_ctypes.lib +0 -0
  807. quarchpy/venv/libs/_ctypes_test.lib +0 -0
  808. quarchpy/venv/libs/_elementtree.lib +0 -0
  809. quarchpy/venv/libs/_hashlib.lib +0 -0
  810. quarchpy/venv/libs/_msi.lib +0 -0
  811. quarchpy/venv/libs/_multiprocessing.lib +0 -0
  812. quarchpy/venv/libs/_socket.lib +0 -0
  813. quarchpy/venv/libs/_sqlite3.lib +0 -0
  814. quarchpy/venv/libs/_ssl.lib +0 -0
  815. quarchpy/venv/libs/_testcapi.lib +0 -0
  816. quarchpy/venv/libs/_tkinter.lib +0 -0
  817. quarchpy/venv/libs/bz2.lib +0 -0
  818. quarchpy/venv/libs/libpython27.a +0 -0
  819. quarchpy/venv/libs/pyexpat.lib +0 -0
  820. quarchpy/venv/libs/python27.lib +0 -0
  821. quarchpy/venv/libs/select.lib +0 -0
  822. quarchpy/venv/libs/unicodedata.lib +0 -0
  823. quarchpy/venv/libs/winsound.lib +0 -0
  824. quarchpy/venv/pyvenv.cfg +8 -0
  825. {quarchpy-2.1.13.dev1.dist-info → quarchpy-2.1.14.dist-info}/METADATA +12 -2
  826. quarchpy-2.1.14.dist-info/RECORD +1216 -0
  827. quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -26
  828. quarchpy/connection_specific/QPS/qps_lib/QuarchCommon-0.2.4.jar +0 -0
  829. quarchpy/connection_specific/connection_QIS.py.bak +0 -1821
  830. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc +0 -0
  831. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc +0 -0
  832. quarchpy/debug/TextScanIP.py +0 -11
  833. quarchpy/device/device.py.bak +0 -504
  834. quarchpy/device/scanDevices.py.bak +0 -661
  835. quarchpy-2.1.13.dev1.dist-info/RECORD +0 -531
  836. {quarchpy-2.1.13.dev1.dist-info → quarchpy-2.1.14.dist-info}/WHEEL +0 -0
  837. {quarchpy-2.1.13.dev1.dist-info → quarchpy-2.1.14.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,4 @@
1
+ import csv
1
2
  import socket
2
3
  import re
3
4
  import time
@@ -9,7 +10,7 @@ import threading
9
10
  import math
10
11
  import logging
11
12
  import struct
12
- from pathlib import Path
13
+ from io import StringIO
13
14
  from quarchpy.user_interface import *
14
15
  import xml.etree.ElementTree as ET
15
16
  from connection_specific.StreamChannels import StreamGroups
@@ -46,13 +47,7 @@ class QisInterface:
46
47
  self.streamSock.settimeout(5)
47
48
  self.streamSock.connect((self.host, self.port))
48
49
  self.pythonVersion = sys.version[0]
49
- #self.sendText(self.streamSock, '$scan')
50
- #time.sleep(3)
51
- if self.pythonVersion == '3':
52
- temp = '>'
53
- self.cursor = temp.encode()
54
- else:
55
- self.cursor = '>'
50
+ self.cursor = '>'
56
51
  #clear packets
57
52
  welcomeString = self.streamSock.recv(self.maxRxBytes).rstrip()
58
53
 
@@ -111,19 +106,15 @@ class QisInterface:
111
106
  def closeConnection(self, sock=None, conString=None):
112
107
  if sock == None:
113
108
  sock = self.sock
114
-
115
109
  if conString is None:
116
110
  cmd="close"
117
111
  else:
118
112
  cmd =conString+" close"
119
113
 
120
- if self.pythonVersion == '3':
121
- response = self.sendAndReceiveText(sock, cmd).decode()
122
- else:
123
- response = self.sendAndReceiveText(sock, cmd)
114
+ response = self.sendAndReceiveText(sock, cmd)
124
115
  return response
125
116
 
126
- def startStream(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration = None):
117
+ def startStream(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration = None, inMemoryData = None):
127
118
  self.StreamRunSentSemaphore.acquire()
128
119
  self.deviceDictSetup('QIS')
129
120
  i = self.deviceMulti(module)
@@ -133,7 +124,7 @@ class QisInterface:
133
124
 
134
125
  # Create the thread
135
126
  t1 = threading.Thread(target=self.startStreamThread, name=module,
136
- args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration))
127
+ args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration, inMemoryData))
137
128
  # Start the thread
138
129
  t1.start()
139
130
 
@@ -163,7 +154,6 @@ class QisInterface:
163
154
  pass
164
155
  # just wait until event is cleared
165
156
 
166
-
167
157
  def stopStream(self, module, blocking = True):
168
158
  moduleName=module.ConString
169
159
  i = self.deviceMulti(moduleName)
@@ -191,15 +181,20 @@ class QisInterface:
191
181
  else:
192
182
  running = False
193
183
  time.sleep(0.1)
194
-
195
- # This is the function that is run when t1 is created. It is run in a seperate thread from
196
- # the main application so streaming can happen without blocking the main application from
197
- # doing other things. Within this function/thread you have to be very careful not to try
198
- # and 'communicate' with anything from other threads. If you do, you MUST use a thread safe
199
- # way of communicating. The thread creates it's own socket and should use that, NOT the objects socket
200
- # (which some of the comms with module functions will use by default).
201
- def startStreamThread(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration = None):
184
+
185
+ def startStreamThread(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration = None, inMemoryData = None):
186
+ # This is the function that is run when t1 is created. It is run in a seperate thread from
187
+ # the main application so streaming can happen without blocking the main application from
188
+ # doing other things. Within this function/thread you have to be very careful not to try
189
+ # and 'communicate' with anything from other threads. If you do, you MUST use a thread safe
190
+ # way of communicating. The thread creates it's own socket and should use that, NOT the objects socket
191
+ # (which some of the comms with module functions will use by default).
192
+
202
193
  #Start module streaming and then read stream data
194
+ if inMemoryData is not None:
195
+ if not isinstance(inMemoryData, StringIO):
196
+ print("Error! The parameter 'inMemoryData' is NOT of type StringIO")
197
+ exit()
203
198
 
204
199
  stripes = ['Empty Header']
205
200
  #Send stream command so module starts streaming data into the backends buffer
@@ -234,6 +229,9 @@ class QisInterface:
234
229
  formatHeader = self.streamHeaderFormat(device=module, sock=self.streamSock)
235
230
  formatHeader = formatHeader.replace(", ", separator)
236
231
  f.write(formatHeader + '\n')
232
+ if inMemoryData is not None:
233
+ inMemoryData.write(formatHeader + '\n')
234
+
237
235
  numStripesPerRead = 4096
238
236
  maxFileExceeded = False
239
237
  openAttempts = 0
@@ -263,23 +261,22 @@ class QisInterface:
263
261
 
264
262
  baseSamplePeriodS = int(re.search('^\d*\.?\d*', baseSamplePeriod).group())*(10**baseSampleUnitExponent)
265
263
 
266
- # TODO: MD Thinks this implements software averaging, is unused and now performed in QIS
267
- if streamAverage != None:
268
- #Matt converting streamAveraging into number
269
- streamAverage = self.convertStreamAverage(streamAverage)
270
-
271
- stripesPerAverage = float(streamAverage) / (float(baseSamplePeriod) * 4e-6)
264
+ # # TODO: MD Thinks this implements software averaging, is unused and now performed in QIS
265
+ # if streamAverage != None:
266
+ # #Matt converting streamAveraging into number
267
+ # streamAverage = self.convertStreamAverage(streamAverage)
268
+ # stripesPerAverage = float(streamAverage) / (float(baseSamplePeriodS) * 4e-6)
272
269
  isRun = True
273
270
  while isRun:
274
271
  try:
275
- with open(fileName, 'ab') as f:
272
+ with open(fileName, 'a', newline='') as f: #changed from ab to a as all data should be in string format now regardless of py2 or py3
276
273
  # Until the event threadRunEvent is set externally to this thread,
277
274
  # loop and read from the stream
278
275
  i = self.deviceMulti(module)
279
276
  while self.stopFlagList[i] and (not streamOverrun) and (not streamComplete):
280
277
  #now = time.time()
281
278
  streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
282
- newStripes = newStripes.replace(b' ', str.encode(separator))
279
+ newStripes = newStripes.replace(' ', separator)
283
280
  #print (time.time() - now)
284
281
  if streamOverrun:
285
282
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun']
@@ -309,22 +306,31 @@ class QisInterface:
309
306
  if streamDuration != None:
310
307
  # Get the last data line in the file
311
308
  lastLine = newStripes.splitlines()[-3] # the last data line is followed by 'eof' and '>'
312
- lastTime = lastLine.decode().split(separator)[0] # get the first (time) entry
309
+ lastTime = lastLine.split(separator)[0] # get the first (time) entry
313
310
 
314
311
  # if the last entry is still within the required stream length, write the whole lot
315
312
  if int(lastTime) < int(streamDuration/(10**baseSampleUnitExponent)): # < rather than <= because we start at 0
313
+ newStripes = newStripes.replace(' ', separator)
316
314
  f.write(newStripes[:removeChar])
315
+ if inMemoryData is not None:
316
+ inMemoryData.write(newStripes[:removeChar])
317
+
317
318
  # else write each line individually until we have reached the desired endpoint
318
319
  else:
319
320
  for thisLine in newStripes.splitlines()[:-2]:
320
- lastTime = thisLine.decode().split(separator)[0]
321
+ lastTime = thisLine.split(separator)[0]
321
322
  if int(lastTime) < int(streamDuration/(10**baseSampleUnitExponent)):
322
- f.write(thisLine + b'\r' + b'\n') # Put the CR back on the end
323
+ f.write(thisLine + '\r\n') # Put the CR back on the end
324
+ if inMemoryData is not None:
325
+ inMemoryData.write(thisLine + '\r\n')
323
326
  else:
324
327
  streamComplete = True
325
328
  break
326
329
  else:
330
+ newStripes = newStripes.replace(' ', separator)
327
331
  f.write(newStripes[:removeChar])
332
+ if inMemoryData is not None:
333
+ inMemoryData.write(newStripes[:removeChar])
328
334
 
329
335
  else:
330
336
  maxFileExceeded = True
@@ -332,6 +338,9 @@ class QisInterface:
332
338
  maxFileStatus = self.streamBufferStatus(device=module, sock=self.streamSock)
333
339
  f.write('Warning: Max file size exceeded before end of stream.\n')
334
340
  f.write('Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.')
341
+ if inMemoryData is not None:
342
+ inMemoryData.write('Warning: Max file size exceeded before end of stream.\n')
343
+ inMemoryData.write('Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.')
335
344
  self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
336
345
  break
337
346
  else:
@@ -379,8 +388,10 @@ class QisInterface:
379
388
  if(streamAverage != None):
380
389
  leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage, newStripes[:removeChar], f, remainingStripes)
381
390
  else:
382
- newStripes = newStripes.replace(b' ', str.encode(separator))
391
+ newStripes = newStripes.replace(' ',separator)
383
392
  f.write(newStripes[:removeChar])
393
+ if inMemoryData is not None:
394
+ inMemoryData.write(newStripes[:removeChar])
384
395
  else:
385
396
  if not maxFileExceeded:
386
397
  maxFileStatus = self.streamBufferStatus(device=module, sock=self.streamSock)
@@ -395,6 +406,9 @@ class QisInterface:
395
406
  if maxFileExceeded:
396
407
  f.write(b'Warning: Max file size exceeded before end of stream.\n')
397
408
  f.write(b'Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.')
409
+ if inMemoryData is not None:
410
+ inMemoryData.write(b'Warning: Max file size exceeded before end of stream.\n')
411
+ inMemoryData.write(b'Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.')
398
412
  logging.warning('Max file size exceeded. Some data has not been saved to file: ' + maxFileStatus + '.')
399
413
 
400
414
  #printText('Stripes in buffer now: ' + self.streamBufferStatus(device=module, sock=self.streamSock))
@@ -466,11 +480,10 @@ class QisInterface:
466
480
  leftover = 0
467
481
  remainingStripes = []
468
482
  streamOverrun = False
469
- if streamAverage != None:
470
- # Matt converting streamAveraging into number
471
- streamAverage = self.convertStreamAverage(streamAverage)
472
-
473
- stripesPerAverage = float(streamAverage) / (float(baseSamplePeriod) * 4e-6)
483
+ # if streamAverage != None:
484
+ # # Matt converting streamAveraging into number
485
+ # streamAverage = self.convertStreamAverage(streamAverage)
486
+ # stripesPerAverage = float(streamAverage) / (float(baseSamplePeriodS) * 4e-6)
474
487
 
475
488
  isRun = True
476
489
 
@@ -486,7 +499,7 @@ class QisInterface:
486
499
  # now = time.time()
487
500
  streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module,
488
501
  numStripesPerRead)
489
- newStripes = newStripes.replace(b' ', str.encode(separator))
502
+ newStripes = newStripes.replace(' ',separator)
490
503
  # print(newStripes)
491
504
  # print(len(newStripes))
492
505
 
@@ -500,11 +513,7 @@ class QisInterface:
500
513
  if isEmpty == False:
501
514
  # Writes in file if not too big else stops streaming
502
515
  # print(newStripes)
503
-
504
- x = newStripes[:removeChar]
505
- y = x.decode("utf-8")
506
-
507
- print("decoded stripe : " + y)
516
+ print("decoded stripe : " + newStripes[:removeChar])
508
517
 
509
518
  # Writing multiple stripes
510
519
  if "\r\n" in y:
@@ -583,7 +592,7 @@ class QisInterface:
583
592
  continue
584
593
  with open(os.path.join(self.qps_record_dir_path, "data000",
585
594
  "data000_00" + index - 1 + "_000000000"),
586
- "ab") as file1:
595
+ "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
587
596
 
588
597
  x = struct.pack(">d", int(item))
589
598
  # logging.debug(item, x)
@@ -606,7 +615,7 @@ class QisInterface:
606
615
 
607
616
  with open(os.path.join(self.qps_record_dir_path, "data000",
608
617
  "data000_"+x+"_000000000"),
609
- "ab") as file1:
618
+ "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
610
619
  x = struct.pack(">d", int(stripe[counter]))
611
620
  # logging.debug(item, x)
612
621
  file1.write(x)
@@ -614,195 +623,10 @@ class QisInterface:
614
623
  # Write all in group 1 to digital
615
624
  with open(os.path.join(self.qps_record_dir_path, "data101",
616
625
  "data101_"+x+"_000000000"),
617
- "ab") as file1:
626
+ "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
618
627
  x = struct.pack(">d", int(stripe[counter]))
619
628
  # logging.debug(item, x)
620
629
  file1.write(x)
621
-
622
-
623
- # Send text and get the backends response. - acts as wrapper to the sendAndReceiveText, intended to provide some extra convenience
624
- # when sending commands to module (as opposed to back end)
625
- # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
626
- # After command is sent wait for betweenCommandDelay which defaults to 0 but can be specified to add a delay between commands
627
- # The objects connection needs to be opened (connect()) before this is used
628
- def sendCmd(self, device='', cmd='$help', sock=None, readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse = True):
629
- if sock==None:
630
- sock = self.sock
631
- if not (device == ''):
632
- self.deviceDictSetup(device)
633
-
634
- if expectedResponse is False:
635
- self.sendText(sock, cmd, device)
636
- return
637
-
638
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
639
- if (betweenCommandDelay > 0):
640
- time.sleep(betweenCommandDelay)
641
- #If ends with cursor get rid of it
642
- if res[-1:] == self.cursor:
643
- res = res[:-3] #remove last three chars - hopefully '\r\n>'
644
- # time.sleep(0.1)
645
- return res.decode()
646
-
647
-
648
- def sendAndReceiveCmd(self, sock=None, cmd='$help', device='', readUntilCursor=True, betweenCommandDelay=0.0):
649
- if sock==None:
650
- sock = self.sock
651
- if not (device == ''):
652
- self.deviceDictSetup(device)
653
- if self.pythonVersion == '3':
654
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor).decode()
655
- else:
656
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
657
- if (betweenCommandDelay > 0):
658
- time.sleep(betweenCommandDelay)
659
- #If ends with cursor get rid of it
660
- if res[-1:] == '>':
661
- res = res[:-3] #remove last three chars - hopefully '\r\n>'
662
- return cmd + ' : ' + res
663
-
664
- # Send text to the back end then read it's response
665
- # The objects connection needs to be opened (connect()) before this is used
666
- # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
667
- def sendAndReceiveText(self, sock, sentText='$help', device='', readUntilCursor=True):
668
- self.sockSemaphore.acquire()
669
- try:
670
- self.sendText(sock, sentText, device)
671
- if self.pythonVersion == '3':
672
- res = bytearray()
673
- res.extend(self.rxBytes(sock))
674
- #Somtimes we just get one cursor back of currently unknown origins
675
- #If that happens discard it and read again
676
- if len(res)==0:
677
- logging.warning("empty response from QIS. Retrying.")
678
- streamResp=self.sendAndReceiveText(sock, "stream?",device,readUntilCursor).lower()
679
- if len(streamResp)==0:
680
- raise("Empty response from QIS twice in a row")
681
- else:
682
- logging.warning("Response recovered Successfully. Continuing.")
683
- res = bytearray()
684
- res.extend(self.rxBytes(sock))
685
- if len(res) == 0:
686
- raise ("empty response from QIS after second ")
687
- if res[0] == self.cursor:
688
- #res[0] = self.rxBytes(sock)
689
- logging.warning('Only Returned Cursor!!!!!')
690
- #If create socked fail (between backend and tcp/ip module)
691
- cba = 'Create Socket Fail'
692
- if cba.encode() == res[0]:
693
- logging.warning(res[0].decode())
694
- cba = 'Connection Timeout'
695
- if cba.encode() == res[0]:
696
- logging.warning(res[0].decode())
697
- #If reading until a cursor comes back then keep reading until a cursor appears or max tries exceeded
698
- if readUntilCursor:
699
- maxReads = 1000
700
- count = 1
701
- #check for cursor at end of read and if not there read again
702
- while res[-1:] != self.cursor:
703
- res.extend(self.rxBytes(sock))
704
- count += 1
705
- if count >= maxReads:
706
- raise Exception(' Count = Error: max reads exceeded before cursor returned')
707
- return res
708
- else:
709
- res = self.rxBytes(sock)
710
- #Somtimes we just get one cursor back of currently unknown origins
711
- #If that happens discard it and read again
712
- if res == self.cursor:
713
- #printText(" CURSOR ONLY")
714
- res = self.rxBytes(sock)
715
- #If create socked fail (between backend and tcp/ip module)
716
- if 'Create Socket Fail' in res:
717
- raise Exception(res)
718
- if 'Connection Timeout' in res:
719
- raise Exception(res)
720
- #If reading until a cursor comes back then keep reading until a cursor appears or max tries exceeded
721
- if readUntilCursor:
722
- maxReads = 1000
723
- count = 1
724
- #check for cursor at end of read and if not there read again
725
- while res[-1:] != self.cursor:
726
- res += self.rxBytes(sock)
727
- count += 1
728
- if count >= maxReads:
729
- raise Exception(' Count = Error: max reads exceeded before cursor returned')
730
- return res
731
-
732
- except Exception as e:
733
- raise e
734
- finally:
735
- self.sockSemaphore.release()
736
-
737
- def rxBytes(self,sock):
738
- #sock.setblocking(0) #make socket non-blocking
739
- #printText('rxBytes')
740
- maxExceptions=10
741
- exceptions=0
742
- maxReadRepeats=50
743
- readRepeats=0
744
- timeout_in_seconds = 10
745
- #Keep trying to read bytes until we get some, unless number of read repeads or exceptions is exceeded
746
- while True:
747
- try:
748
- #select.select returns a list of waitable objects which are ready. On windows it has to be sockets.
749
- #The first arguement is a list of objects to wait for reading, second writing, third 'exceptional condition'
750
- #We only use the read list and our socket to check if it is readable. if no timeout is specified then it blocks until it becomes readable.
751
- ready = select.select([sock], [], [], timeout_in_seconds)
752
- #time.sleep(0.1)
753
- #ready = [1,2]
754
- if ready[0]:
755
- ret = sock.recv(self.maxRxBytes)
756
- #time.sleep(0.1)
757
- return ret
758
- else:
759
- #printText('rxBytes - readRepeats + 1')
760
-
761
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
762
- sock.connect((self.host, self.port))
763
- sock.settimeout(5)
764
-
765
- try:
766
- welcomeString = self.sock.recv(self.maxRxBytes).rstrip()
767
- welcomeString = 'Connected@' + self.host + ':' + str(self.port) + ' ' + '\n ' + welcomeString
768
- printText('New Welcome:' + welcomeString)
769
- except Exception as e:
770
- logging.error('tried and failed to get new welcome')
771
- raise e
772
-
773
- readRepeats=readRepeats+1
774
- time.sleep(0.5)
775
-
776
- except Exception as e:
777
- #printText('rxBytes - exceptions + 1')
778
- exceptions=exceptions+1
779
- time.sleep(0.5)
780
- raise e
781
-
782
- #If read repeats has been exceeded we failed to get any data on this read.
783
- # !!! This is likely to break whatever called us !!!
784
- if readRepeats >= maxReadRepeats:
785
- logging.error('Max read repeats exceeded - returning.')
786
- return 'No data received from QIS'
787
- #If number of exceptions exceeded then give up by exiting
788
- if exceptions >= maxExceptions:
789
- logging.error('Max exceptions exceeded - exiting') #exceptions are probably 10035 non-blocking socket could not complete immediatley
790
- exit()
791
-
792
- # Send text to the back end don't read it's response
793
- # The objects connection needs to be opened (connect()) before this is used
794
- def sendText(self, sock, message='$help', device=''):
795
- if device != '':
796
- specialTimeout = '%500000'
797
- message = device + specialTimeout + ' ' + message
798
- #printText('Sending: "' + message + '" ' + self.host + ':' + str(self.port))
799
-
800
- if self.pythonVersion == 2:
801
- sock.sendall(message + '\r\n')
802
- else:
803
- convM = message + '\r\n'
804
- sock.sendall(convM.encode('utf-8'))
805
- return 'Sent:' + message
806
630
 
807
631
  # Query the backend for a list of connected modules. A $scan command is sent to refresh the list of devices,
808
632
  # Then a wait occurs while the backend discovers devices (network ones can take a while) and then a list of device name strings is returned
@@ -811,21 +635,9 @@ class QisInterface:
811
635
 
812
636
  if sock == None:
813
637
  sock = self.sock
814
- scanWait = 2
815
- #printText('Scanning for devices and waiting ' + str(scanWait) + ' seconds.')
816
- if self.pythonVersion == '3':
817
- #devString = self.sendAndReceiveText(sock, '$scan').decode
818
- #time.sleep(scanWait)
819
- devString = self.sendAndReceiveText(sock, '$list').decode()
820
- else:
821
- #devString = self.sendAndReceiveText(sock, '$scan')
822
- #time.sleep(scanWait)
823
- devString = self.sendAndReceiveText(sock, '$list')
824
-
638
+ devString = self.sendAndReceiveText(sock, '$list')
825
639
  devString = devString.replace('>', '')
826
- devString = devString.replace(r'\d+\) ', '')
827
-
828
- #printText('"' + devString + '"')
640
+ devString = devString.replace(r'\d+\) ', '')
829
641
  devString = devString.split('\r\n')
830
642
  devString = filter(None, devString) #remove empty elements
831
643
  return devString
@@ -833,21 +645,10 @@ class QisInterface:
833
645
  def get_list_details(self, sock=None):
834
646
  if sock == None:
835
647
  sock = self.sock
836
- scanWait = 2
837
- # printText('Scanning for devices and waiting ' + str(scanWait) + ' seconds.')
838
- if self.pythonVersion == '3':
839
- # devString = self.sendAndReceiveText(sock, '$scan').decode
840
- # time.sleep(scanWait)
841
- devString = self.sendAndReceiveText(sock, '$list details').decode()
842
- else:
843
- # devString = self.sendAndReceiveText(sock, '$scan')
844
- # time.sleep(scanWait)
845
- devString = self.sendAndReceiveText(sock, '$list details')
846
648
 
649
+ devString = self.sendAndReceiveText(sock, '$list details')
847
650
  devString = devString.replace('>', '')
848
651
  devString = devString.replace(r'\d+\) ', '')
849
-
850
- # printText('"' + devString + '"')
851
652
  devString = devString.split('\r\n')
852
653
  devString = [x for x in devString if x] # remove empty elements
853
654
  return devString
@@ -886,9 +687,6 @@ class QisInterface:
886
687
  logging.warning(e)
887
688
  logging.warning("No module found at " + ipAddress)
888
689
 
889
-
890
-
891
-
892
690
  def GetQisModuleSelection(self, favouriteOnly=True , additionalOptions=['rescan', 'all con types', 'ip scan'], scan=True):
893
691
  tableHeaders =["Modules"]
894
692
  ip_address = None
@@ -924,33 +722,19 @@ class QisInterface:
924
722
  foundDevices = "1"
925
723
  foundDevices2 = "2" # this is used to check if new modules are being discovered or if all have been found.
926
724
  scanWait = 2 # The number of seconds waited between the two scans.
927
- if self.pythonVersion == '3':
928
- if scan:
929
- if ipAddress == None:
930
- devString = self.sendAndReceiveText(self.sock, '$scan').decode
931
- else:
932
- devString = self.sendAndReceiveText(self.sock, '$scan TCP::' + ipAddress).decode
933
- time.sleep(scanWait)
934
- while foundDevices not in foundDevices2:
935
- foundDevices = self.sendAndReceiveText(self.sock, '$list').decode()
936
- time.sleep(scanWait)
937
- foundDevices2 = self.sendAndReceiveText(self.sock, '$list').decode()
938
- else:
939
- foundDevices = self.sendAndReceiveText(self.sock, '$list').decode()
940
725
 
941
- else:
942
- if scan:
943
- if ipAddress == None:
944
- devString = self.sendAndReceiveText(self.sock, '$scan').decode
945
- else:
946
- devString = self.sendAndReceiveText(self.sock, '$scan TCP::' + ipAddress).decode
947
- time.sleep(scanWait)
948
- while foundDevices not in foundDevices2:
949
- foundDevices = self.sendAndReceiveText(self.sock, '$list')
950
- time.sleep(scanWait)
951
- foundDevices2 = self.sendAndReceiveText(self.sock, '$list')
726
+ if scan:
727
+ if ipAddress == None:
728
+ devString = self.sendAndReceiveText(self.sock, '$scan')
952
729
  else:
730
+ devString = self.sendAndReceiveText(self.sock, '$scan TCP::' + ipAddress)
731
+ time.sleep(scanWait)
732
+ while foundDevices not in foundDevices2:
953
733
  foundDevices = self.sendAndReceiveText(self.sock, '$list')
734
+ time.sleep(scanWait)
735
+ foundDevices2 = self.sendAndReceiveText(self.sock, '$list')
736
+ else:
737
+ foundDevices = self.sendAndReceiveText(self.sock, '$list')
954
738
 
955
739
  if not "no devices found" in foundDevices.lower():
956
740
  foundDevices = foundDevices.replace('>', '')
@@ -1000,10 +784,7 @@ class QisInterface:
1000
784
  if sock == None:
1001
785
  sock = self.sock
1002
786
  index = 0 # index of relevant line in split string
1003
- if self.pythonVersion == '3':
1004
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device).decode()
1005
- else:
1006
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
787
+ streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
1007
788
  streamStatus = streamStatus.split('\r\n')
1008
789
  streamStatus[index] = re.sub(r':', '', streamStatus[index]) #remove :
1009
790
  return streamStatus[index]
@@ -1014,10 +795,7 @@ class QisInterface:
1014
795
  if sock == None:
1015
796
  sock = self.sock
1016
797
  index = 1 # index of relevant line in split string
1017
- if self.pythonVersion == '3':
1018
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device).decode()
1019
- else:
1020
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
798
+ streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
1021
799
  streamStatus = streamStatus.split('\r\n')
1022
800
  streamStatus[index] = re.sub(r'^Stripes Buffered: ', '', streamStatus[index])
1023
801
  return streamStatus[index]
@@ -1032,10 +810,7 @@ class QisInterface:
1032
810
  if sock == None:
1033
811
  sock = self.sock
1034
812
  index = 2 # index of relevant line in split string
1035
- if self.pythonVersion == '3':
1036
- streamStatus = self.sendAndReceiveText(sock, sentText='stream text header', device=device).decode()
1037
- else:
1038
- streamStatus = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
813
+ streamStatus = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
1039
814
 
1040
815
  self.qps_stream_header = streamStatus
1041
816
 
@@ -1076,10 +851,7 @@ class QisInterface:
1076
851
  if sock == None:
1077
852
  sock = self.sock
1078
853
  index = 0 # index of relevant line in split string
1079
- if self.pythonVersion == '3':
1080
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device).decode()
1081
- else:
1082
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
854
+ streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
1083
855
  streamStatus = streamStatus.split('\r\n')
1084
856
  if 'Header Not Available' in streamStatus[0]:
1085
857
  str = streamStatus[0] + '. Check stream has been ran on device.'
@@ -1106,10 +878,7 @@ class QisInterface:
1106
878
  if sock == None:
1107
879
  sock = self.sock
1108
880
  index = 1 # index of relevant line in split string STREAM MODE HEADER [?|V1,V2,V3]
1109
- if self.pythonVersion == '3':
1110
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device).decode()
1111
- else:
1112
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
881
+ streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
1113
882
  # Check if this is a new XML form header
1114
883
  if (self.isXmlHeader (streamStatus)):
1115
884
  # Get the basic averaging rate (V3 header)
@@ -1144,12 +913,8 @@ class QisInterface:
1144
913
  str = streamStatus[0] + '. Check stream has been ran on device.'
1145
914
  logging.error(str)
1146
915
  return str
1147
- if self.pythonVersion == '3':
1148
- outputMode = self.sendAndReceiveText(sock,'Config Output Mode?', device).decode()
1149
- powerMode = self.sendAndReceiveText(sock,'stream mode power?', device).decode()
1150
- else:
1151
- outputMode = self.sendAndReceiveText(sock,'Config Output Mode?', device)
1152
- powerMode = self.sendAndReceiveText(sock,'stream mode power?', device)
916
+ outputMode = self.sendAndReceiveText(sock,'Config Output Mode?', device)
917
+ powerMode = self.sendAndReceiveText(sock,'stream mode power?', device)
1153
918
  format = int(re.sub(r'^Format: ', '', streamStatus[index]))
1154
919
  b0 = 1 #12V_I
1155
920
  b1 = 1 << 1 #12V_V
@@ -1190,10 +955,7 @@ class QisInterface:
1190
955
  bufferStatus = False
1191
956
  # Allows the status check to be skipped when emptying the buffer after streaming has stopped (saving time)
1192
957
  if (skipStatusCheck == False):
1193
- if self.pythonVersion == '3':
1194
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device).decode()
1195
- else:
1196
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
958
+ streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
1197
959
  if ('Overrun' in streamStatus) or ('8388608 of 8388608' in streamStatus):
1198
960
  bufferStatus = True
1199
961
  stripes = self.sendAndReceiveText(sock, 'stream text all', device, readUntilCursor=True)
@@ -1201,11 +963,7 @@ class QisInterface:
1201
963
  if stripes[-1:] != self.cursor:
1202
964
  return "Error no cursor returned."
1203
965
  else:
1204
- if self.pythonVersion == '3':
1205
- endOfFile = 'eof\r\n>'
1206
- genEndOfFile = endOfFile.encode()
1207
- else:
1208
- genEndOfFile = 'eof\r\n>'
966
+ genEndOfFile = 'eof\r\n>'
1209
967
  if stripes[-6:] == genEndOfFile:
1210
968
  removeChar = -6
1211
969
  else:
@@ -1266,8 +1024,6 @@ class QisInterface:
1266
1024
  finalAverage = splitList[0:2] + [str(round(x / streamAverage)) for x in runningAverage]
1267
1025
  for counter in xrange(len(finalAverage)-1):
1268
1026
  finalAverage[counter] = finalAverage[counter] + ' '
1269
- if self.pythonVersion == '3':
1270
- finalAverage = finalAverage.encode
1271
1027
  for x in finalAverage:
1272
1028
  f.write(x)
1273
1029
  f.write('\r\n')
@@ -1352,10 +1108,7 @@ class QisInterface:
1352
1108
  sock = self.sock
1353
1109
 
1354
1110
  # Get the raw data
1355
- if self.pythonVersion == '3':
1356
- headerData = self.sendAndReceiveText(sock, sentText='stream text header', device=device).decode()
1357
- else:
1358
- headerData = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
1111
+ headerData = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
1359
1112
 
1360
1113
  # The XML can contain the cursor on the end! Trap and remove it here TODO: Needs fixed in the command layer above
1361
1114
  if ('\r\n>' in headerData):
@@ -1482,10 +1235,10 @@ class QisInterface:
1482
1235
  folder_name = None
1483
1236
  # Checking if there was a directory passed; and if it's a valid directory
1484
1237
  if not directory:
1485
- directory = os.path.join(str(Path.home()), "AppData", "Local", "Quarch", "QPS", "Recordings")
1238
+ directory = os.path.join(os.path.expanduser("~"), "AppData", "Local", "Quarch", "QPS", "Recordings")
1486
1239
  logging.debug("No directory specified")
1487
1240
  elif not os.path.isdir(directory):
1488
- new_dir = os.path.join(str(Path.home()), "AppData", "Local", "Quarch", "QPS", "Recordings")
1241
+ new_dir = os.path.join(str(os.path.expanduser("~"), "AppData", "Local", "Quarch", "QPS", "Recordings"))
1489
1242
  logging.warning(directory+" was not a valid directory, streaming to default location: \n"+new_dir)
1490
1243
  directory = new_dir
1491
1244
  else:
@@ -1810,6 +1563,168 @@ class QisInterface:
1810
1563
  f.write("Saved: "+x+ "\n")
1811
1564
 
1812
1565
 
1566
+ # when sending commands to module (as opposed to back end)
1567
+ # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
1568
+ # After command is sent wait for betweenCommandDelay which defaults to 0 but can be specified to add a delay between commands
1569
+ # The objects connection needs to be opened (connect()) before this is used
1570
+ def sendCmd(self, device='', cmd='$help', sock=None, readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse = True):
1571
+ '''Send command is used to send a command to QIS and as far as I can see it has no difference than sendAndReceiveCmd'''
1572
+ if expectedResponse is True:
1573
+ res = self.sendAndReceiveCmd(device=device, cmd=cmd, sock=sock, readUntilCursor=readUntilCursor, betweenCommandDelay=betweenCommandDelay)
1574
+ #If ends with cursor get rid of it
1575
+ if res[-1:] == self.cursor:
1576
+ res = res[:-3] #remove last three chars - hopefully '\r\n>'
1577
+ return res
1578
+ else :
1579
+ self.sendText(sock, cmd, device)
1580
+ return
1581
+
1582
+ def sendAndReceiveCmd(self, sock=None, cmd='$help', device='', readUntilCursor=True, betweenCommandDelay=0.0):
1583
+ if sock==None:
1584
+ sock = self.sock
1585
+ if not (device == ''):
1586
+ self.deviceDictSetup(device)
1587
+ res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
1588
+ if (betweenCommandDelay > 0):
1589
+ time.sleep(betweenCommandDelay)
1590
+ #If ends with cursor get rid of it
1591
+ if res[-1:] == '>':
1592
+ res = res[:-3] #remove last three chars - hopefully '\r\n>'
1593
+ return cmd + ' : ' + res
1594
+
1595
+ def sendAndReceiveText(self, sock, sentText='$help', device='', readUntilCursor=True):
1596
+ # Send text to QIS
1597
+ # The objects connection needs to be opened (connect()) before this is used
1598
+ # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
1599
+
1600
+ # do sendText
1601
+ self.sockSemaphore.acquire()
1602
+ try:
1603
+ #Send Text
1604
+ self.sendText(sock, sentText, device)
1605
+ #Receive Response
1606
+ res = self.receiveText(sock)
1607
+ # Error Check / validate response
1608
+ if len(res) == 0:
1609
+ #logging.error("Empty response from QIS.")
1610
+ self.sendText(sock, "stream?", device)
1611
+ res = self.receiveText(sock)
1612
+ if len(res) != 0:
1613
+ self.sendText(sock, sentText, device)
1614
+ res = self.receiveText(sock)
1615
+ if len(res) == 0:
1616
+ raise (Exception("Empty response from QIS. Sent: " + sentText))
1617
+ else:
1618
+ raise (Exception("Empty response from QIS. Sent: " + sentText))
1619
+
1620
+ if res[0] == self.cursor:
1621
+ logging.warning('Only Returned Cursor!!!!!')
1622
+ if 'Create Socket Fail' == res[0]: # If create socked fail (between QIS and tcp/ip module)
1623
+ logging.warning(res[0])
1624
+ if 'Connection Timeout' == res[0]:
1625
+ logging.warning(res[0])
1626
+ # If reading until a cursor comes back then keep reading until a cursor appears or max tries exceeded
1627
+ if readUntilCursor:
1628
+ maxReads = 1000
1629
+ count = 1
1630
+ # check for cursor at end of read and if not there read again
1631
+ while res[-1:] != self.cursor:
1632
+ res+= self.receiveText(sock) #TODO Confirm this works with multi response CMD Like a $get stats on a large stream with many annos. test with py2 and py3
1633
+ #res.extend(self.rxBytes(sock))
1634
+ count += 1
1635
+ if count >= maxReads:
1636
+ raise Exception(' Count = Error: max reads exceeded before cursor returned')
1637
+ return res
1638
+
1639
+ except Exception as e:
1640
+ #something went wrong during send qis cmd
1641
+ logging.error(e)
1642
+ raise e
1643
+ finally:
1644
+ self.sockSemaphore.release()
1645
+
1646
+
1647
+ def receiveText(self, sock):
1648
+ if self.pythonVersion == '3':
1649
+ res = bytearray()
1650
+ res.extend(self.rxBytes(sock))
1651
+ res = res.decode()
1652
+ else:
1653
+ res = self.rxBytes(sock)
1654
+ return res
1655
+
1656
+ def sendText(self, sock, message='$help', device=''):
1657
+ # Send text to QIS, don't read it's response
1658
+ # The objects connection needs to be opened (connect()) before this is used
1659
+ if device != '':
1660
+ #specialTimeout = '%500000'
1661
+ #message = device + ' ' + specialTimeout + ' ' + message
1662
+ message = device + ' ' + message
1663
+ #printText('Sending: "' + message + '" ' + self.host + ':' + str(self.port))
1664
+
1665
+ if self.pythonVersion == 2:
1666
+ sock.sendall(message + '\r\n')
1667
+ else:
1668
+ convM = message + '\r\n'
1669
+ sock.sendall(convM.encode('utf-8'))
1670
+ return 'Sent:' + message
1671
+
1672
+ def rxBytes(self,sock):
1673
+ #sock.setblocking(0) #make socket non-blocking
1674
+ #printText('rxBytes')
1675
+ maxExceptions=10
1676
+ exceptions=0
1677
+ maxReadRepeats=50
1678
+ readRepeats=0
1679
+ timeout_in_seconds = 10
1680
+ #Keep trying to read bytes until we get some, unless number of read repeads or exceptions is exceeded
1681
+ while True:
1682
+ try:
1683
+ #select.select returns a list of waitable objects which are ready. On windows it has to be sockets.
1684
+ #The first arguement is a list of objects to wait for reading, second writing, third 'exceptional condition'
1685
+ #We only use the read list and our socket to check if it is readable. if no timeout is specified then it blocks until it becomes readable.
1686
+ ready = select.select([sock], [], [], timeout_in_seconds)
1687
+ #time.sleep(0.1)
1688
+ #ready = [1,2]
1689
+ if ready[0]:
1690
+ ret = sock.recv(self.maxRxBytes)
1691
+ #time.sleep(0.1)
1692
+ return ret
1693
+ else:
1694
+ #printText('rxBytes - readRepeats + 1')
1695
+
1696
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1697
+ sock.connect((self.host, self.port))
1698
+ sock.settimeout(5)
1699
+
1700
+ try:
1701
+ welcomeString = self.sock.recv(self.maxRxBytes).rstrip()
1702
+ welcomeString = 'Connected@' + self.host + ':' + str(self.port) + ' ' + '\n ' + welcomeString
1703
+ printText('New Welcome:' + welcomeString)
1704
+ except Exception as e:
1705
+ logging.error('tried and failed to get new welcome')
1706
+ raise e
1707
+
1708
+ readRepeats=readRepeats+1
1709
+ time.sleep(0.5)
1710
+
1711
+ except Exception as e:
1712
+ #printText('rxBytes - exceptions + 1')
1713
+ exceptions=exceptions+1
1714
+ time.sleep(0.5)
1715
+ raise e
1716
+
1717
+ #If read repeats has been exceeded we failed to get any data on this read.
1718
+ # !!! This is likely to break whatever called us !!!
1719
+ if readRepeats >= maxReadRepeats:
1720
+ logging.error('Max read repeats exceeded - returning.')
1721
+ return 'No data received from QIS'
1722
+ #If number of exceptions exceeded then give up by exiting
1723
+ if exceptions >= maxExceptions:
1724
+ logging.error('Max exceptions exceeded - exiting') #exceptions are probably 10035 non-blocking socket could not complete immediatley
1725
+ exit()
1726
+
1727
+
1813
1728
  def strToBb(string_in, add_length=True):
1814
1729
  length = len(str(string_in))
1815
1730
  b_array = []